Verbessern des Datenverständnisses
Rocco Gagliardi
In Das Internet und die Dinge haben wir über die verschiedenen Protokolle geredet, die von verschiedenen Geräten zur Kommunikation verwendet werden. Zudem haben wir ein fortgeschrittenes Bild einer Übersicht gezeichnet, wie die Dinge funktionieren sollten.
In diesem Artikel schauen wir uns den RFID-Standard etwas genauer an und spielen mit ein paar Tags vom Typ ISO/IEC 18000-2:2009 (125-135kHz), die vornehmlich zu Identifikationszwecken verwendet werden.
Die Idee ist, die EM4000 RFID Tag-Familie als Beispiel zu nehmen und die involvierten Komponenten zu begutachten und dann ein sehr cooles Tool namens RFIDler zu verwenden um von einem Tag Informationen zu stehlen. Dann werden die Daten schnell emuliert und geklont. RFIDler ist ein Kickstarter-Projekt, das ich im vergangenen Jahr unterstützt habe. Es wird von Aperture Labs Ltd. unterhalten.
Also fügen wir dem Puzzle einige Teile hinzu bevor wir in meinem nächsten Artikel die interessanteren ISO/IEC 14443 Tags, auch als Mifare bekannt, mitsamt NFC-Protokoll unter die Lupe nehmen.
RFID steht für Radio Frequency IDentification, also dem Nutzen elektromagnetischer Felder – und manchmal elektrischen Stroms – um Daten auszutauschen. RFID ist nicht neu. RFID wurde in den 1970er-Jahren erfunden. Zwei Akteure sind involviert: Ein Transceiver wird ein Objekt identifizieren (Transponder), das mit einer spezifischen ID getaggt wurde. Tags können passiv oder aktiv (mit eigener Stromversorgung) sein oder diese zwei Techniken mischen.
In diesem Artikel sehen wir uns nur passive Tags an.
Ein passives Tag ist im Grunde genommen aus einem Chip gemacht, der die Anfrage nach Information verarbeitet und aus einer Antenne. Die Antenne des Transponders empfängt Energie von der Antenne, der Chip sendet die Information digital codiert über ein Analog moduliertes Signal zurück.
Die Modulation (ASK, FSK, PSK) und die Codierung (Manchester, Bi-Phase) kann von Tag zu Tag variieren. Daher empfehle ich Ihnen, die gerade genannten Links durchzulesen, damit sie etwas mit den Begriffen vertraut sind bevor Sie weiterfahren.
Die auf einem solchen Tag gespeicherten Daten sind im Normalfall Wörter. Lesen Sie die 512 bit Read/Write Multi-purpose Contactless Identification Device betreffend der EM4205-EM4305 CMOS integrated circuits und Sie werden sehen, wie die Information auf diesem spezifischen Chip organisiert ist (UID, Userdaten, Passwörter, etc).
Ich habe folgende Infrastruktur benutzt:
Objekt | Version | Beschreibung |
---|---|---|
Macbook | Macbook | Macbook |
Parallels | 11 | Spielt VM auf dem Macbook ab |
Kali | 2.0 | Unsere gewählte Distro |
RFIDler | v022b, 0165-b | Liest Tags |
Tags | n.a. | Einige RFID-Tags |
Das Bild Board Setup zeigt das RFIDler Board (a) und das Setup, das ich für die Tag-Analyse verwendet habe (b). Einige Versuche haben gezeigt, dass sich ein gewisser Abstand zwischen Spule und Tag empfiehlt. Sonst – je nach Spulung des Transponders – können die gelesenen Daten sehr merkwürdig ausfallen.
Das Bild RFID Tags zeigt die Tags, die verwendet werden, amateurhaft durchleuchtet. Sie basieren alle auf dem Standard der EM4×02-Familie, haben aber andere Formen und Spulen.
Schliessen sie das Board an, updaten Sie die Firmware, verbinden Sie mit dem CLI indem Sie das Terminal verwenden.
root@kali2:/etc/udev/rules.d# cat 71-rfidler-lf-cdc-blacklist.rules # place this file in /etc/udev/rules.d and run 'sudo udevadm control --reload-rules' ACTION!="add|change", GOTO="mm_usb_device_blacklist_end" # bootloader mode (microchip ID) ATTRS{idVendor}=="04d8" ATTRS{idProduct}=="003c" MODE:="0666" SYMLINK+="RFIDlerBL" SUBSYSTEM!="tty", GOTO="mm_ignore" # openmoko issued id for rfidler-lf # http://wiki.openmoko.org/wiki/USB_Product_IDs ATTRS{idVendor}=="1d50" ATTRS{idProduct}=="6098" MODE:="0666" SYMLINK+="RFIDler" LABEL="mm_ignore" ATTRS{idVendor}=="1d50" ATTRS{idProduct}=="6098", ENV{ID_MM_DEVICE_IGNORE}="1" LABEL="mm_usb_device_blacklist_end" root@kali2:/var/log# tail kernel.log Oct 6 20:09:42 kali2 kernel: [ 2498.962371] usb 2-1: new full-speed USB device number 3 using uhci_hcd Oct 6 20:09:42 kali2 kernel: [ 2499.115975] usb 2-1: New USB device found, idVendor=1d50, idProduct=6098 Oct 6 20:09:42 kali2 kernel: [ 2499.115980] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 Oct 6 20:09:42 kali2 kernel: [ 2499.115982] usb 2-1: Product: RFIDler-LF Oct 6 20:09:42 kali2 kernel: [ 2499.115984] usb 2-1: Manufacturer: Aperture Labs Ltd. Oct 6 20:09:42 kali2 kernel: [ 2499.115986] usb 2-1: SerialNumber: 49780C1E00E1 Oct 6 20:09:42 kali2 kernel: [ 2499.125379] cdc_acm 2-1:1.0: ttyACM0: USB ACM device root@kali2:/etc/udev/rules.d# ls -lisa /dev/ttyACM0 36833 0 crw-rw-rw- 1 root dialout 166, 0 Oct 6 20:13 /dev/ttyACM0 root@kali2:/etc/udev/rules.d# minicom -D /dev/ttyACM0 -b 115200 RFIDler> version 0114-beta RFIDler> CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7 | VT102 | Offline | ttyACM0 rcc@kali2:~/devel/_hardware/RFIDler/project$ git clone https://github.com/ApertureLabsLtd/RFIDler.git rcc@kali2:~/devel/_hardware/RFIDler/project$ tools/mphidflash-1.6-linux-64 -r -w RFIDler/firmware/Pic32/RFIDler.X/dist/default/production/RFIDler.X.production.hex USB HID device found: 503808 bytes free Device family: PIC32 Erasing... Writing hex file 'RFIDler/firmware/Pic32/RFIDler.X/dist/default/production/RFIDler.X.production.hex':......... ............................................................................................. .. rcc@kali2:~/devel/_hardware/RFIDler/project$ minicom -D /dev/ttyACM0 -b 115200 RFIDler> version 0165-beta
Und schon ist die Testumgebung bereit.
Wir haben das Board, wir haben einige Tags. Das Ziel ist nun, Informationen über die Hardware und die gespeicherten Daten zu finden, diese zu emulieren und zu klonen.
Machen Sie sich bitte mit dem RFIDler CLI vertraut. RFIDler ist ein spezielles Board, gemacht um mit einer spezifischen Familie von RFID-Chips zu arbeiten. Erwarten Sie keine schöne Betriebsanleitung mit Command-Line-Beschreibungen. Sie können die Hilfedatei verwenden, DuckDuckGo und… Versuch um Versuch. Wenn Sie Fragen haben, klonen Sie die Source der Firmware und schauen Sie sich den Code an.
Wir haben es mit elektromagnetischen Feldern zu tun, die ein Signal übertragen. Der erste Schritt ist nun, die em-Charakteristika zu finden: Die Frequenz des Tags und die verwendete Modulation.
Die Modulation (ASK, FSK, PSK) ist die Methode, die das Analogsignal organisiert, sodass es etwas überträgt. Wir sind an der zurückgegebenen Waveform interessiert, damit wir das Signal visuell sehen und kategorisieren können. Lassen wir die maximale Leistung auf das Tag los und sehen wir mal, was zurück kommt. RFIDler kann auch als Signal Sniffer dienen. Der passende CLI-Befehl lautet:
*ASKRAW> ANALOGUE 1000 <?xml version="1.0" encoding="UTF-8"?> <RFIDler_Samples> <Description>RFIDler Analogue Coil Samples</Description> <Tag> <Description>Tag Settings</Description> <Tag_Type> <Description>Tag Type</Description> <Data>UNIQUE</Data> </Tag_Type> <Modulation> <Description>Modulation Scheme</Description> <Data>ASK/OOK</Data> </Modulation> <Data_Rate> <Description>Data Rate (Frame Clocks)</Description> <Data>64</Data> </Data_Rate> </Tag> <Pots> <Description>Potentiometer Settings (Decimal)</Description> <Pot_High> <Description>Potentiometer High Setting</Description> <Data>255</Data> </Pot_High> <Pot_Low> <Description>Potentiometer Low Setting</Description> <Data>0</Data> </Pot_Low> </Pots> <Samples> <Description>Time Based Sample Arrays</Description> <Coil_Data> <Description>Analogue Circuit Raw Data (HEX)</Description> <Data> 101010101010101010101010101010101010101010101010449ce0fcfc0000fc ... 1410101010101010 </Data> </Coil_Data> <Reader_Output> <Description>Analogue Circuit Digital Reader Output (HIGH/LOW)</Description> <Data> 0000000000000000000000000000000000000000000000000000000000000000 ... 0000000000000000 </Data> </Reader_Output> <Bit_Period> <Description>Modulation Scheme Bit Period (TICKS)</Description> <Data> 0101010101010101010101010101010101010101010101010101010101010101 ... 0000000000000000 </Data> </Bit_Period> </Samples> </RFIDler_Samples>
Jetzt, wo wir diese Daten haben, ist es möglich, die Antwort grafisch aufzubereiten. Glücklicherweise kommt RFIDler mit einem Python-Tool namens rfidler.py, das Befehlsfolgen im API-Modus an RFIDler sendet, die XML-Antwort erhält und die Antwort grafisch darstellt.
Das Bild Basic Facts zeigt diese von rfidler.py gegebenen Antworten mit einigen Variationen des fc-Parameters an, damit die Identität der Transceiver-Resonanzfrequenz festgestellt werden kann. Die Abkürzung fc steht für Field Clock und ist im Wesentlichen die Dauer einer einzelnen Oszillation des em-Felds in Hundertsteln einer Mikrosekunde ausgedrückt. Es ist ganz einfach: 1/frequency*100[us]: 1/125000 = 0.000008[s] oder 8[us] da_fc_ in Hundertsteln einer Mikrosekunde ausgedrückt, _fc_=800.
rcc@kali2:~/devel/_hardware/RFIDler/python$ rfidler.py /dev/ttyACM0 'set tag askraw' 'potset l 0' 'potset h 255' 'set fc 800' plot 500 sending 'SET TAG ASKRAW' sending 'POTSET L 0' sending 'POTSET H 255' sending 'SET FC 800' sending 'SET RATE 16' Bit periods [] Most common bit periods: 899 999 500
In einigen Sekunden – alles in allem dauerte dieser Test etwa eine Minute – haben wir Folgendes festgestellt:
Versuchen wir nun, das Signal zu decodieren.
Mit dem selben Python-Tool müssen wir den Up-Trigger Potentiometer auf einen vernünftigen Wert einstellen, damit wir das analoge Signal in ein digitales verwandeln können. Die Hälfte der Amplitüde des Signals klingt gut, daher haben wir 150 gewählt (5V / 255 * 150 = ~3V): Alles über 3V ist 1
und alles darunter eine 0
.
rcc@kali2:~/devel/_hardware/RFIDler/python$ rfidler.py /dev/ttyACM0 'set tag askraw' 'potset l 0' 'potset h 150' 'set fc 800' 'set rate 64' plot 500 sending 'SET TAG ASKRAW' ... rcc@kali2:~/devel/_hardware/RFIDler/python$ rfidler.py /dev/ttyACM0 'set tag askraw' 'potset l 0' 'potset h 150' 'set fc 800' 'set rate 64' plot 5000 sending 'SET TAG ASKRAW' ...
(a) zeigt das decodierte Signal, im Wesentlichen wie die hi-low/transitions in digitale Werte verwandelt werden. (b) zeigt das selbe, nur über einen längeren Zeitraum hinweg.
Wie entscheiden wir uns nun für ein Encoding?
Versuchen Sie es einfach :)… Es hängt im Wesentlichen vom Chip ab. Einige senden eine prädefinierte Sequenz gleich nach dem Start aus (Die EM4200-Familie sendet 111111111+1 Parity Bit, also 9×1; diese Sequenz erscheint nur einmal pro Sendezyklus). Wenn wir diese Startup-Sequenz kennen, dann ist es möglich, zu überprüfen ob die Encodierung Manchester oder Bi-Phase ist.
rcc@kali2:~/devel/_hardware/RFIDler/python$ ./rfidler.py /dev/ttyACM0 'set tag em4x02' 'set manchester off' 'set biphase on' 'potset l 0' 'potset h 150' 'set fc 800' 'set rate 64' plot 640 sending 'SET TAG EM4X02' sending 'SET MANCHESTER ON' sending 'SET BIPHASE OFF' sending 'POTSET L 0' sending 'POTSET H 150' sending 'SET FC 800' sending 'SET RATE 64' ... rcc@kali2:~/devel/_hardware/RFIDler/python$ ./rfidler.py /dev/ttyACM0 'set tag em4x02' 'set manchester off' 'set biphase on' 'potset l 0' 'potset h 150' 'set fc 800' 'set rate 64' plot 640 sending 'SET TAG EM4X02' sending 'SET MANCHESTER OFF' sending 'SET BIPHASE ON' sending 'POTSET L 0' sending 'POTSET H 150' sending 'SET FC 800' sending 'SET RATE 64' ...
Das Bild Reading the Data zeigt den maximalen von RFIDler aufgezeichneten Datensatz (~9000fc) , der auf dieser Website leserlich dargestellt werden kann, und die damit verbundene Bitsequenz. Es ist nur eine Frage der Übung, bis sie im Umgang mit dem graphischen Analysetool sattelfest sind. Nach einigen Tags können Sie einfach und schnell das Modulationsschema und andere interessante Parameter von Auge identifizieren. Um den digitalen String, den sie empfangen haben, zu decodieren, müssen Sie den Tag-Typ und die Organisation der Daten in jedem Wort kennen. Das ist der einzige Weg die Streams aus Bits zu interpretieren.
Alle bisherigen Schritte waren nur Teil des Spiels um zu verstehen, wie das System funktioniert, aber eigentlich nutzlos, wenn Sie RFIDler haben. Um die Tag-Parameter zu finden hat RFIDler den Befehl AUTOTAG. Legen Sie das Tag auf die Spule, erteilen Sie den Befehl und lesen Sie die Antwort aus:
*RFIDLer> autotag ASKRAW: 55559956999569669AAA5AAAA95A695555559956999569669AAA5AAAA95A6955 FSK1RAW: FSK2RAW: PSK1RAW: 5555555555555555555555555555555555555555555555555555555555555555 PSK2RAW: PSK3RAW: HITAG1: HITAG2: EM4X02: 160051512B Q5: 160051512B HID26: INDALA64: INDALA224: UNIQUE: 68008A8AD4 FDXB: T55X7: AWID26: EM4X05: TAMAGOTCHI:
Wenn das Tag identifiziert worden ist, setzen sie den Typ fest und Sie erhalten die Parameter, die dann auf ein virtuelles Tag VTAG kopiert werden:
*RFIDLer> set tag q5 OK *Q5> copy OK *Q5> vtag Type: Q5 Emulating: NONE Raw UID: FF8D8002CEE1FAA1C UID: invalid! Config Block (0): 865BF3FE Page Select: True Fast Write: False Data Rate: 63 = 128 * FC Use AOR: False Use PWD: False PSK Carrier: 3 = 8 * FC Inverse Data: True Modulation: 7 = NRZ/Direct Max Block: 7 ST: False PWD Block (7): 0CB7E7FC .... Data: 0: 865BF3FE 1: 00A1A865 2: 1B00050D 3: DF9FF1B0 4: 1A865BF3 5: C0014350 6: 3FE36000 7: 0CB7E7FC *Q5> config Current config: TAG Type: Q5 Frame Clock uS/100: 800 Modulation: ASK/OOK Manchester: On BiPhase: Off Invert: Off Data Rate RF/n: 64 Data Rate Sub 0: 0 Data Rate Sub 1: 0 Data Bits: 64 Data Blocks: 8 Blocksize: 32 Sync Bits: 9 Sync 0: 0xff Sync 1: 0xff Sync 2: 0x00 Sync 3: 0x00 Pot Low: 0 Pot High: 160 PSK Quality uS: 4 Repeat: 20 Timeout uS: 13000 RWD Gap FC 50 RWD Sleep FC: 13000 RWD Wake FC: 4000 RWD Zero FC: 16 RWD One FC: 48 RWD Wait RX->TX FC: 192 RWD Wait TX->RX FC: 48 Wiegand Pulse uS: 0 Wiegand Gap uS: 0 Wiegand IdleState: Low
Wie sie gesehen haben ist die UI invalid. Das können wir im VTAG einfach ändern:
*Q5> encode FFFFFFFFFF q5 OK *Q5> vtag Type: Q5 Emulating: NONE Raw UID: FFFBDEF7BDEF7BC0 UID: FFFFFFFFFF Config Block (0): E601F004 Page Select: False Fast Write: False Data Rate: 31 = 64 * FC Use AOR: False Use PWD: False PSK Carrier: 0 = 2 * FC Inverse Data: False Modulation: 0 = Manchester Max Block: 2 ST: False PWD Block (7): Data: 0: E601F004 1: FFFBDEF7 2: BDEF7BC0
Wir können nun das Tag mit RFIDler emulieren oder auf ein anderes Tag klonen.
*Q5> emulator OK
RFIDler sendet die kopierten Informationen kontinuierlich an den Reader.
Mit dem RFIDler-Board haben wir schnell und einfach einige Tags identifiziert, sie nach Frequenz, Modulation und Encoding klassifiziert, Informationen extrahiert und – endlich – mit zwei einfachen Kommandos Tags geklont und emuliert.
Die Wichtigkeit von Nahfeldkommunikation steigt und in den kommenden Jahren wird die Zahl der RFID nutzenden Geräte förmlich explodieren. Es ist wichtig, sich jetzt mit der Hardware und den Protokollen auseinanderzusetzen, die Dinge von allen Seiten zu betrachten, mit ihnen zu spielen und sie zu verstehen.
RFID Tags vom Typ ISO/IEC 18000-2:2009 können gut mit RFIDler analysiert werden. RFIDler besorgt den analog/digital-Teil und die Firmware ist Open Source, also können Sie personalisierte Funktionen hinzufügen. Mit RFIDler zu spielen erlaubt es uns, bequem die Stärken und Schwächen von 125-134kHz-Tags zu erforschen.
PS: Dieser Artikel demonstriert auch, dass das Aleph der Musik auf alles angewendet werden kann. Auf alles! Jederzeit! Daher empfehle ich mit höchster Dringlichkeit, diesen Artikel zu lesen während Sie das hier anhören :D
Unsere Spezialisten kontaktieren Sie gern!
Rocco Gagliardi
Rocco Gagliardi
Rocco Gagliardi
Rocco Gagliardi
Unsere Spezialisten kontaktieren Sie gern!