R0ket Keyboard sniffer: Difference between revisions

From
Jump to navigation Jump to search
 
(43 intermediate revisions by the same user not shown)
Line 1: Line 1:
=Einleitung=
=Einleitung=
Die R0ket wurde als Badge auf dem Chaos Communication Camp 2011 verteilt. Sie beinhaltet unter anderem einen Nordic VLSI nRF24L01+ chip, welcher im 2,4 GHz Spektrum funkt. Derselbe Chip wird in vielen Funklösungen verwendet, z.B. in Funkkeyboards von Microsoft oder in TurningPoint ResponseCard RF ("Clicker"). Wie Max Moser und Thorsten Schröder in ihrem KeyKeriki V2.0 Projekt gezeigt haben, kann der nRF24L01+ auch zum sniffen von Datenübertragungen verwendet werden.
Die R0ket wurde als Badge auf dem Chaos Communication Camp 2011 verteilt. Sie beinhaltet unter anderem einen Nordic VLSI nRF24L01+ Chip, welcher im Spektrum um 2,4 GHz funkt. Derselbe Chip wird in vielen Funklösungen verwendet, z.B. in Funktastaturen von Microsoft oder in TurningPoint ResponseCard RF ("Clicker"). Wie Max Moser und Thorsten Schröder in ihrem KeyKeriki V2.0 Projekt gezeigt haben, kann der nRF24L01+ auch zum Sniffen von Datenübertragungen verwendet werden.
Travis Goodspeed hat Code für das Next Hope Badge entwickelt, um das Microsoft Wireless Comfort Desktop Kit abzuhören. Dieser Code soll nun auf die R0ket portiert werden.
Travis Goodspeed hat Code für das Next Hope Badge entwickelt, um das Microsoft Wireless Comfort Desktop Kit abzuhören. Dieser Code soll nun auf die R0ket portiert werden, also an die Hardware angepasst und von Python nach C umgeschrieben werden.


==Vorraussetzungen==
==Vorraussetzungen==
Line 7: Line 7:
# R0ket
# R0ket
# geeignetes MS Keyboard (mit einem nRF24L01+)
# geeignetes MS Keyboard (mit einem nRF24L01+)
# cross-compiler (siehe auch [http://r0ket.badge.events.ccc.de/build http://r0ket.badge.events.ccc.de/build])
# ...


==Vorgehensweise==
==Vorgehensweise==
Folgende Punkte sollen zum sniffen des Keyboards abgearbeitet werden:
Folgende Punkte sollen zum Sniffen des Keyboards abgearbeitet werden:
* Zunächst werden die Register des Chips so konfiguriert, dass überhaupt Pakete empfangen werden können. (Siehe Theoretisches)
* Zunächst werden die Register des Chips so konfiguriert, dass überhaupt Pakete empfangen werden können. (Siehe [[#Theoretisches zum Finden der MAC-Adresse des Keyboards]])
* Die empfangenen Pakete enthalten auch viel Noise. Es werden solche herausgefiltert, die tatsächlich zum Keyboard gehören. Dadurch lässt sich nun auch die MAC-Adresse des Keyboards finden.
* Die empfangenen Pakete enthalten auch viel Noise. Es werden zunächst die Frequenz und die Bitrate der Tastatur bestimmt und solche Pakete herausgefiltert, die tatsächlich zum Keyboard gehören. Dadurch lässt sich nun auch die MAC-Adresse des Keyboards finden.
*Mit der gefundenen Adresse wird gezielt das Keyboard ausgehorcht. Die Pakete müssen noch entschlüsselt werden.
*Mit der gefundenen Adresse wird gezielt das Keyboard ausgehorcht. Die Pakete müssen noch entschlüsselt werden.


==Aktueller Stand==
==Bisher Erreichtes==
* Eigene Programme können auf die R0ket geladen werden.
Die R0cket zeigt an, dass sie Pakete empfängt. Allerdings scheitern wir noch daran, diese auszulesen.
* Register des Chips wurden konfiguriert, um einen Empfang zu ermöglichen.
* Die R0cket zeigt an, dass sie Pakete empfängt. Diese können wir nun auch auslesen.
* Wir sind wir dabei, die Pakete auf mögliche MAC-Adressen zu untersuchen, bzw. die Frequenz und die Bitrate der Tastatur herauszufinden.
* Mehr wurde in den zwei Wochen leider nicht erreicht.


=Programmierung der R0cket=
=Programmierung der R0cket=
==Code auf die R0cket laden==
...
Zunächst folgt man der Anleitung unter [http://r0ket.badge.events.ccc.de/build http://r0ket.badge.events.ccc.de/build].
Das größte Problem hierbei ist, unter Punkt 4 nach dem Starten des Autoflashers die R0ket im ISP-Modus zu starten. Dazu muss der Joystick nach links gedrückt werden, während man die R0ket einschaltet. :)

==Nützliche Funktionen um auf den Funkchip zuzugreifen==
Um die Pakete aus dem Chip auszulesen, kann man die Funktion nrf_rcv_pkt_time_encr() von der r0ket firmware benutzen. Allerdings, da ja wichitg ist CRC auszuschalten, muss diese angepasst werden:

Den Code findet man hier:
[https://github.com/Kaczmarczyck/r0ket/blob/486d3e07b08f185346a41a79e485f2999ddaf2ea/firmware/applications/radi0.c radi0.c]

Außerdem sind folgende Funktionen nützlich, um auf die Register und das Display zuzugreifen: (Beispiele)

nrf_read_reg(0x07);
nrf_write_reg(0x07, 0x4E);

lcdClear();
lcdPrintln("Receiving...");
DoInt(x, y, 0x42);


=Theoretisches zum Finden der MAC-Adresse des Keyboards=
=Theoretisches zum Finden der MAC-Adresse des Keyboards=
==Aufbau der Datenpakete==
==Aufbau der Datenpakete==

Die gesendeten Pakete beginnen normalerweise mit einer Preambel, gefolgt von ein SYNC-field. Die Preambel ist dabei entweder AA oder EE (sich abwechselnde 0en und 1en), je nachdem, ob das erste bit des SYNC-field 1 oder 0 ist. Die Preambel zeigt an, dass ein Paket beginnt.
[[Image:Packet.jpg]]
Das SYNC-field dient dazu, den Rest des Paketes bitweise zu synchronisieren. Bei den nRF24L01+ chips dient die MAC-Adresse als SYNC-field, ist also von Gerät zu Gerät unterschiedlich. Zusätzlich erlaubt der Chip keine MAC-Adressen, die kürzer als 3 Byte sind, was im Folgenden umgangen werden soll.

Die gesendeten Pakete beginnen normalerweise mit einer Präambel, gefolgt von ein SYNC-Feld. Danach beginnen erst die eigentlichen zu übermittelnden Daten, welche vom Chip beim Empfang weitergegeben werden.

Die Preambel ist dabei entweder 0xAA oder 0x55 (sich abwechselnde 0en und 1en), je nachdem, ob das erste bit des SYNC-field 1 oder 0 ist. Die Präambel zeigt an, dass ein Paket beginnt.
Das SYNC-Feld dient dazu, den Rest des Paketes Byteweise zu synchronisieren, sodass die Daten korrekt gelesen werden können. Bei den nRF24L01+ chips wird die MAC-Adresse für das SYNC-Feld benutzt, ist also von Gerät zu Gerät unterschiedlich. Ziel ist es also, irgendwie das SYNC-Feld auszulesen, um an die MAC-Adresse der Tastatur zu gelangen.


==Ausnutzen der Preambel==
==Ausnutzen der Preambel==
Um mit dem Chip Pakete zu empfangen, müssen drei Dinge stimmen:
Der Trick von Travis Goodspeed nutzt um Pakete empfangen zu können, die den SYNC-Teil als Payload enthalten, ein paar unzulässige Registereinstelungen und Hintergrundnoise aus. Es wird wie folgt vorgegangen:
*die 8-bit Präambel (0xAA oder 0x55)
(1) Limitieren der MAC-Adresse auf 2 Byte
*die 3-5 Byte Adresse, welche man zuvor bestimmt hat
(2) Ausschalten von CRC (Checksummen)
*CRC (wenn eingestellt)
(3) Setzten der MAC auf den Wert der Preambel
(4) Durchsuchen des empfangenen Noise auf eine gültige MAC-Adresse


Der Trick von Travis Goodspeed ist nun, schon mit dem Empfang eines Paketes anzufangen, bevor tatsächlich eine Präambel gesendet wurde. Dazu wird das vorhandene Hintergrundrauschen ausgenutzt. Dieses enthält viele 0xAA, 0x55 und 0x00. Es wird wie folgt vorgegangen:
Die Idee ist, anzufangen ein Paket zu empfangen, bevor tatsächliche ein SYNC-field gesendet wurde, denn der Chip übermittelt nicht Adressen eines Paketes, sondern nur die Payload. Um die MAC-Adresse zu ermitteln, ist es aber wichtig, den SYNC-Teil auszuwerten. Hintergrundnoise enthält viele 0x00 und 0xFF Pakete und auch viele 0xAA und 0x55. Wenn nun die Adresse auf 0x00AA oder 0x0055 gesetzt wird, kann der eigentliche SYNC-Teil als Payload empfangen werden. Zum Beispiel:
Gesendetes Paket: 0x550102030201BEEF, Preambel: 0x55, SYNC: 0x0102030201, Payload: 0xBEEF
Empfangenes Paket: 0x5500550102030201BEEF, Preambel: 0x55, SYNC: 0x0055, Payload: 0x0102030201BEEF


*(1) Limitieren der MAC-Adresse auf 2 Byte
Das Datenblass zum Chip enthält die nötigen Funktionen zu den Registern. [[#Literatur und Links]]
*(2) Ausschalten von CRC (Checksummen)
*(3) Enhanced Shockburst deaktivieren
*(4) Setzen der MAC auf den Wert der Präambel
*(5) Durchsuchen des empfangenen Noise auf eine gültige MAC-Adresse


(1) kann erreicht werden, indem das entsprechende Register 0x03, welches für die Adresslänge zuständig ist, auf den unzulässigen Wert 0x00 gesetzt wird. Checksummen lassen sich im Reg 0x00 ausschalten. Die Adresse lässt sich im Register 0x0A festlegen. Wenn diese nun noch auf 0x00AA oder 0x0055 gesetzt wird (das zweite Byte ist die Präambel des gesendeten Paketes), können einige der von der Tastatur gesendeten Pakete empfangen werden, wenn ihnen der richtige Noise vorangeht (0x5500). Nun ist das SYNC-Feld des gesendeten Paketes in der Payload des empfangenen Paketes enthalten.
Zunächst soll die Adresse auf ein absolutes Minimum reduziert werden. Dazu wird Reg 0x03, welches für die Adresslänge zuständig ist, auf 0x00 gesetzt, obwohl dies laut Datenblatt unzulässig ist.
Checksummen lassen sich im Reg 0x00 ausschalten. Die Adresse lässt sich im Register 0x0a festlegen.
Dies resultiert in einer großen Menge an falschen Paketen, die aus dem Hintergrundnoise entstehen. Aus diesen müssen nun noch die tatsächlich vom Keyboard gesendeten Pakete herausfiltert werden.


Beispiel:
=Probleme=

Folgende Probleme traten bei der Einrichtung bzw. beim Testen der Kommunikation auf.
Gesendetes Paket: 0x550102030201BEEF, Preambel: 0x55, SYNC: 0x0102030201, Payload: 0xBEEF
* ...
Empfangenes Paket: 0x5500550102030201BEEF, Preambel: 0x55, SYNC: 0x0055, Payload: 0x0102030201BEEF

Das Datenblatt zum Chip enthält die nötigen Einstellungen der Register. [[#Literatur und Links]]

Dies führt zu einer großen Menge an falschen Paketen, die aus dem Hintergrundnoise entstehen. Aus diesen müssen nun noch die tatsächlich vom Keyboard gesendeten Pakete herausfiltert werden. Travis untersuchte, dass dadurch etwa 1 von 20 Paketen der Tastatur empfangen werden kann.

==MAC-Adresse finden im Datenstrom==
MAC Adressen sind 3 bis 5 Byte lang. Dies lässt sich nun ausnutzen, um aus den empfangenen Paketen die häufigsten Adressen herauszufiltern.
Es ist möglich, Checksummen manuell zu prüfen, um gültige Adressen herauszufinden. EInfacher ist es jedoch, einfach nach den Häufigkeiten der auftretenden Adressen zu gehen.

Wir beginnen damit, die Pakete zunächst nur auf die ersten 3 Byte zu untersuchen. Eine Schwierigkeit dabei ist allerdings, dass zuerst die Frequenz (128 mögliche), die Bitrate (2MB/s, 1MB/s, 250kb/s) und die Präambel (0xAA oder 0x55) der Tastatur herauszufinden.
Zu jeder solchen Konfiguration werden nun einige viele Pakete empfangen und dann ausgewertet, welche 3-Byte-Kette am häufigsten bei dieser Konfiguration auftaucht. Die Konfiguration mit den meisten Übereinstimmungen sollte hoffentlich zum Keyboard gehören (sofern es in dieser Zeit gesendet hat).
Nun muss nur noch überprüft werden, ob die tatsächliche MAC-Adresse eventuell 4 oder 5 Byte lang ist.

Da der Noise viele Ketten 0xAAAAAA, 0x555555, 0x000000 und 0xFFFFFF enthält, müssen diese als mögliche Adressen ausgeschlossen werden bei der Auswertung.

==Texte vom Keyboard entschlüsseln==
Sobald die MAC-Adresse ermittelt wurde, kann man diese zum Ausspähen des KEyboards verwenden und muss nicht mehr den sehr Noise-anfälligen Umweg über die Präambel nehmen. Allerdings sind die Pakete verschlüsselt und zwar wird die MAC-Adresse als "XOR-Schlüssel" verwendet. Das Paket besteht aus einem unverschlüsselten 4-Byte Header, gefolgt von einem verschlüsselten Teil, der auch die HID-ID enthält. Mehr dazu findet man im Keykiriky-Projekt. (siehe "Literatur und Links")


=Literatur und Links=
=Literatur und Links=
Line 53: Line 96:


[http://r0ket.badge.events.ccc.de/ R0ket]
[http://r0ket.badge.events.ccc.de/ R0ket]

[http://www.nordicsemi.com/eng/content/download/2726/34069/file/nRF24L01P_Product_Specification_1_0.pdf Datasheet des nRF24L01+]

[https://github.com/Kaczmarczyck/r0ket/blob/486d3e07b08f185346a41a79e485f2999ddaf2ea/firmware/applications/radi0.c radi0.c - bisheriger Code für den R0ket Keyboard Sniffer]

[https://github.com/Kaczmarczyck/r0ket/blob/master/vortrag/Vortrag_Fabian_Katja.pdf Folien des Vortrags zum Sniffen mit der r0ket]

Latest revision as of 12:26, 14 October 2011

Einleitung

Die R0ket wurde als Badge auf dem Chaos Communication Camp 2011 verteilt. Sie beinhaltet unter anderem einen Nordic VLSI nRF24L01+ Chip, welcher im Spektrum um 2,4 GHz funkt. Derselbe Chip wird in vielen Funklösungen verwendet, z.B. in Funktastaturen von Microsoft oder in TurningPoint ResponseCard RF ("Clicker"). Wie Max Moser und Thorsten Schröder in ihrem KeyKeriki V2.0 Projekt gezeigt haben, kann der nRF24L01+ auch zum Sniffen von Datenübertragungen verwendet werden. Travis Goodspeed hat Code für das Next Hope Badge entwickelt, um das Microsoft Wireless Comfort Desktop Kit abzuhören. Dieser Code soll nun auf die R0ket portiert werden, also an die Hardware angepasst und von Python nach C umgeschrieben werden.

Vorraussetzungen

Es wird folgende Hard- und Software benötigt:

  1. R0ket
  2. geeignetes MS Keyboard (mit einem nRF24L01+)
  3. cross-compiler (siehe auch http://r0ket.badge.events.ccc.de/build)

Vorgehensweise

Folgende Punkte sollen zum Sniffen des Keyboards abgearbeitet werden:

  • Zunächst werden die Register des Chips so konfiguriert, dass überhaupt Pakete empfangen werden können. (Siehe #Theoretisches zum Finden der MAC-Adresse des Keyboards)
  • Die empfangenen Pakete enthalten auch viel Noise. Es werden zunächst die Frequenz und die Bitrate der Tastatur bestimmt und solche Pakete herausgefiltert, die tatsächlich zum Keyboard gehören. Dadurch lässt sich nun auch die MAC-Adresse des Keyboards finden.
  • Mit der gefundenen Adresse wird gezielt das Keyboard ausgehorcht. Die Pakete müssen noch entschlüsselt werden.

Bisher Erreichtes

  • Eigene Programme können auf die R0ket geladen werden.
  • Register des Chips wurden konfiguriert, um einen Empfang zu ermöglichen.
  • Die R0cket zeigt an, dass sie Pakete empfängt. Diese können wir nun auch auslesen.
  • Wir sind wir dabei, die Pakete auf mögliche MAC-Adressen zu untersuchen, bzw. die Frequenz und die Bitrate der Tastatur herauszufinden.
  • Mehr wurde in den zwei Wochen leider nicht erreicht.

Programmierung der R0cket

Code auf die R0cket laden

Zunächst folgt man der Anleitung unter http://r0ket.badge.events.ccc.de/build. Das größte Problem hierbei ist, unter Punkt 4 nach dem Starten des Autoflashers die R0ket im ISP-Modus zu starten. Dazu muss der Joystick nach links gedrückt werden, während man die R0ket einschaltet. :)

Nützliche Funktionen um auf den Funkchip zuzugreifen

Um die Pakete aus dem Chip auszulesen, kann man die Funktion nrf_rcv_pkt_time_encr() von der r0ket firmware benutzen. Allerdings, da ja wichitg ist CRC auszuschalten, muss diese angepasst werden:

Den Code findet man hier: radi0.c

Außerdem sind folgende Funktionen nützlich, um auf die Register und das Display zuzugreifen: (Beispiele)

 nrf_read_reg(0x07);
 nrf_write_reg(0x07, 0x4E);
 lcdClear();
 lcdPrintln("Receiving...");
 DoInt(x, y, 0x42);

Theoretisches zum Finden der MAC-Adresse des Keyboards

Aufbau der Datenpakete

Packet.jpg

Die gesendeten Pakete beginnen normalerweise mit einer Präambel, gefolgt von ein SYNC-Feld. Danach beginnen erst die eigentlichen zu übermittelnden Daten, welche vom Chip beim Empfang weitergegeben werden.

Die Preambel ist dabei entweder 0xAA oder 0x55 (sich abwechselnde 0en und 1en), je nachdem, ob das erste bit des SYNC-field 1 oder 0 ist. Die Präambel zeigt an, dass ein Paket beginnt. Das SYNC-Feld dient dazu, den Rest des Paketes Byteweise zu synchronisieren, sodass die Daten korrekt gelesen werden können. Bei den nRF24L01+ chips wird die MAC-Adresse für das SYNC-Feld benutzt, ist also von Gerät zu Gerät unterschiedlich. Ziel ist es also, irgendwie das SYNC-Feld auszulesen, um an die MAC-Adresse der Tastatur zu gelangen.

Ausnutzen der Preambel

Um mit dem Chip Pakete zu empfangen, müssen drei Dinge stimmen:

  • die 8-bit Präambel (0xAA oder 0x55)
  • die 3-5 Byte Adresse, welche man zuvor bestimmt hat
  • CRC (wenn eingestellt)

Der Trick von Travis Goodspeed ist nun, schon mit dem Empfang eines Paketes anzufangen, bevor tatsächlich eine Präambel gesendet wurde. Dazu wird das vorhandene Hintergrundrauschen ausgenutzt. Dieses enthält viele 0xAA, 0x55 und 0x00. Es wird wie folgt vorgegangen:

  • (1) Limitieren der MAC-Adresse auf 2 Byte
  • (2) Ausschalten von CRC (Checksummen)
  • (3) Enhanced Shockburst deaktivieren
  • (4) Setzen der MAC auf den Wert der Präambel
  • (5) Durchsuchen des empfangenen Noise auf eine gültige MAC-Adresse

(1) kann erreicht werden, indem das entsprechende Register 0x03, welches für die Adresslänge zuständig ist, auf den unzulässigen Wert 0x00 gesetzt wird. Checksummen lassen sich im Reg 0x00 ausschalten. Die Adresse lässt sich im Register 0x0A festlegen. Wenn diese nun noch auf 0x00AA oder 0x0055 gesetzt wird (das zweite Byte ist die Präambel des gesendeten Paketes), können einige der von der Tastatur gesendeten Pakete empfangen werden, wenn ihnen der richtige Noise vorangeht (0x5500). Nun ist das SYNC-Feld des gesendeten Paketes in der Payload des empfangenen Paketes enthalten.

Beispiel:

 Gesendetes Paket: 0x550102030201BEEF, Preambel: 0x55, SYNC: 0x0102030201, Payload: 0xBEEF
 Empfangenes Paket: 0x5500550102030201BEEF, Preambel: 0x55, SYNC: 0x0055, Payload: 0x0102030201BEEF

Das Datenblatt zum Chip enthält die nötigen Einstellungen der Register. #Literatur und Links

Dies führt zu einer großen Menge an falschen Paketen, die aus dem Hintergrundnoise entstehen. Aus diesen müssen nun noch die tatsächlich vom Keyboard gesendeten Pakete herausfiltert werden. Travis untersuchte, dass dadurch etwa 1 von 20 Paketen der Tastatur empfangen werden kann.

MAC-Adresse finden im Datenstrom

MAC Adressen sind 3 bis 5 Byte lang. Dies lässt sich nun ausnutzen, um aus den empfangenen Paketen die häufigsten Adressen herauszufiltern. Es ist möglich, Checksummen manuell zu prüfen, um gültige Adressen herauszufinden. EInfacher ist es jedoch, einfach nach den Häufigkeiten der auftretenden Adressen zu gehen.

Wir beginnen damit, die Pakete zunächst nur auf die ersten 3 Byte zu untersuchen. Eine Schwierigkeit dabei ist allerdings, dass zuerst die Frequenz (128 mögliche), die Bitrate (2MB/s, 1MB/s, 250kb/s) und die Präambel (0xAA oder 0x55) der Tastatur herauszufinden. Zu jeder solchen Konfiguration werden nun einige viele Pakete empfangen und dann ausgewertet, welche 3-Byte-Kette am häufigsten bei dieser Konfiguration auftaucht. Die Konfiguration mit den meisten Übereinstimmungen sollte hoffentlich zum Keyboard gehören (sofern es in dieser Zeit gesendet hat). Nun muss nur noch überprüft werden, ob die tatsächliche MAC-Adresse eventuell 4 oder 5 Byte lang ist.

Da der Noise viele Ketten 0xAAAAAA, 0x555555, 0x000000 und 0xFFFFFF enthält, müssen diese als mögliche Adressen ausgeschlossen werden bei der Auswertung.

Texte vom Keyboard entschlüsseln

Sobald die MAC-Adresse ermittelt wurde, kann man diese zum Ausspähen des KEyboards verwenden und muss nicht mehr den sehr Noise-anfälligen Umweg über die Präambel nehmen. Allerdings sind die Pakete verschlüsselt und zwar wird die MAC-Adresse als "XOR-Schlüssel" verwendet. Das Paket besteht aus einem unverschlüsselten 4-Byte Header, gefolgt von einem verschlüsselten Teil, der auch die HID-ID enthält. Mehr dazu findet man im Keykiriky-Projekt. (siehe "Literatur und Links")

Literatur und Links

KeyKeriki V2

Promiscuity is the nRF24L01+'s Duty

R0ket

Datasheet des nRF24L01+

radi0.c - bisheriger Code für den R0ket Keyboard Sniffer

Folien des Vortrags zum Sniffen mit der r0ket