
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 A TUTTI // HACKING APPLICATO
KeySweeper è un dispositivo stealth basato su Arduino, mimetizzato come un caricabatterie da muro USB funzionante, che intercetta, decripta, registra e trasmette (via GSM) in modalità wireless e passiva tutte le pressioni dei tasti di qualsiasi tastiera wireless Microsoft nelle vicinanze.
Tutte le pressioni dei tasti vengono registrate online e localmente. Gli avvisi SMS vengono inviati in presenza di parole trigger, nomi utente o URL, esponendo le password. Se scollegato, KeySweeper continua a funzionare grazie alla batteria interna e si ricarica automaticamente quando viene nuovamente alimentato. Uno strumento web consente il monitoraggio live delle pressioni dei tasti.
Dimostrazione live e dettagli completi disponibili nel video: KeySweeper
Punto di contatto: @SamyKamkar // [email protected] // http://samy.pl
Rilasciato: 12 gennaio 2015
Codice sorgente / schema: https://github.com/samyk/keysweeper
Costo unitario: $10 - 80 a seconda della configurazione
Stato: Operativo, open source, open hardware, declassificato.
KeySweeper è un dispositivo stealth basato su Arduino, mimetizzato come un caricabatterie da muro USB funzionante, che intercetta, decripta, registra e trasmette in modalità wireless e passiva tutte le pressioni dei tasti di qualsiasi tastiera wireless Microsoft (che usa un protocollo RF proprietario a 2.4GHz) nella zona.
Le pressioni dei tasti vengono inviate all'operatore di KeySweeper via Internet tramite un chip GSM opzionale, oppure possono essere memorizzate su un chip flash e consegnate in modalità wireless quando un secondo dispositivo KeySweeper entra nel raggio d'azione wireless del KeySweeper bersaglio. Uno strumento web consente il monitoraggio live delle pressioni dei tasti.
KeySweeper ha la capacità di inviare avvisi SMS quando vengono digitate determinate combinazioni di tasti, ad es. "www.bank.com". Se KeySweeper viene scollegato dalla corrente AC, sembra spegnersi, ma continua a operare in modo occulto utilizzando una batteria interna che viene ricaricata automaticamente quando viene ricollegato alla corrente AC.
KeySweeper estende il lavoro di Travis Goodspeed sul progetto goodfet.nrf e quello di Thorsten Schröder e Max Moser del progetto KeyKeriki v2.0.
$3 - 30: È possibile utilizzare un microcontrollore Arduino o Teensy. Nella mia realizzazione uso un Arduino Pro Mini da 3.3V grazie al suo profilo molto sottile.
$1: Uso un chip RF nRF24L01+ da $1 che comunica tramite GFSK su 2.4GHz. Ulteriori dettagli sono disponibili più sotto; questi chip possono essere acquistati per appena $1 su eBay. Questi chip possono comunicare solo tramite protocolli proprietari e non sono progettati per lo sniffing, ma vedremo più sotto che possono essere usati in modi ingegnosi per intercettare in modalità promiscua.
$6: Uso un caricatore AC USB economico (raddrizzatore) che converte la corrente AC in 5V DC; quello che ho linkato ha per caso una vite che lo rende facile da aprire (ne ho distrutti diversi nel tentativo di aprirli). Se si usa la versione GSM di KeySweeper, uso in realtà due caricatori USB: i componenti interni di un caricatore piccolo (simile a quello di un iPhone) e l'involucro esterno di un caricatore USB più grande.
OPZIONALE ($2): Un chip flash seriale SPI opzionale può essere utilizzato per memorizzare le pressioni dei tasti. Se si usa la scheda FONA GSM qui sotto, non è necessario, poiché le pressioni dei tasti possono essere memorizzate online in tempo reale; se invece desideri un'opzione più economica, puoi memorizzare le pressioni su questo chip all'interno di KeySweeper e recuperarle in seguito avvicinandoti entro il raggio wireless 2.4GHz del dispositivo con un secondo dispositivo che le recupererà da esso.
La maggior parte dei microcontrollori ha memoria o EEPROM molto limitate su cui memorizzare dati; da qui il vantaggio di avere un chip flash su cui salvare queste pressioni dei tasti.
OPZIONALE ($45): Adafruit ha creato una scheda chiamata FONA che consente di usare una scheda SIM 2G per inviare/ricevere SMS, telefonate e usare Internet direttamente dal dispositivo.
Usando questa scheda, non è necessario alcun chip flash poiché le pressioni dei tasti vengono immediatamente inviate a un server backend per una corretta raccolta dati. Inoltre, se sulle tastiere bersaglio vengono digitate parole chiave specifiche, può essere inviato un SMS a un numero indicato per avvisare l'operatore dell'accaduto.
OPZIONALE ($3, solo se si usa la FONA): La FONA richiede una scheda mini-SIM (non micro-SIM). Io uso una scheda SIM prepagata T-Mobile. Suggerisco di usare T-Mobile poiché supporta il 2G, mentre la maggior parte degli altri operatori ha deprecato o sta deprecando la propria rete 2G, e la FONA supporta solo il 2G per Internet. Assicurati di procurarti la dimensione giusta di scheda SIM -- maggiori dettagli sui requisiti SIM della FONA qui.
OPZIONALE ($5 e oltre, solo se si usa la FONA): La FONA offre la ricarica integrata della batteria LiPo/LiOn e, finché KeySweeper è collegato alla corrente AC, la batteria viene mantenuta carica, ma è comunque richiesta. Inoltre, KeySweeper continua a funzionare in modo occulto a batteria quando viene scollegato dalla corrente AC e inizia a ricaricarsi quando viene ricollegato alla corrente AC.
Il codice sorgente di KeySweeper può essere ottenuto integralmente dal mio github: https://github.com/samyk/keysweeper
KeySweeper è composto da più parti. Il codice principale è installato sul microcontrollore, mentre un backend basato sul web che usa jQuery e PHP registra tutte le pressioni dei tasti e fornisce un'interfaccia web per il monitoraggio live delle tastiere bersaglio.
KeySweeper richiede anche i seguenti file dalla libreria RF24 di maniacbug:
RF24.hnRF24L01.hRF24_config.hBasta copiare i file nella directory keysweeper_mcu_src. Devi anche cambiare l'istruzione #include nel file RF24.h da #include <RF24_config.h> a #include "RF24_config.h".
Dovresti usare la mia versione della libreria Adafruit FONA poiché includo un'opzione aggiuntiva che consente alla FONA di farci sapere quando arriva un nuovo messaggio di testo. Nella libreria originale devi interrogare costantemente il modulo per capire se ci sono più messaggi di testo del previsto; con la mia versione, invece, puoi abilitare l'opzione fona.setSMSInterrupt(1) che porta il pin RI (Ring Interrupt) a livello basso per un momento quando arrivano nuovi SMS.
Ho creato uno strumento backend che consente di monitorare le tastiere in tempo reale tramite una pagina web. Il plugin jQuery Terminal lo rende più accattivante.
jQuery UI Virtual Keyboard contribuisce a rendere accattivante lo strumento di interfaccia spia live di KeySweeper, mostrando i tasti della tastiera virtuale che vengono premuti quando l'utente preme realmente i tasti.
Quando entriamo in possesso di una tastiera wireless Microsoft, possiamo girarla per ispezionare l'FCC ID. Sulla mia tastiera, l'FCC ID (obbligatorio per tutti i dispositivi che usano radiofrequenze negli Stati Uniti) è C3K1455, che possiamo facilmente cercare sul sito della FCC.
Immediatamente scopriamo che la tastiera comunica su 2403 - 2480MHz secondo il rapporto FCC.
Ora che so che si tratta di un dispositivo a 2.4GHz, presumo che operi con un protocollo 2.4GHz comune come wi-fi, bluetooth, zigbee o altri, oppure con un protocollo proprietario. Poiché il dispositivo è dotato di un proprio dongle USB (con il proprio FCC ID, C3K1461), è molto probabile che si tratti di un segnale 2.4GHz proprietario.
Poiché è probabilmente un segnale 2.4GHz proprietario, dobbiamo ora usare un qualche metodo di sniffing a 2.4GHz. Gli sniffer Wi-Fi non aiutano perché non si tratta di 802.11 (come quello usato in SkyJack), e nemmeno l'RTL-SDR da solo aiuta, poiché si ferma intorno ai 2.2GHz a meno di usare anche un down converter RF (abbiamo usato RTL-SDR in Digital Ding Dong Ditch), quindi vorrei subito usare HackRF, una software defined radio potente ed economica, ma per quanto sia estremamente potente per il suo prezzo, potremmo cavarcela con hardware ancora più economico.
Sulla base dell'esperienza precedente, la mia ipotesi è che la tastiera usi qualcosa come un Nordic nRF24L01+, un TI CC2500, o un Cypress CYRF6936, ma non lo sapremo con certezza senza un'ispezione più approfondita.
Dopo aver rimosso le viti dalla tastiera e averla aperta, vediamo un unico chip responsabile di tutto. È etichettato NRF 24LE1H, che somiglia molto a nRF24L01 (n=Nordic Semiconductor, RF=Radio Frequency, 24=2.4GHz)! Con una ricerca troviamo rapidamente il chip nRF24LE1 e vediamo che in effetti integra il chip RF nRF24L01+ con una CPU (System-on-Chip/SoC); una rapida ricerca su eBay mostra che l'nRF24L01+ può esserci spedito per meno di $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
Osservando il datasheet dell'nRF24L01+, vediamo che si tratta di un chip RF a 2.4GHz che opera a 250kbps/1Mbps/2Mbps, usa GFSK (la modulazione a spostamento di frequenza gaussiana è una modulazione di frequenza digitale/FM) e purtroppo non dispone di alcuna modalità promiscua o diretta legittima per lo sniffing...o forse sì?
Anche se normalmente tirerei fuori qualcosa come un HackRF o un RTL-SDR con down converter digitale (per portare i 2.4GHz nel range dell'RTL-SDR), sarebbe davvero bello poter intercettare con hardware più economico, dato che in definitiva voglio racchiudere tutto in un dispositivo che possa essere lasciato sul campo.
Dopo una ricerca di base, è emersa una pagina straordinaria di Travis Goodspeed, in cui non solo intercetta una tastiera simile (Microsoft Comfort Desktop 5000), ma dimostra anche come trasformare l'nRF24L01+ in uno sniffer 2.4GHz usando il suo dispositivo GoodFET e un computer host con l'applicazione Python goodfet.nrf.
Travis ha scoperto che intercettare con il dispositivo è tradizionalmente difficile perché non devi solo specificare il canale (frequenza) su cui ascoltare, ma anche un indirizzo MAC su cui mettersi in ascolto. Il chip nRF consegna solo i pacchetti inviati a quello specifico indirizzo MAC. Inoltre, il chip nRF non ti comunica l'indirizzo MAC poiché lo hai già specificato (si presume che sia in una delle pipe RX_ADDR_P[0-5], come indicato nel datasheet).
Tuttavia, specificando la lunghezza del MAC, Travis ha scoperto che esiste un'opzione considerata "illegale" nel datasheet (SETUP_AW, 0x03 set to 00), che in realtà imposta il MAC a 2 byte! Inoltre, impostando il MAC su dati che si troverebbero tipicamente nel preambolo (0x00AA o 0x0055, in binario 0000000010101010 o 0000000001010101), possiamo ingannare il dispositivo facendogli consegnare il pacchetto in anticipo, fornendoci un indirizzo MAC completo nella porzione dati! Leggi il suo ottimo articolo per tutti i dettagli.
Ora, anche se per lo sniffing durante i test possiamo usare un GoodFET, un computer e un nRF24L01+, in definitiva vogliamo che tutto questo sia su un dispositivo economico ed embedded. Possiamo prendere parte del grande lavoro di Travis in Python e portarlo in C embedded, così da poterlo caricare su un microcontrollore invece di richiedere computer+GoodFET.
Inoltre, implementiamo alcuni miglioramenti. Goodfet.nrf fornisce un metodo per scansionare i dispositivi eseguendo quanto segue:
Ciò significa che per scansionare l'intera gamma di frequenze servono circa 85 minuti e che devono essere premute almeno diverse combinazioni di tasti mentre si intercetta all'interno del corretto periodo di 10 secondi. Dopo aver esaminato la ricerca e la tastiera di Travis, la ricerca e la tastiera KeyKeriki, e la mia tastiera, possiamo implementare alcuni miglioramenti:
0xAA (10101010) perché al preambolo di 0xAA segue sempre un bit 1 (0xCD è 11001101) per mantenere l'alternanza dei bit, dimezzando la ricercaThorsten Schröder e Max Moser hanno presentato un grande dispositivo, il KeyKeriki, in grado di intercettare le tastiere Microsoft e hanno completamente reverse-engineerizzato il processo di decrittazione, producendo un dispositivo per farlo. Travis però fa notare che il loro dispositivo richiede due radio e un microcontrollore di fascia alta per catturare e analizzare i pacchetti alla velocità di 2Mbps a cui comunicano le tastiere. Anche il progetto di Travis è ottimo, ma richiede un computer host e sarà troppo ingombrante per la nostra implementazione occulta. In questo scenario miglioriamo questi progetti richiedendo solo una radio e un microcontrollore economici, entrambi a basso consumo e molto piccoli, senza bisogno di computer o radio elaborate.
Thorsten e Max hanno scoperto che le pressioni dei tasti sono semplicemente cifrate (sottoposte a XOR) con l'indirizzo MAC in modalità ECB, che siamo in grado di intercettare dopo aver usato il metodo di Travis per abusare dell'nRF24L01+ sia per sniffare che per rivelare gli indirizzi MAC. Questa "cifratura" equivale a prendere un mazzo di carte, tagliarlo una volta e definirlo mescolato.
Dopo ulteriori indagini, ho scoperto che, poiché ora sappiamo che tutte le tastiere Microsoft iniziano con 0xCD come indirizzo MAC, la pressione effettiva del tasto (in arancione qui sotto) risulta allineata con il primo byte dell'indirizzo MAC (0xCD). Ciò significa che anche se non conosciamo l'indirizzo MAC, possiamo decrittare la pressione del tasto, poiché l'allineamento non cambierà mai e 0xCD è sempre il primo byte del MAC.
Un'ulteriore scoperta è che, poiché la lunghezza della porzione cifrata del pacchetto è di 11 byte, il MAC è di 5 byte e il CRC è ottenuto da ogni byte sottoposto a XOR con un altro (prima della cifratura), accade qualcosa di interessante. Poiché il MAC viene sottoposto a XOR due volte, possiamo calcolare il checksum anche senza conoscere l'indirizzo MAC. Questo perché l'indirizzo MAC è presente per intero due volte, e fare XOR di un numero con se stesso (o fare XOR del MAC con il MAC) si annulla. L'11° byte è di nuovo il primo byte del MAC, che sappiamo essere sempre 0xCD. Questo ci consente di eseguire altri attacchi, come alterare la pressione del tasto e il CRC, ancora una volta senza conoscere l'indirizzo MAC. Presenterò questo e altre divertenti dimostrazioni in un progetto futuro.
Una pagina della presentazione del KeyKeriki dimostra il processo di decrittazione:
Il nostro metodo di decrittazione, implementato nel codice sorgente di 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) Costruire / Usurpare un Caricabatterie USB
**AVVERTENZA: I dispositivi che si collegano alla rete elettrica AC utilizzano alimentazione ad alta tensione, e il dispositivo che stiamo creando, che si collega alla AC, non è sicuro, né soddisfa i tipici standard di sicurezza elettrica. Questo è un dispositivo pericoloso e, se usato o costruito in modo improprio, può uccidere, causare incendi o altri gravi danni. Non costruire un dispositivo alimentato a AC se non sai quello che stai facendo. Se desideri continuare a costruire questo dispositivo ma senza alimentazione AC, usa semplicemente una batteria o alimenta il dispositivo direttamente via USB per seguire la guida in sicurezza.**
KeySweeper utilizza hardware estremamente compatto e a bassissimo consumo per rimanere il più possibile nascosto. KeySweeper può essere alimentato da una batteria o da una tensione DC di circa 3-20V. Poiché desideriamo mantenere KeySweeper sempre alimentato, lo installiamo di nascosto all'interno di un innocente caricabatterie USB da parete che ci aspettiamo sia sempre collegato alla presa.
Nel caso in cui il caricabatterie USB venga scollegato, KeySweeper continua silenziosamente il suo funzionamento utilizzando la sua batteria interna (opzionale). Nel momento in cui KeySweeper viene ricollegato, torna a utilizzare l'alimentazione AC e contemporaneamente ricarica la batteria.
Se stai semplicemente costruendo KeySweeper **senza** la scheda GSM, puoi inserire tutto in un tipico caricabatterie USB da parete AC. Ti suggerisco di cercarne uno che abbia una vite che lo tiene assemblato, poiché la maggior parte degli altri è sigillata e richiede la distruzione di una parte del dispositivo per poterlo aprire.
[](http://samy.pl/keysweeper/usbopen.jpg)
Se decidi di usare la scheda GSM, ho scoperto che non entra in questo tipo di caricabatterie USB insieme al resto dell'elettronica. Tuttavia, ho scoperto che aprendo un caricabatterie USB più piccolo (simile ai caricabatterie USB per iPhone), troviamo un raddrizzatore (AC->DC) e un convertitore step-down (alta tensione->5V) molto più piccoli che permettono a **tutta** la nostra elettronica di entrare nel caricabatterie USB più grande.
[](http://samy.pl/keysweeper/usbcharger1.jpg)
[](http://samy.pl/keysweeper/usbcharger2.jpg)
La mia amica Dana mi ha prestato il suo saldatore per bambole. Non capisco bene a cosa le serva, ma è un saldatore con una lametta agganciabile. È ottimo per tagliare la plastica e, presumo, le bambole. Mi ha ripreso il saldatore appena le ho spiegato cosa avrebbe fatto il dispositivo. A quanto pare non approva, anche se non sono sicuro del perché. Sono certo che lo scoprirò dopo aver sniffato altre sequenze di tasti dalla sua tastiera.
[](http://samy.pl/keysweeper/usbcharger3.jpg)
[](http://samy.pl/keysweeper/usbchargeropen.jpg)
**AVVERTENZA: Ancora una volta, poiché abbiamo a che fare con l'alimentazione AC, questo è molto pericoloso. Non aprire/ricablare un dispositivo alimentato a AC se non sai quello che stai facendo.** Puoi comunque costruire KeySweeper semplicemente alimentando tutto da un caricabatterie USB, da una porta USB o da una batteria senza modificare un dispositivo basato su AC.
È anche importante collegare il nostro Arduino tramite la porta RAW all'alimentazione USB da 5V con la polarità corretta (negativo su GND, positivo su RAW). In questo caso, sto usando un Arduino Pro Mini da 3.3V. La porta RAW accetta tensione non regolata tra 3.35-12V e utilizza un regolatore di tensione integrato per portarla a 3.3V. Nota che il nostro chip nRF24L01+ richiede 1.9-3.6V, quindi fornirgli 5V è **troppo!** Inoltre, se stai usando un chip SPI come il [SST25VF016B](http://ww1.microchip.com/downloads/en/DeviceDoc/S71271_04.pdf), richiede 2.7-3.6V, quindi anche in questo caso usare 5V è **troppo!** Assicurati di usare i 3.3V regolati dall'Arduino (dal pin VCC su un Arduino da 3.3V, o dal pin 3V3 su un Arduino da 5V.)
[](http://samy.pl/keysweeper/multimeter.jpg)
*nota: la scheda USB raffigurata accanto al multimetro è quella originale, prima che decidessi di sostituirla con una più piccola per farci entrare anche la scheda GSM*
Dopo aver recuperato tutto il nostro hardware, possiamo vedere che entra tutto con spazio nel nostro caricabatterie (prima del cablaggio):
[](http://samy.pl/keysweeper/testingsize.jpg)
Per divertimento, ho collegato il LED del caricabatterie al pin 6 dell'Arduino e, anche se il LED sembra comportarsi allo stesso modo, in realtà gli faccio emettere un lampeggio quando intercetta sequenze di tasti. Questo probabilmente farà saltare la tua copertura, ma è davvero divertente da guardare. Mi assicuro anche che il LED si spenga quando viene meno l'alimentazione AC, anche se il resto del dispositivo continua a funzionare con la batteria interna.
Vogliamo anche assicurarci di lasciare il resto del caricabatterie USB funzionante, così che altri dispositivi possano continuare a ricevere alimentazione dal caricabatterie USB.

-----
# (U) KeySweeper Secondario Opzionale
Se desideri rinunciare alla scheda GSM per contenere i costi, puoi creare un dispositivo KeySweeper secondario che contiene semplicemente un Arduino e un nRF24L01+. Durante la compilazione di quello secondario, decommenta `#define BACKTRACER 1`.
Il funzionamento è questo: se il KeySweeper secondario (BACKTRACER) si trova mai nel raggio di comunicazione wireless (usando il nRF24L01+ a 2.4GHz) del primo, rileva automaticamente l'esistenza del primo e il dispositivo KeySweeper iniziale scaricherà i suoi log sul BACKTRACER. L'autorilevamento è integrato in entrambi i KeySweeper così possono trovarsi rapidamente a vicenda, grazie alla capacità del nRF24L01+ di avere più pipe RX.
Se colleghi il BACKTRACER a un computer, i keylog verranno scaricati sulla porta seriale, e puoi inviare un comando 'E' sulla porta seriale per cancellare il contenuto del chip di memoria SPI Flash del KeySweeper originale, ora che ne hai ottenuto il contenuto. Puoi allontanarti lasciando che il KeySweeper originale continui a intercettare le sequenze di tasti.
-----
# (U) Schema Elettrico
Fai clic per la versione ingrandita (schema basato su FONA), oppure [fai clic qui](http://samy.pl/keysweeper/keysweeper.fzz) per il file Fritzing.
[](http://samy.pl/keysweeper/keysweeper2_schem.png)
-----
# (U) Contatti
**Punto di contatto:** [@SamyKamkar](https://twitter.com/samykamkar)
Puoi vedere altri miei progetti su <http://samy.pl> o contattarmi a <[email protected]>.
------