ÉlectroniqueInformatiqueRaspberry

Réaliser une clé USB Rubber Ducky sur Raspberry Pi

Tu branches cette jolie clé, t’attends 30 secondes et tu l’enlèves. Elle va dénicher tous les mots de passe en cache et les informations du domaine et les sauvegardera. – Mobley (Mr Robot)

Bonjour à tous et bienvenue sur ce tutoriel dans lequel je vais vous montrer comment créer une Rubber Ducky avec un Raspberry Pi possédant un module WiFi. Il y a quelques mois j’ai réalisé une vidéo de démonstration de cet outil sur ma chaîne YouTube ZEF LAB et vous avez été nombreux à me demander un tutoriel là-dessus.

 

En bref

Pour ceux qui ne savent pas ce qu’est une Rubber Ducky et qui n’ont pas vu ma vidéo de démonstration : une Rubber Ducky est une clé USB qui va se faire passer pour un clavier auprès du système. Cela va permettre à la clé d’effectuer un certain nombre d’actions définies lorsqu’elle va être branchée à une machine. Elle va donc pouvoir simuler les actions d’un utilisateur.

Ci-dessus : Une "vraie" clé Rubber Ducky (sans son boitier) plantée dans un ordinateur.
Ci-dessus : Une “vraie” clé Rubber Ducky (sans son boitier) plantée dans un ordinateur.

 

Cette technologie est sans limite car on peut effectuer une infinité d’actions : téléchargements et installations de fichiers, récupérations de données, exécution de script, accès au terminal… Bref aucune limite sans avoir à toucher le clavier.

Aucune limite si ce n’est la légalité. Je réalise ce tutoriel dans un but pédagogique. Ce que vous faites de votre Rubber Ducky ne regarde que vous. Ni moi, ni Bidouille2Geek.fr, ne sommes responsables de vos actions et nous n’incitons personne à utiliser ce dispositif à des fins malhonnêtes.

Une “vraie” clé USB Rubber Ducky coûte 45$ (frais de port non compris) sur le site officiel Hak5. Notre clé à nous, basée sur un Raspberry Pi Zero W, ne nous coûtera pas plus d’une dizaine d’euros.

Une Rubber Ducky sur Raspberry Pi … (quasi) impossible ?

Quand j’ai voulu créer ma première Rubber Ducky sous Raspberry Pi ce fut un échec assez cuisant. Si vous faites des recherches (peut-être que c’est ce que vous avez fait avant d’arriver ici) et bien vous avez probablement remarqué que la quasi-totalité des tutoriels qui ressortent ne fonctionnent plus.

La plupart de ces anciens tutoriels se basaient sur une faille du kernel de Raspbian. Cependant elle a été rapidement patchée et quand on tente de faire un downgrade vers la version avec la faille et bien le Pi se bloque complètement lors du boot.

Du coup, après des heures de recherches et de tentatives, j’étais sur le point de jeter l’éponge jusqu’au moment où je me suis souvenu d’une image disque modifiée de Raspbian qui permettait d’utiliser un tas d’outil comme la création de porte dérobée, du bruteforce sur des mots de passe et encore bien d’autres, le nom de cette image c’est : P4wnP1

Ci-dessus : Le répo GitHub de P4wnP1
Ci-dessus : Le répo GitHub de P4wnP1

 

P4wnPi est une image disque basée sur Raspbian Jessie Lite (aka Raspbian en ligne de commandes) sauf que l’image a été modifiée pour permettre l’utilisation de ducky script, la création de portes dérobées comme dit plus haut et encore pleins d’autres choses.

Depuis ma démonstration, P4wnPi A.L.O.A a succédé à la version basique de P4wnPi mais n’ayant pas testé A.L.O.A, mon tutoriel sera basé sur l’ancienne image de P4wnPi (qui fera largement l’affaire pour la création d’une rubber ducky).

Matériels nécessaires

Sans surprise … un Raspberry Pi, n’importe lequel du moment qu’il possède un module wifi intégré. C’est très important. De mon côté ce sera un Pi Zero W :

Ci-dessus : Mon raspberry Pi Zero W (un peu pimpé avec son radiateur et son boitier).
Ci-dessus : Mon raspberry Pi Zero W (un peu pimpé avec son radiateur et son boitier).

 

Il vous faudra une carte micro SD. Je vous recommande au minimum 8 GO mais il semble que ça devrait également fonctionner avec 4 GO.

Ci-dessus : Une carte micro SD de 16 GO
Ci-dessus : Une carte micro SD de 16 GO

 

Il vous faudra également un câble d’alimentation micro USB mais attention, très important, il faut que ce câble permette le transfert de données. Pour ceux qui ne le saurait pas, des câbles USB vers micro-USB, il en existe deux types : Les câbles permettant la charge et ceux permettant la charge ET le transfert de données. Visuellement, il est impossible de les différencier. Tout dépend de la provenance de votre câble. Généralement un câble USB vers Micro-USB issu d’une caméra, appareil photo, téléphone, baladeur, etc. devrait faire l’affaire.

Ci-dessus : Un câble d'alimentation USB vers micro USB.
Ci-dessus : Un câble d’alimentation USB vers micro USB.

 

 

Place au tutoriel

 

1- Téléchargement du système d’exploitation

On va commencer ce tutoriel par récupérer l’image de P4wnP1. Elle est accessible sur GitHub à cette adresse. Une fois sur la page, vous pouvez télécharger le fichier zip au bas de la page :

L’image fait environ 1 GO (1020MB).
L’image fait environ 1 GO (1020MB).

 

2- Installation de l’image

Une fois téléchargée, vous pouvez télécharger et installer le logiciel Etcher depuis son site officiel. Il nous permettra simplement d’installer l’image de P4wnP1 sur la carte micro SD :

Etcher est développé par Balena.
Etcher est développé par Balena.

 

L’installation du logiciel étant ultra simple, je vais vous l’épargner. Lancez simplement l’installeur de Etcher et suivez les étapes. Une fois installé, lancez le logiciel Etcher et laissez-le ouvert pour le moment. Cependant, vous pouvez retrouver un tutoriel complet à son sujet ici.

On va maintenant s’occuper de l’image de P4wnP1 qui se trouve dans l’archive ZIP qu’on a téléchargé. Nous devons donc sortir l’image de l’archive ZIP. Pour faire ça, vous pouvez utiliser le logiciel de votre choix, le gestionnaire d’archive Windows fera l’affaire (pour moi ça sera WINRAR comme d’habitude. Vous pouvez aussi utiliser 7zip, qui est gratuit, opensource et sans publicités.).

Une fois l'archive ouverte, sortez simplement le fichier .img.
Une fois l’archive ouverte, sortez simplement le fichier .img.

 

 

Une fois l’image sortie du répertoire ZIP, on peut retourner sur Etcher. On sélectionne l’image de P4wnP1 grâce à l’explorateur en cliquant sur “select image” dans la première étape :

 

Une fois l’image sélectionnée, on peut passer à la deuxième étape. Vous pouvez donc insérer la carte micro SD dans votre ordinateur. La carte devrait automatiquement apparaître dans la seconde étape. Si ce n’est pas le cas, sélectionnez manuellement la carte :

On peut voir l'image de P4wnP1 dans la première étape et la carte SD dans la deuxième étape. On est prêt pour l'écriture !
On peut voir l’image de P4wnP1 dans la première étape et la carte SD dans la deuxième étape. On est prêt pour l’écriture !

 

Vérifiez que tout soit bon, puis lancer le processus d’écriture en cliquant sur Flash!

Vous pouvez suivre l’avancement dans la partie droite de Etcher. Après quelques minutes, l’image de P4wnP1 est prête comme l’indique le message de confirmation :

 

3- Lancement du Raspberry

Vous pouvez maintenant éjecter la carte micro SD de votre ordinateur et vous pouvez la glisser dans le pi. Ensuite, alimentez votre pi de la façon que vous voulez (vous pouvez soit le connecter à une prise secteur ou comme moi directement sur l’ordinateur).

Très important : si vous avez un Pi Zero comme moi, il faut alimenter votre Raspberry Pi avec le port “USB” et non pas le port d’alimentation. Pour ceux qui ne saurait pas, le port USB permet le transfert de données et l’alimentation. L’autre port ne permet que l’alimentation :

Après avoir alimenté votre Pi, on va attendre quelques dizaines de secondes … passé ce délais, on devrait voir un nouveau réseau wifi apparaître appelé P4wnP1. Ce réseau wifi correspond évidemment au Raspberry :

 

 

4- Connexion via Putty

Avant de s’y connecter, on va avoir besoin d’un logiciel qui s’appelle PUTTY. Certains d’entre vous connaissent probablement, c’est un client SSH qui va nous permettre de rentrer dans le Raspberry Pi en ligne de commande et de faire des modifications sur la Rubber Ducky. Vous pouvez télécharger PuTTY ici. Encore une fois je vous épargne l’installation étant donné que c’est un jeu d’enfants.

 

Niveau design on a vu mieux ... bienvenue sur le site de PuTTY ! Sélectionnez la version adéquate pour votre système.
Niveau design on a vu mieux … bienvenue sur le site de PuTTY ! Sélectionnez la version adéquate pour votre système.

 

 

Une fois PuTTY en notre possession, on va pouvoir se connecter au réseau WiFi P4wnP1 qu’on a vu précédemment :

 

On nous demande un mot de passe, le voilà : MaMe82-P4wnP1

Pour info : Mame82 c’est l’auteur de P4wnP1 donc félicitations pour le développement de cet outil !

Une fois connecté au réseau WiFi, on va pouvoir lancer le logiciel PUTTY :

Une fenêtre de configuration va directement s’ouvrir. Dans “Host Name (or IP Adress)” vous allez mettre : 172.24.0.1

Notez cette adresse IP quelque part car à chaque fois que vous voudrez accéder au Raspberry Pi (ou Rubber Ducky du coup), il faudra passer par PuTTY et donc renseigner à nouveau l’adresse IP. Vérifiez que vous êtes bien en SSH dans Connection Type et vous pouvez cliquer sur le bouton Open au bas de la fenêtre.

Si vous avez un message d’avertissement : acceptez-le. Cela arrive à chaque nouvelle connexion SSH.

 

5- Commande via le terminal Putty

Le terminal va nous demander un login et un mot de passe. Ces logs sont ceux par défaut de raspbian donc « pi » pour le login et « raspberry » pour le mot de passe :

Et nous voilà maintenant dans le Raspberry Pi :

P4wnP1 est un outil très complet comme expliqué plus haut donc aujourd’hui on va se concentrer uniquement sur la partie Rubber Ducky.

 

 

Configuration de P4wnP1

La première chose à faire est d’accéder au fichier de configuration de P4wnP1. Pour cela, on peut taper la commande suivante et faire ENTER :

[pastacode lang=”bash” manual=”nano%20P4wnP1%2Fsetup.cfg” message=”Accès au fichier de configuration de P4wnP1″ highlight=”” provider=”manual”/]

Nous voilà maintenant dans le fichier config de P4wnP1. D’ici on va pouvoir activer ou désactiver les différentes fonctionnalités à notre disposition sur l’OS.

Afin d’activer le mode Rubber Ducky, la première chose à faire est de modifier USE_HID sur true sans la section USB SETUP :

Ensuite, on va pouvoir descendre jusqu’à la section keyboard settings for hid keyboard. Par défaut, on a « us » qui est renseigné dans la variable lang, us correspond au clavier Américain (et international) QWERTY. Si vous voulez que votre Rubber Ducky s’exécute bien sur les claviers français donc AZERTY, il faut impérativement mettre fr.

On va maintenant descendre tout au bas du script dans la section des Payloads :

 

Modification du Payload

Pour vulgariser, un payload correspond à un mini programme qui va effectuer toutes les actions qu’on va y écrire. Il s’exécutera donc lors du branchement de la Rubber Ducky à une machine.

Par défaut, on peut voir qu’un Payload network_only.txt est activé par défaut. On va désactiver ce payload en ajoutant un dièse devant la ligne PAYLOAD=network_only.txt.

Par contre, on va activer le payload nommé hid_keyboard.txt, donc on va simplement enlever le dièse devant cette ligne. Voilà le résultat que vous devez avoir après ces deux modifications :

Le Payload hid_keyboard.txt correspond à un script qui, lors de son branchement à une machine, va ouvrir le bloc note (notepad) et y inscrire une phrase. Avant de créer notre propre ducky script, je vous propose de tester celui-là. Vous pouvez donc quitter le fichier de config de P4wnP1 en effectuant la combinaison CTRL + X, on vous demande si vous voulez sauvegarder vos modifications, tapez Y puis ENTER.

Avant de tester, on va accéder à notre Payload car on a une petite chose à y modifier donc tapez la commande :

[pastacode lang=”bash” manual=”sudo%20nano%20P4wnP1%2Fpayloads%2Fhid_keyboard.txt” message=”” highlight=”” provider=”manual”/]

On peut ensuite descendre au bas du payload jusqu’à la variable lang, juste avant la fonction onKeyboardUp :

On va (encore) modifier la langue renseignée. Pour rappel, “us” = clavier QWERTY américain et “fr” = clavier AZERTY français. Je souhaite tester sur une machine avec un clavier AZERTY donc je vais indiquer “fr“.

C’est tout ce qu’on a à modifier pour le moment. On va laisser le script par défaut pour notre premier test.

 

Fin de configuration

On va sauvegarder le payload avec la même manipulation que pour le fichier config : CTRL+ X, on tape Y et on appuie sur ENTER.

La Rubber Ducky est maintenant prête. Vous pouvez éteindre le pi avec la commande :

[pastacode lang=”bash” manual=”sudo%20poweroff” message=”” highlight=”” provider=”manual”/]

PUTTY va afficher une erreur ce qui est plutôt logique car le logiciel vient de perdre la connexion avec l’appareil.

Vous pouvez débranchez le pi de votre ordinateur.

Premier test

C’est le moment de vérité ! Branchez votre Pi à votre ordinateur et attendez quelques instants.

L’exécution peut être un peu longue, c’est le désavantage de cette technique par rapport à une vrai Rubber Ducky. Une vrai clé s’exécute quasi-instantanément alors que là, vu qu’on se base sur Raspbian, le Pi doit d’abord booter sur l’OS et ensuite seulement il peut exécuter un (ou des) script(s).

Après quelques secondes …

On peut voir que le bloc note (notepad) s’ouvre via le menu d’exécution de Windows et un message indiquant que le clavier est activé apparaît dans le fichier.

Félicitations : vous avez maintenant une Rubber Ducky sur Raspberry Pi.

Scripts personnalisés

Maintenant qu’on a une Rubber Ducky fonctionnelle, on va pouvoir créer un script personnalisé afin d’effectuer les actions ne notre choix lors du branchement de la clé.

A savoir : Maintenant qu’un script est activé sur la Rubber Ducky, à chaque connexion de notre clé, le script s’exécutera. Faites donc très attention au type de script que vous activez sur la clé, cela pourrait se retourner contre vous ! Deux solutions pour éviter un retour de flamme :
1) Maintenez la touche ALT pendant une minute immédiatement après le branchement de votre Rubber Ducky, cela empêche l’exécution automatique.
2) Alimentez votre Rubber Ducky en la branchant au secteur. Vous pourrez toujours y accéder via SSH mais sans aucun risque d’exécution de script malveillant.

Alimentez à nouveau votre Rubber Ducky, si elle est toujours branchée à votre ordinateur inutile d’y toucher.

Plutôt que de créer un nouveau ducky script et de le renseigner dans le fichier config. On va modifier celui qui est actuellement activé, ça sera plus rapide et plus simple. Pour y accéder, on va réitérer certaines étapes déjà effectuées un peu plus haut, les voilà :

  1. Connectez-vous au réseau WiFi P4wnP1
  2. Lancez PUTTY, renseignez l’IP 172.24.0.1 et cliquez sur Open
  3. Connectez-vous avec le login “pi” et le mot de passe “raspberry”

Maintenant qu’on est connecté au Pi, on peut taper la commande suivante afin d’accéder au Payload actuellement actif :

[pastacode lang=”bash” manual=”sudo%20nano%20P4wnP1%2Fpayloads%2Fhid_keyboard.txt” message=”” highlight=”” provider=”manual”/]

 

Comme avant, on va se rendre au niveau de la fonction onKeyboardUp :

A l’intérieur de cette fonction se trouvent les lignes nécessaires au bon fonctionnement du script de test vu précédemment (ouverture et écriture dans notepad).

Détails

il faut savoir que les ducky scripts ont leur propre syntaxe, heureusement cette dernière est très simple. Vous retrouverez pleins de tutos et d’exemple de ducky scripts sur internet. Je ne vais pas vous faire de longues explications sur les différentes expressions aujourd’hui mais vous devez surtout connaître les quatre suivantes :

  • DELAY (int) : Littéralement un délai. On en ajoute un entre chaque action à effectuer. Il est calculé en milliseconde (rappel : 1000 millisecondes = 1 seconde). Il faut savoir que certaines actions mettent un peu de temps à s’exécuter, par exemple si vous chargez une page internet assez lourde il faut parfois plusieurs secondes donc si vous mettez un délai trop court (exemple : 0.5 seconde) avant l’action suivante et bien votre payload tombe à l’eau.
  • STRING (string) : Permet de simuler une écriture sur le clavier. Exemple : “STRING salut” va marquer « salut ».
  • ENTER : Permet de simuler un appuie sur la touche ENTER donc Entrée en français. A savoir que cette touche est énormément utilisée pour valider / confirmer donc très utile.
  • GUI r : Pas super évident à première vue. Cette expression représente la combinaison de touche Windows + R, elle permet l’ouverture du menu exécuter. Ce menu permet d’ouvrir n’importe quel programme, fichier ou dossier de l’ordinateur. Très pratique et très utilisée dans les ducky scripts.

Important : Sans rentrer dans les détails, ces lignes (voir capture d’écran ci-dessous) vont veiller au bon fonctionnement de notre script. Il ne faut surtout pas les enlever au risque d’avoir un script considéré comme vide et donc dénué d’actions.

Rédaction du script

Mon but, pour ce premier script personnalisé, va être de me rendre sur une vidéo YouTube et de la passer en plein écran. Plutôt simple non ?

Allez, commençons le script. Je vais ajouter toutes les lignes suivante (dans l’ordre) entre la ligne cat <<- EOF | duckhid et l’avant dernière ligne “EOF” :

[pastacode lang=”bash” manual=”GUI%20R%0ADELAY%20500%0ASTRING%20chrome.exe%0ADELAY%20500%0AENTER%0ADELAY%205000%0ASTRING%20https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DPMm8_bBB6g%0ADELAY%201000%0AENTER%0ADELAY%205000%0Af” message=”” highlight=”” provider=”manual”/]

 

Explications

Que fait ce script ? Voilà la description du script ligne par ligne :

  1. Ouverture du menu d’exécution de Windows
  2. Délai de 0,5 seconde avant l’action suivante
  3. Écriture de la chaîne de caractères “chrome.exe”
  4. Délai de 0,5 seconde avant l’action suivante
  5. Simulation d’un appui sur la touche ENTER
  6. Délai de 5 secondes avant l’action suivante
  7. Écriture de la chaîne de caractère “https://www.youtube.com/watch?v=P5Mm8_bBB6g” (Sur chrome, la barre d’URL est automatiquement sélectionnée à l’ouverture !)
  8. Délai de 1 seconde avant l’action suivante
  9. Simulation d’un appui sur la touche ENTER
  10. Délai de 5 secondes avant l’action suivante
  11. Simulation d’un appui sur la touche F (sur YouTube, ce raccourci met la vidéo en plein écran)

Maintenant que j’ai terminé mon script, je le sauvegarde avec CTRL+ X, j’appuie sur la touche Y puis sur ENTER.

Vous pouvez maintenant éteindre votre Pi avec la commande :

[pastacode lang=”bash” manual=”sudo%20poweroff” message=”” highlight=”” provider=”manual”/]

Test final

Je branche mon Pi sur mon ordinateur, vous pouvez voir ci-dessous le résultat du script en temps réel. Les différentes étapes du script sont retranscrites en direct dans le coin inférieur droit (attention ça va très vite !).

On peut voir qu’après différentes étapes, j’arrive bien sur ma vidéo YouTube en plein écran.

Conclusion

On a fait le tour des fondamentaux de la Rubber Ducky sur Raspberry Pi ! Je vous laisse donc imaginer l’infinité de possibilités qu’on a avec cet outil vu qu’on peut simuler n’importe quelle intervention humaine. Si cela vous intéresse, je peux faire d’autres vidéos et articles sur cette Rubber Ducky avec des payloads plus intéressants comme se connecter à un serveur et télécharger des fichiers, récupérer le mot de passe wifi du réseau auquel l’ordinateur est connecté et encore bien d’autres !

J’espère que vous vous amuserez bien avec cet outil.

Pour rappel, ni moi ni Bidouille2Geek.fr ne sommes responsables de ce que vous en ferez ! Cet article est uniquement à but pédagogique.

Si vous avez apprécié cet article / tutoriel, vous pouvez me suivre sur ma chaîne YouTube ZEF LAB où vous retrouverez d’autres vidéos et tutoriels informatique et électronique.

A bientôt sur le LAB ou sur Bidouille2Geek.fr !

Zef

2 réflexions sur “Réaliser une clé USB Rubber Ducky sur Raspberry Pi

  • Bonjour j’ai un problème je suis actuellement sur le Raspberry pi 4 qui peut produire un réseaux Wifi mais je ne trouve pas le wifi “P4wnP1” sur mon ordinateur…

    Répondre
    • Bonjour, a tu testé avec ton téléphone par exemple ? a tu vérifié que le wifi du rpi était bien actif ? 😉

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *