
KeySweeper is a stealthy Arduino-based device, camouflaged as a functioning USB wall charger, that wirelessly and passively sniffs, decrypts, logs and reports back (over GSM) all keystrokes from any Microsoft wireless keyboard in the vicinity.
KEYSWEEPER // SIGINT // SAMY.PL // REL TO ALL // APPLIED HACKING
KeySweeper est un dispositif furtif basé sur Arduino, déguisé en chargeur mural USB fonctionnel, qui capture, déchiffre, journalise et transmet (via GSM) sans fil et passivement toutes les frappes clavier de tout clavier sans fil Microsoft à proximité.
Toutes les frappes sont journalisées en ligne et localement. Des alertes SMS sont envoyées lors de mots déclencheurs, noms d'utilisateur ou URL, exposant ainsi les mots de passe. Si le dispositif est débranché, KeySweeper continue de fonctionner grâce à sa batterie interne et se recharge automatiquement lorsqu'il est de nouveau alimenté. Un outil web permet la surveillance en direct des frappes.
Démonstration en direct et détails complets disponibles dans la vidéo : KeySweeper
Point de contact : @SamyKamkar // [email protected] // http://samy.pl
Date de sortie : 12 janvier 2015
Code source / schéma : https://github.com/samyk/keysweeper
Coût unitaire : 10 $ - 80 $ selon le mode de fonctionnement
Statut : Opérationnel, open source, matériel ouvert, déclassifié.
KeySweeper est un dispositif furtif basé sur Arduino, déguisé en chargeur mural USB fonctionnel, qui capture, déchiffre, journalise et transmet sans fil et passivement toutes les frappes clavier de tout clavier sans fil Microsoft (utilisant un protocole RF propriétaire de 2,4 GHz) à proximité.
Les frappes sont renvoyées à l'opérateur de KeySweeper via Internet grâce à une puce GSM optionnelle, ou peuvent être stockées sur une puce flash et livrées sans fil lorsqu'un second dispositif KeySweeper se trouve à portée sans fil du KeySweeper cible. Un outil web permet la surveillance en direct des frappes.
KeySweeper a la capacité d'envoyer des alertes SMS lors de certaines frappes, par ex. « www.bank.com ». Si KeySweeper est retiré de l'alimentation secteur, il semble s'éteindre ; cependant, il continue de fonctionner discrètement grâce à une batterie interne qui se recharge automatiquement lorsqu'il est rebranché sur secteur.
KeySweeper étend les travaux de Travis Goodspeed sur le projet goodfet.nrf et ceux de Thorsten Schröder et Max Moser du projet KeyKeriki v2.0.
3 $ - 30 $ : Un microcontrôleur Arduino ou Teensy peut être utilisé. Dans ma réalisation, j'utilise un Arduino Pro Mini 3,3 V en raison de son profil très fin.
1 $ : J'utilise une puce RF nRF24L01+ à 1 $ qui communique en GFSK sur 2,4 GHz. Plus de détails sont disponibles ci-dessous, et ces puces peuvent être achetées pour aussi peu que 1 $ sur eBay. Ces puces ne peuvent communiquer qu'avec des protocoles propriétaires et ne sont pas conçues pour l'interception ; cependant, nous verrons ci-dessous qu'elles peuvent être utilisées de manière astucieuse pour intercepter en mode promiscuité.
6 $ : J'utilise un chargeur USB secteur bon marché (redresseur) qui convertit le courant alternatif en 5 V continu, et celui que je lie se trouve avoir une vis qui facilite son ouverture (j'en ai détruit quelques autres en essayant de les ouvrir). Si vous utilisez la version GSM de KeySweeper, j'utilise en fait deux chargeurs USB -- l'intérieur d'un petit chargeur (similaire à celui d'un chargeur d'iPhone), et le boîtier externe d'un chargeur USB plus grand.
OPTIONNEL (2 $) : Une puce Flash série SPI optionnelle peut être utilisée pour stocker les frappes. Si vous utilisez la carte GSM FONA ci-dessous, cela n'est pas nécessaire car les frappes peuvent être stockées en direct via Internet ; cependant, si vous souhaitez une option à moindre coût, vous pouvez stocker les frappes sur cette puce dans KeySweeper, et récupérer les frappes plus tard en vous approchant à portée sans fil 2,4 GHz de l'appareil avec un second dispositif qui soutirera les frappes.
La plupart des microcontrôleurs ont une mémoire ou une EEPROM très limitée pour stocker des données, d'où l'avantage d'avoir une puce flash pour stocker ces frappes.
OPTIONNEL (45 $) : Adafruit a créé une carte appelée FONA qui permet d'utiliser une carte SIM 2G pour envoyer/recevoir des SMS, des appels téléphoniques et utiliser Internet directement depuis l'appareil.
Avec cela, aucune puce flash n'est nécessaire car les frappes sont immédiatement envoyées à un serveur backend pour une collecte de données appropriée. De plus, si des mots-clés spécifiques sont tapés par les claviers cibles, un SMS peut être envoyé à un numéro prédéfini pour alerter l'opérateur.
OPTIONNEL (3 $, uniquement si vous utilisez FONA) : La FONA nécessite une carte mini-SIM (pas une micro-SIM). J'utilise une carte SIM prépayée T-Mobile. Je suggère d'utiliser T-Mobile car ils prennent en charge la 2G, alors que la plupart des autres opérateurs ont ou sont en train de déprécier leur réseau 2G, et la FONA ne prend en charge que la 2G pour Internet. Assurez-vous d'obtenir la bonne taille de carte SIM -- plus de détails sur les exigences SIM de FONA ici.
OPTIONNEL (5 $ et plus, uniquement si vous utilisez FONA) : La FONA fournit une recharge de batterie LiPo/LiOn intégrée, et tant que KeySweeper est connecté au secteur, la batterie reste chargée, mais elle est néanmoins requise. De plus, KeySweeper continue de fonctionner discrètement sur batterie lorsqu'il est retiré du secteur, et commence à se recharger lorsqu'il est rebranché sur secteur.
Le code source de KeySweeper peut être obtenu en intégralité depuis mon github : https://github.com/samyk/keysweeper
KeySweeper comporte plusieurs parties. Le code principal est installé sur le microcontrôleur, tandis qu'un backend web utilisant jQuery et PHP journalise toutes les frappes et fournit une interface web pour la surveillance en direct des claviers cibles.
KeySweeper nécessite également les fichiers suivants de la bibliothèque RF24 de maniacbug :
RF24.hnRF24L01.hRF24_config.hCopiez simplement les fichiers dans le répertoire keysweeper_mcu_src. Vous devez également modifier l'instruction #include dans le fichier RF24.h de #include <RF24_config.h> en #include "RF24_config.h".
Vous devriez utiliser ma version de la bibliothèque Adafruit FONA car j'inclus une option supplémentaire qui permet à la FONA de nous faire savoir quand un nouveau message texte arrive. Dans la bibliothèque d'origine, vous devez constamment interroger pour voir s'il y a plus de messages texte que prévu ; cependant, avec ma version, vous pouvez activer une option fona.setSMSInterrupt(1) qui fait passer la broche RI (Ring Interrupt) à l'état bas pendant un moment lors de nouveaux SMS.
J'ai créé un outil backend qui vous permet de surveiller les claviers en direct via une page web. Le plugin jQuery Terminal rend cela plus esthétique.
jQuery UI Virtual Keyboard continue de rendre l'outil d'interface d'espionnage en direct de KeySweeper plus esthétique, en affichant les touches du clavier virtuel qui sont enfoncées lorsque l'utilisateur appuie réellement sur les touches.
Lorsque l'on obtient un clavier sans fil Microsoft, s'il est en notre possession, on peut regarder au dos pour inspecter l'ID FCC. Sur mon clavier, l'ID FCC (exigé pour tous les appareils utilisant des fréquences radio aux États-Unis) est C3K1455, que l'on peut facilement rechercher sur le site de la FCC.
Immédiatement, on découvre que le clavier communique sur 2403 - 2480 MHz d'après le rapport FCC.
Maintenant que je sais qu'il s'agit d'un appareil 2,4 GHz, je suppose qu'il fonctionne soit avec un protocole 2,4 GHz courant tel que Wi-Fi, Bluetooth, Zigbee ou autres, soit avec un protocole propriétaire. Du fait que l'appareil est livré avec son propre dongle USB (avec son propre ID FCC, C3K1461), il s'agit très probablement d'un signal 2,4 GHz propriétaire.
Comme il s'agit probablement d'un 2,4 GHz propriétaire, nous devons maintenant utiliser une méthode d'interception 2,4 GHz. Les renifleurs Wi-Fi n'aideront pas car ce n'est pas de l'802.11 (comme ce que nous avons utilisé dans SkyJack), et le RTL-SDR seul n'aidera pas car il plafonne autour de 2,2 GHz à moins d'utiliser en plus un convertisseur abaisseur RF (nous avons utilisé le RTL-SDR dans Digital Ding Dong Ditch), donc je veux immédiatement utiliser HackRF, une radio logicielle puissante et bon marché ; cependant, bien qu'elle soit extrêmement puissante pour son prix, nous pourrions nous en tirer avec un matériel encore moins cher.
Sur la base de mon expérience antérieure, je suppose que le clavier utilise quelque chose comme un Nordic nRF24L01+, un TI CC2500, ou un Cypress CYRF6936, mais nous n'en serons pas sûrs sans inspection plus approfondie.
Après avoir retiré les vis du clavier et l'avoir ouvert, nous voyons une seule puce responsable de tout. Elle est étiquetée NRF 24LE1H, ce qui ressemble beaucoup à nRF24L01 (n=Nordic Semiconductor, RF=Radiofréquence, 24=2,4 GHz) ! Nous trouvons rapidement la puce nRF24LE1 par une recherche et voyons qu'elle intègre en fait la puce RF nRF24L01+ avec un CPU (System-on-Chip/SoC), et une recherche rapide sur eBay montre que le nRF24L01+ peut nous être expédié pour moins de 1 $.
The nRF24LE1 integrates an nRF24L01+ 2.4GHz RF transceiver core, enhanced 16MHz 8-bit 8051 compatible CPU, 1kB + 256B RAM, 16kB embedded Flash, and a wide range of system peripherals
En regardant la fiche technique du nRF24L01+, nous voyons qu'il s'agit d'une puce RF 2,4 GHz qui fonctionne à 250kbps/1Mbps/2Mbps, utilise GFSK (modulation par déplacement de fréquence gaussienne est une modulation numérique de fréquence/FM), et ne dispose malheureusement d'aucun mode promiscuité ou direct légitime pour l'interception... ou peut-être que si ?
Bien que normalement je sortirais un HackRF ou un RTL-SDR avec convertisseur abaisseur numérique (pour amener le 2,4 GHz dans la plage du RTL-SDR), il serait vraiment bien de pouvoir intercepter avec un matériel moins cher, car au final je veux tout empaqueter dans un dispositif qui peut être laissé sur le terrain.
Après une recherche de base, une page étonnante est apparue de Travis Goodspeed, où non seulement il intercepte un clavier similaire (Microsoft Comfort Desktop 5000), mais il montre aussi comment transformer le nRF24L01+ en renifleur 2,4 GHz en utilisant son dispositif GoodFET et un ordinateur hôte avec l'application python goodfet.nrf.
Travis a découvert que l'interception avec ce dispositif est traditionnellement difficile car non seulement vous devez spécifier le canal (fréquence) à écouter, mais vous devez aussi spécifier une adresse MAC sur laquelle écouter. La puce nRF ne délivrera que les paquets envoyés à cette adresse MAC spécifique. De plus, la puce nRF ne vous dira pas l'adresse MAC puisque vous l'avez déjà spécifiée (elle est supposée se trouver dans l'un de nos pipes RX_ADDR_P[0-5], indiqué dans la fiche technique).
Cependant, en spécifiant la longueur de la MAC, Travis a découvert qu'il existe une option considérée comme « illégale » dans la fiche technique (SETUP_AW, 0x03 set to 00), mais qui définit en réalité la MAC sur 2 octets ! Aussi, en définissant la MAC à des données que l'on trouverait typiquement dans le préambule (0x00AA or 0x0055, in binary 0000000010101010 or 0000000001010101), nous pouvons tromper le dispositif pour qu'il nous donne le paquet en avance, fournissant une adresse MAC complète dans la partie données ! Lisez son excellente explication pour tous les détails.
Bien que nous puissions utiliser un GoodFET, un ordinateur et un nRF24L01+ pour l'interception pendant les tests, nous voulons au final que cela se trouve sur un dispositif peu coûteux et embarqué. Nous pouvons reprendre une partie de l'excellent travail de Travis en Python et le porter en C embarqué afin de le charger sur un microcontrôleur plutôt que d'exiger un ordinateur + GoodFET.
De plus, nous implémentons quelques améliorations. Goodfet.nrf fournit une méthode pour scanner les dispositifs en effectuant ce qui suit :
Cela signifie que pour scanner toute la gamme de fréquences, il faut environ 85 minutes et qu'au moins plusieurs frappes doivent être effectuées pendant que nous écoutons dans la bonne période de 10 secondes. Après avoir examiné les recherches et le clavier de Travis, les recherches et le clavier du KeyKeriki, et mon propre clavier, nous pouvons implémenter quelques améliorations :
0xAA (10101010) car le préambule de 0xAA est toujours suivi d'un bit à 1 (0xCD is 11001101) afin de maintenir l'alternance des bits, divisant ainsi notre recherche par deuxThorsten Schröder et Max Moser ont présenté un excellent dispositif, le KeyKeriki, capable d'intercepter les claviers Microsoft, et ont entièrement procédé à la rétro-ingénierie du processus de déchiffrement et produit un dispositif à cet effet. Cependant, Travis souligne que leur dispositif nécessite deux radios et un microcontrôleur haut de gamme pour capturer et analyser les paquets à la vitesse de 2 Mbit/s à laquelle les claviers communiquent. Le projet de Travis est également excellent, mais nécessite un ordinateur hôte et sera trop volumineux pour notre implémentation clandestine. Nous améliorons ces conceptions dans ce scénario en n'exigeant qu'une radio et un microcontrôleur peu coûteux, tous deux à faible consommation et très compacts, sans ordinateur ni radios sophistiquées.
Thorsten et Max ont découvert que les frappes sont simplement chiffrées (xor) avec l'adresse MAC en mode ECB, que nous sommes capables d'intercepter après avoir utilisé la méthode de Travis consistant à abuser du nRF24L01+ pour à la fois intercepter et révéler les adresses MAC. Ce « chiffrement » équivaut à prendre un jeu de cartes, le couper une fois, et le qualifier de mélangé.
Après des recherches plus approfondies, j'ai constaté que puisque nous savons désormais que tous les claviers Microsoft commencent par 0xCD comme adresse MAC, la frappe réelle (en orange ci-dessous) se trouve être alignée avec le premier octet de l'adresse MAC (0xCD). Cela signifie que même si nous ne connaissons pas l'adresse MAC, nous pouvons déchiffrer la frappe, car l'alignement ne changera jamais, et 0xCD est toujours le premier octet de la MAC.
Une découverte supplémentaire est que puisque la longueur de la partie chiffrée du paquet est de 11 octets, la MAC est de 5 octets, et le CRC est chaque octet xoré avec un autre (avant chiffrement), quelque chose d'intéressant se produit. Comme la MAC est xorée deux fois, nous pouvons également calculer la somme de contrôle sans connaître l'adresse MAC. Cela parce que l'adresse MAC y figure en entier deux fois, et xorer un nombre par lui-même (ou xorer la MAC avec la MAC) s'annule. Le 11e octet est à nouveau le premier octet de la MAC, que nous savons toujours être 0xCD. Cela nous permet d'effectuer d'autres attaques, comme modifier la frappe et le CRC, toujours sans connaître l'adresse MAC. Je présenterai cela et d'autres démonstrations amusantes dans un futur projet.
Une page de la présentation KeyKeriki démontre le processus de déchiffrement :
Notre méthode de déchiffrement, implémentée dans le code source de KeySweeper :``` // decrypt those keyboard packets! void decrypt(uint8_t* pkt) { // our encryption key is the 5-byte MAC address and // starts 4 bytes in (4-byte header is unencrypted) for (int i = 4; i < 15; i++) pkt[i] ^= mac >> (((i - 4) % 5) * 8) & 0xFF; }
# (U) Construction / Détournement d'un chargeur USB
**AVERTISSEMENT : les appareils branchés sur le secteur utilisent du courant à haute tension, et l'appareil que nous créons et qui se branche sur le secteur n'est pas sûr et ne respecte pas les normes de sécurité électrique habituelles. Cet appareil est dangereux et, s'il est utilisé ou construit incorrectement, peut tuer, provoquer un incendie ou d'autres dégâts importants. Ne construisez pas un appareil alimenté sur secteur sauf si vous savez ce que vous faites. Si vous souhaitez continuer à construire cet appareil mais sans alimentation secteur, utilisez simplement une batterie ou alimentez l'appareil directement en USB pour suivre en toute sécurité.**
KeySweeper utilise du matériel extrêmement basse consommation et au profil très plat afin de rester aussi discret que possible. KeySweeper peut fonctionner sur batterie ou sur une alimentation DC de ~3-20V. Comme nous souhaitons que KeySweeper reste alimenté en permanence, nous l'installons furtivement à l'intérieur d'un innocent chargeur USB mural que nous prévoyons de laisser branché en continu.
Si le chargeur USB est débranché, KeySweeper continue discrètement son fonctionnement grâce à sa batterie interne (optionnelle). Dès que KeySweeper est rebranché, il repasse automatiquement sur l'alimentation secteur et recharge simultanément la batterie.
Si vous construisez KeySweeper **sans** la carte GSM, vous pouvez tout faire tenir dans un chargeur USB mural AC classique. Je suggère d'en chercher un qui est maintenu par une vis, car la plupart des autres sont scellés et nécessitent de détruire une partie de l'appareil pour l'ouvrir.
[](http://samy.pl/keysweeper/usbopen.jpg)
Si vous décidez d'utiliser la carte GSM, j'ai constaté qu'elle ne rentrait pas dans ce type de chargeur USB avec le reste de l'électronique. Cependant, j'ai découvert qu'en ouvrant un chargeur USB plus petit (similaire aux chargeurs USB d'iPhone), on trouve un redresseur (AC->DC) et un convertisseur abaisseur (haute tension->5V) beaucoup plus petits qui permettent de faire tenir **toute** notre électronique dans le plus grand chargeur USB.
[](http://samy.pl/keysweeper/usbcharger1.jpg)
[](http://samy.pl/keysweeper/usbcharger2.jpg)
Mon amie Dana m'a prêté son fer à souder de poupée. Je ne comprends pas vraiment à quoi elle l'utilise, mais c'est un fer à souder avec une lame de rasoir attachable. C'est parfait pour couper le plastique, et les poupées, je présume. Elle a repris le fer dès que je lui ai expliqué ce que l'appareil ferait. Apparemment, elle ne soutient pas cela, même si je ne sais pas pourquoi. Je suis sûr que je le découvrirai après avoir sniffé plus de frappes clavier depuis son clavier.
[](http://samy.pl/keysweeper/usbcharger3.jpg)
[](http://samy.pl/keysweeper/usbchargeropen.jpg)
**AVERTISSEMENT : encore une fois, parce que nous avons affaire au courant secteur, c'est très dangereux. N'ouvrez pas et ne recâblez pas un appareil alimenté sur secteur sauf si vous savez ce que vous faites.** Vous pouvez toujours construire KeySweeper en alimentant simplement tout à partir d'un chargeur USB, d'un port USB ou d'une batterie sans modifier un appareil fonctionnant sur secteur.
Il est également important de câbler notre Arduino via le port RAW à l'alimentation USB 5V avec la bonne polarité (négatif vers GND, positif vers RAW). Dans ce cas, j'utilise un Arduino Pro Mini 3.3v. Le port RAW accepte une tension non régulée entre 3.35-12V et utilise un régulateur de tension intégré pour la ramener à 3.3V. Notez que notre puce nRF24L01+ nécessite 1.9-3.6V, donc lui donner 5V est **trop !** De plus, si vous utilisez une puce SPI comme la [SST25VF016B](http://ww1.microchip.com/downloads/en/DeviceDoc/S71271_04.pdf), elle nécessite 2.7-3.6V, donc là encore, utiliser 5V est **trop !** Assurez-vous d'utiliser le 3.3V régulé de l'Arduino (depuis la broche VCC sur un Arduino 3.3V, ou la broche 3V3 sur un Arduino 5V).
[](http://samy.pl/keysweeper/multimeter.jpg)
*note : la carte USB photographiée à côté du multimètre est l'originale, avant que j'aie décidé de la remplacer par une plus petite pour également faire entrer la carte GSM*
Après avoir rassemblé tout notre matériel, nous pouvons voir que tout tient avec de la marge dans notre chargeur (avant câblage) :
[](http://samy.pl/keysweeper/testingsize.jpg)
Pour m'amuser, j'ai relié la LED du chargeur à la broche 6 de l'Arduino et, bien que la LED semble se comporter de la même manière, je la fais en réalité clignoter lors du sniffing de frappes clavier. Cela risque probablement de vous faire repérer, mais c'est vraiment amusant à regarder. Je m'assure également que la LED s'éteint lorsque l'alimentation secteur est perdue, même si le reste de l'appareil continue de fonctionner sur la batterie interne.
Nous voulons aussi nous assurer de laisser le reste du chargeur USB fonctionnel afin que d'autres appareils puissent continuer à être alimentés par le chargeur USB.

-----
# (U) KeySweeper secondaire optionnel
Si vous souhaitez renoncer à la carte GSM pour réduire les coûts, vous pouvez créer un KeySweeper secondaire contenant simplement un Arduino et un nRF24L01+. Lors de la compilation du second appareil, décommentez la ligne `#define BACKTRACER 1`.
Le principe est le suivant : si le KeySweeper secondaire (BACKTRACER) entre un jour à portée sans fil (via le nRF24L01+ 2.4GHz) du premier, il détecte automatiquement l'existence du premier et le dispositif KeySweeper initial déverse ses journaux vers le BACKTRACER. La détection automatique est intégrée aux deux KeySweeper afin qu'ils puissent rapidement se trouver mutuellement, grâce à la capacité du nRF24L01+ de disposer de plusieurs tuyaux RX.
Si vous connectez le BACKTRACER à un ordinateur, les journaux de frappes seront déversés sur le port série, et vous pouvez envoyer une commande 'E' sur le port série pour effacer le contenu de la puce SPI Flash du KeySweeper d'origine, maintenant que vous en avez obtenu le contenu. Vous pouvez ensuite vous éloigner et laisser le KeySweeper d'origine continuer à enregistrer les frappes clavier.
-----
# (U) Schéma
Cliquez pour une version plus grande (schéma basé sur FONA), ou [cliquez ici](http://samy.pl/keysweeper/keysweeper.fzz) pour le fichier Fritzing.
[](http://samy.pl/keysweeper/keysweeper2_schem.png)
-----
# (U) Contact
**Point de contact :** [@SamyKamkar](https://twitter.com/samykamkar)
Vous pouvez voir plus de mes projets sur <http://samy.pl> ou me contacter à <[email protected]>.