
Vulnerabilità di iniezione dei tasti nei presentatori wireless
Avevo voglia di fare un po' di reverse engineering RF, quindi ho ordinato alcuni clicker per presentazioni e mi sono divertito un po'.
Questo è un fork di nrf-research-firmware (che ho scritto qualche anno fa presso Bastille). Ho aggiunto il supporto per alcuni nuovi ricetrasmettitori/protocolli e incluso POC di iniezione di tasti per 13 comuni clicker per presentazioni.
| Produttore | Modello | Protocollo | RFIC | Aggiunto |
|---|---|---|---|---|
| AmazonBasics | P-001 | AmazonBasics P-001 | nRF24 | 2019-04-20 |
| Canon | PR100-R | Canon PR100-R | PL1167 | 2019-04-20 |
| Funpick | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| AMERTEER | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| BEBONCOOL | D100 | HS304 | HS304 | 2019-04-20 |
| ESYWEN | Wireless Presenter | HS304 | HS304 | 2019-04-20 |
| Red Star Tech | PR-819 | HS304 | HS304 | 2019-04-20 |
| DinoFire | D06-DF-US | HS304 | HS304 | 2019-04-20 |
| TBBSC | DSIT-60 | TBBSC DSIT-60 | BK2451 | 2019-04-21 |
| Rii | Wireless Presenter | Rii Wireless Presenter | BK2451 | 2019-04-21 |
| Logitech | R400 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R800 | Logitech Unencrypted | nRF24 | 2019-04-21 |
| Logitech | R500 | Logitech Encrypted | nRF24 | 2019-04-21 |
Questo è il protocollo standard per tastiere Logitech cifrato, come usato dalla R500. È in qualche modo vulnerabile all'attacco di "iniezione di tasti cifrata" che ho documentato con le tastiere Logitech Unifying nell'ambito del progetto MouseJack.
Dico in qualche modo perché non tutti gli scan code HID vengono accettati. Nello specifico, 0x04-0x1D (A-Z) vengono sostituiti da 0x00 quando il dongle invia il pacchetto al computer host, il che significa che possiamo iniettare qualunque cosa vogliamo, purché non sia una lettera. L'altra eccezione è che le combinazioni di tasti con ctrl sono consentite, anche quando includono lettere.
Un'iniezione di tasti efficace tramite la R500 richiede un po' di creatività.
Supponiamo che il bersaglio si trovi in una sessione bash. In bash, possiamo codificare i nostri caratteri in base-8, codificando i comandi che contengono lettere e che vogliamo che il bersaglio esegua.
Per esempio, ping google.com viene codificato come $'\160\151\156\147' $'\147\157\157\147\154\145\056\143\157\155'. Se inviamo questa stringa a una sessione bash e poi inviamo enter, il comando ping google.com verrà eseguito sulla macchina bersaglio.
Puoi trovare l'indirizzo del tuo Logitech R500 usando nrf24-scanner come segue:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
I pacchetti dovrebbero apparire più o meno così:
[2019-04-21 13:11:52.507] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.515] 62 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 13:11:52.523] 62 22 85:D1:9D:FE:07 00:D3:4D:6F:B6:1B:E6:05:A2:B4:8B:98:F9:C2:00:00:00:00:00:00:00:81
L'iniezione è possibile perché il dongle non impone l'incremento dei contatori AES, quindi puoi riprodurre i pacchetti. Un pacchetto inviato OTA è composto da un payload USB HID cifrato in modalità AES counter, seguito dal contatore. Quando premi un pulsante sul clicker per presentazioni, viene generato un pacchetto key down e un pacchetto key up. Il pacchetto key up è composto interamente da 0, il che ci fornisce un materiale di chiave pulito e riutilizzabile: possiamo farne lo XOR con il nostro payload e inviarlo OTA.
Non dovrebbe essere difficile automatizzare il processo di ascolto di una pressione di un pulsante, estraendo il secondo pacchetto (key up) e usandolo automaticamente come riferimento per il materiale di chiave. Ma sono pigro, quindi dovrai prima osservare tu stesso una pressione di un pulsante, che appare così:
[2019-04-21 16:02:56.451] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.459] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.468] 65 22 85:D1:9D:FE:07 00:D3:E6:7B:35:8C:BB:2C:7D:5B:8B:98:FA:76:00:00:00:00:00:00:00:B9
[2019-04-21 16:02:56.475] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.507] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.516] 65 22 85:D1:9D:FE:07 00:D3:99:D6:D3:8D:49:25:F5:4D:8B:98:FA:77:00:00:00:00:00:00:00:1A
[2019-04-21 16:02:56.524] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
[2019-04-21 16:02:56.532] 65 5 85:D1:9D:FE:07 00:40:00:08:B8
Il secondo pacchetto da 22 byte è il pacchetto key-up.
Rimuovi l'ultimo byte del payload e copia e incolla la stringa in logitech.py, sostituendo KEYUP_REF.
(Non dovrebbe funzionare senza aggiornare KEYUP_REF, ma se funziona, fammelo sapere!)
Inietta la sequenza di tasti codificata in base-8 del comando bash ping google.com in uno specifico dongle Logitech R500 (indirizzo 85:D1:9D:FE:07):
sudo ./tools/r500-injector.py -l -a 85:D1:9D:FE:07
Questo è il protocollo Logitech non cifrato standard, usato dai modelli R400/R800.
Puoi trovare l'indirizzo del tuo Logitech R400/R800 usando nrf24-scanner come segue:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
I pacchetti dovrebbero apparire più o meno così:
[2019-04-21 12:58:43.466] 32 0 9D:9E:95:52:07
[2019-04-21 12:58:43.620] 32 10 9D:9E:95:52:07 00:C1:00:00:00:00:00:00:00:3F
Inietta la sequenza di tasti di prova in uno specifico dongle Logitech R400/R800 (indirizzo 9D:9E:95:52:07):
sudo ./tools/preso-injector.py -l -f logitech -a 9D:9E:95:52:07
Il Rii Wireless Presenter (a forma di penna) è basato sul BK2451 (che sembra essere un clone del nRF24). Sembra un protocollo generico, vista la diffusione di dispositivi gemelli, quindi probabilmente lo ricategorizzerò dopo aver raccolto altri dati.
È funzionalmente una tastiera wireless non cifrata, vulnerabile all'iniezione di tasti.