Dans le petit monde des « Bad USB » j’ai voulu testé une version basée sur un chipset Arduino :

Le principe de base reste le même que pour la célèbre Rubber Ducky : la clef USB est en réalité un périphérique USB de type HID (Human Interface Device), un clavier, qui une fois reconnu par le système envoie la séquence de frappes clavier prévue par le script de l’attaquant.
Le script peut être tout et n’importe quoi, d’un simple Hello World , au vol de clé Wifi en passant par la récupération des mots de passe Windows via Mimikatz.
En pratique cela se passe comment ?
Il est nécessaire de disposer de l’IDE Arduino, au moment des tests je disposais de la version 1.8.5.

Ensuite il faut configurer l’IDE pour lui indiquer qu’il s’agit d’une carte de type Arduino Leonardo.

Pour le script, rien de très compliqué.
Ci-joint un petit exemple pour Windows dont le but est de télécharger une image sur Internet puis de l’afficher à l’écran :
#include "Keyboard.h"
#include "Mouse.h"
void typeKey(int key)
{
Keyboard.press(key);
delay(100);
Keyboard.release(key);
}
/* Init function */
void setup()
{
// Begining the Keyboard stream
Keyboard.begin();
// Wait 500ms
delay(5000);
Keyboard.press(KEY_LEFT_GUI);
Keyboard.releaseAll();
delay(200);
Keyboard.print("powershell");
delay(1500);
typeKey(KEY_RETURN);
delay(1000);
Keyboard.print("$client = new-object System.Net.WebClient");
typeKey(KEY_RETURN);
delay(150);
Keyboard.print("$client.DownloadFile('https://cdn.pixabay.com/photo/2018/05/07/10/48/husky-3380548_960_720.jpg','C:/Temp/cat.jpg')");
typeKey(KEY_RETURN);
delay(150);
//Keyboard.print("gci -Path 'C:/Temp/' -Filter 'cat.jpg' | ii ; exit");
Keyboard.print("gci -Path 'C:/Temp/' -Filter 'cat.jpg'");
typeKey(KEY_RETURN);
delay(150);
Keyboard.print("ii 'C:/Temp/cat.jpg','C:/Temp/cat.jpg' ; exit ");
delay(150);
typeKey(KEY_RETURN);
//Keyboard.press(KEY_MENU);
// Ending stream
Keyboard.end();
}
/* Unused endless loop */
void loop() {}
Ensuite il n’y a plus qu’à envoyer le script, que dis-je téléverser le script, dans la clef USB :


Et le tour est joué ! Le script se déclenche automatiquement (un peu comme un autorun même si cela n’a strictement rien à voir) :

et voila le résultat 🙂

Petit souci que j’ai rencontré : de base le mapping des touches est prévue pour un clavier QWERTY…Donc autant dire que la première fois le script a fait n’importe quoi.
En cherchant un peu j’ai localisé le coupable : il s ‘agit du fichier Keyboard.cpp dans Arduino. Il suffit soit de l’adapter, soit de trouver une version pour AZERTY toute faite sur Internet.
La modification porte sur le tableau _asciimap, ci-joint une version pour claviers AZERTY :
const uint8_t _asciimap[128] =
{
0x00, // NUL
0x00, // SOH
0x00, // STX
0x00, // ETX
0x00, // EOT
0x00, // ENQ
0x00, // ACK
0x00, // BEL
0x2a, // BS Backspace
0x2b, // TAB Tab
0x28, // LF Enter
0x00, // VT
0x00, // FF
0x00, // CR
0x00, // SO
0x00, // SI
0x00, // DEL
0x00, // DC1
0x00, // DC2
0x00, // DC3
0x00, // DC4
0x00, // NAK
0x00, // SYN
0x00, // ETB
0x00, // CAN
0x00, // EM
0x00, // SUB
0x00, // ESC
0x00, // FS
0x00, // GS
0x00, // RS
0x00, // US
0x2c, // ' '
0x38, // !
0x20, // "
0x20, // # :TODO
0x30, // $
0x34|SHIFT, // %
0x1E, // &
0x21, // '
0x22, // (
0x2d, // )
0x31, // * : done
0x2e|SHIFT, // +
0x10, // ,
0x23, // -
0x36|SHIFT, // .
0x37|SHIFT, // /
0x27|SHIFT, // 0
0x1e|SHIFT, // 1
0x1f|SHIFT, // 2
0x20|SHIFT, // 3
0x21|SHIFT, // 4
0x22|SHIFT, // 5
0x23|SHIFT, // 6
0x24|SHIFT, // 7
0x25|SHIFT, // 8
0x26|SHIFT, // 9
0x37, // :
0x36, // ;
0x64, // < Done 0x2e, // = 0x64|SHIFT, // > Done
0x10|SHIFT, // ? 0x38 -> 0x10 OK
0x1f, // @ TODO
0x14|SHIFT, // A
0x05|SHIFT, // B
0x06|SHIFT, // C
0x07|SHIFT, // D
0x08|SHIFT, // E
0x09|SHIFT, // F
0x0a|SHIFT, // G
0x0b|SHIFT, // H
0x0c|SHIFT, // I
0x0d|SHIFT, // J
0x0e|SHIFT, // K
0x0f|SHIFT, // L
0x33|SHIFT, // M
0x11|SHIFT, // N
0x12|SHIFT, // O
0x13|SHIFT, // P
0x04|SHIFT, // Q
0x15|SHIFT, // R
0x16|SHIFT, // S
0x17|SHIFT, // T
0x18|SHIFT, // U
0x19|SHIFT, // V
0x1d|SHIFT, // W
0x1b|SHIFT, // X
0x1c|SHIFT, // Y
0x1a|SHIFT, // Z
0x0c, // [ TODO 2F
0x31, // bslash
0x0d, // ] TODO 30
0x2F, // ^
0x25, // _
0x35, // ` TODO
0x14, // a
0x05, // b
0x06, // c
0x07, // d
0x08, // e
0x09, // f
0x0a, // g
0x0b, // h
0x0c, // i
0x0d, // j
0x0e, // k
0x0f, // l
0x33, // m
0x11, // n
0x12, // o
0x13, // p
0x04, // q
0x15, // r
0x16, // s
0x17, // t
0x18, // u
0x19, // v
0x1d, // w
0x1b, // x
0x1c, // y
0x1a, // z
0x2f|SHIFT, //
0x31|SHIFT, // | TODO
0x30|SHIFT, // } TODO
0x35|SHIFT, // ~ TODO
0 // DEL
};
Ensuite libre cours à votre imagination !