RFID mit RFIDler

RFID mit RFIDler

Rocco Gagliardi
von Rocco Gagliardi
Lesezeit: 20 Minuten

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.

“Come On, It’s Time to Go”

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).

“I Do Believe It’s Working, Good”

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.

Board Setup

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.

RFID Tags

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.

“Is There Anybody in There?”

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.

“I Need Some Information, First”

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.

“Just the Basic Facts”

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.

Basic Facts

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'
...

 

Analog zu digital

(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'
...

 

Decoding

Reading the data

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.

“Well, I Can Ease Your Pain”

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.

“Relax”

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

Über den Autor

Rocco Gagliardi

Rocco Gagliardi ist seit den 1980er Jahren im Bereich der Informationstechnologie tätig. In den 1990er Jahren hat er sich ganz der Informationssicherheit verschrieben. Die Schwerpunkte seiner Arbeit liegen im Bereich Security Frameworks, Routing, Firewalling und Log Management.

Links

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

×
Übergang zu OpenSearch

Übergang zu OpenSearch

Rocco Gagliardi

Graylog v5

Graylog v5

Rocco Gagliardi

auditd

auditd

Rocco Gagliardi

Security Frameworks

Security Frameworks

Rocco Gagliardi

Sie wollen mehr?

Weitere Artikel im Archiv

Sie brauchen Unterstützung bei einem solchen Projekt?

Unsere Spezialisten kontaktieren Sie gern!

Sie wollen mehr?

Weitere Artikel im Archiv