×

FR-RATEL: Der Handleser, den wir geknackt haben

Der FR-RATEL ist einer dieser kompakten USB-Handleser, die man oft unter dem Namen „iCopy V300CD-Klon” findet: klein, batteriebetrieben über USB, mit einem Tastenfeld und einem kleinen Display. Gedacht für Mifare-Classic- und 125-kHz-Karten unterwegs. Das Problem: Ohne die Hersteller-Software war das Gerät am PC bisher eine Blackbox. Wir haben das Protokoll vollständig reverse-engineered — und bauen darauf jetzt einen eigenständigen Windows-Client.

Was ist der FR-RATEL überhaupt?

Auf dem Markt kursiert das Gerät unter mehreren Namen — FR-RATEL, iCopy V300CD, teils auch nur „Handleser”. Hardwareseitig ist es ein USB-HID-Gerät mit einer HF-Antenne (13,56 MHz, Mifare Classic) und einer LF-Antenne (125 kHz, EM4100 / HID Prox), dazu Tasten und Display für den Offline-Betrieb ohne PC. Beliebt bei Schließanlagen-Technikern und Pentestern, weil er klein, günstig und schnell griffbereit ist — ein Werkzeug für den schnellen Check vor Ort, nicht für die Tiefenanalyse am Labortisch.

Die Blackbox

Ohne die Hersteller-App sprach mit dem FR-RATEL bisher niemand. Das Gerät meldet sich am PC nicht als serieller Port, sondern als reines USB-HID-Gerät, und jedes einzelne Datenpaket ist verschlüsselt — ohne den passenden Schlüssel liest man nur Rauschen. Eigene Software, eigene Automatisierung, eigene Integration in eine bestehende Pentest-Toolchain: alles unmöglich, solange man an die mitgelieferte Windows-App gebunden ist.

Was wir gemacht haben

Wir haben den USB-Traffic zwischen der Hersteller-App und dem Gerät mitgeschnitten und das Protokoll Schicht für Schicht zerlegt: wie die 64-Byte-HID-Pakete aufgebaut sind, wie Länge und Prüfsumme in jedem Paket stecken, und wie die Verschlüsselung funktioniert, die jedes Paket in beide Richtungen unlesbar macht. Jeden Schritt haben wir gegen echte Hardware verifiziert — nicht nur am Papier, sondern am laufenden Lesevorgang mit echten Karten. Ergebnis: eine eigene, von der Hersteller-App unabhängige Implementierung, die genau weiß, wie man mit dem Gerät spricht.

Was jetzt möglich ist

Aus der reversed Implementierung ist ein eigenständiger Windows-Client geworden, der den FR-RATEL komplett ohne Hersteller-App ansteuert — eine einzelne .exe, kein Installer.

BereichFunktionStatus
HF (13,56 MHz)UID scannenverifiziert
HFVollständiger Sektor-Dumpverifiziert
HFAuto-Crack-Dump (Schlüssel-Wörterbuch)verifiziert
HFSektor schreibenexperimentell
HFHardware-Wörterbuch-Crackverifiziert
HFNested-Angriff (bekannter/unbekannter Schlüssel)verifiziert
LF (125 kHz)EM4100 / HID Prox lesenverifiziert
LFEM4100 auf T5577 klonenhardware-verifiziert
LFHID Prox schreibenunverifiziert

Für wen ist das

Der Client richtet sich an autorisierte Pentester und an Techniker, die eigene bzw. ausdrücklich freigegebene Hardware prüfen oder reparieren — etwa wenn eine Zugangskarte verloren geht und ein neues Token für dieselbe Anlage angelernt werden muss, oder wenn im Rahmen eines Pentests Mifare-Classic-Systeme auf schwache Schlüssel geprüft werden. Lesen und Analysieren von Karten ist dabei grundlegend Dual-Use-Technik — dieselben Werkzeuge nutzen auch Transit-Betreiber und Zugangskontroll-Hersteller selbst zur Qualitätssicherung. Kein Freifahrtschein für fremde Systeme: der Rahmen bleibt derselbe wie bei jedem anderen SSR-Labs-Werkzeug.

Hier der Download

FR-RATEL Protokoll

Wie der FR-RATEL angesteuert wird

USB-HID-Reader (iCopy V300CD-Klon), VID 0x1629 / PID 0x1831. Protokoll aus der Vendor-DeviceAgreement-Lib reversed, gegen echte Hardware verifiziert. Referenz: FrRatelClient/Hardware/FrRatelReader.cs.

1 · Transport

Der Reader meldet sich als HID-Gerät (kein serieller COM-Port). Jede Nachricht — in beide Richtungen — ist ein 64-Byte HID-Report, dem beim Schreiben ein Report-ID-Byte 0x00 vorangestellt wird (macht 65 Bytes auf dem Wire). Ein logischer Befehl kann über mehrere solcher 64-Byte-Reports verteilt sein, wenn die Antwort länger als 64 Byte ist.

Windows-Seite — kein .NET SerialPort

Zugriff läuft über SetupDiGetClassDevs / CreateFile / ReadFile / WriteFile auf den HID-GUID-Pfad — gefiltert auf vid_1629 + mi_00. Genau wie beim PN532 gilt: ein generischer serieller Zugriff funktioniert hier nicht, es muss der native HID-Layer sein.

2 · Frame-Aufbau

Vor der Verschlüsselung sieht ein Befehls-Frame so aus — Länge + Payload + CRC16, auf 64 Byte aufgefüllt:

Länge2 Byte LE
PayloadBefehl + Argumente
CRC16-CCITT2 Byte LE
Paddingauf 64 Byte mit 0x00

Das ganze 64-Byte-Paket wird anschließend mit RC4 verschlüsselt — inklusive der Padding-Nullen. Antworten laufen spiegelbildlich: erst RC4-entschlüsseln, dann stehen die ersten 2 Byte für die tatsächliche Länge, Byte 3 ist der Status (0x01 = OK).

3 · RC4-Schlüssel

Der RC4-Schlüssel ist 16 Byte lang und setzt sich aus einem 4-Byte Geräteschlüssel plus einem festen 8-Byte-Suffix zusammen (die restlichen 4 Byte des 16-Byte-Puffers bleiben 0):

// deviceKey ‖ suffix (12 von 16 Byte belegt) deviceKey = B6 69 8A 37 suffix = 40 A3 79 84 9B F5 6D 16 RC4-Key = B6 69 8A 37 40 A3 79 84 9B F5 6D 16 00 00 00 00

Mit diesem einen festen Schlüssel wird jedes Frame in beide Richtungen ver- bzw. entschlüsselt — es gibt keine Session-Rotation. Standard-RC4-KSA/PRGA, byteweise XOR.

4 · Verbindungsaufbau (Handshake)

Vor jedem Befehl steht ein zweistufiger Handshake: Geräteerkennung, dann ein Nonce-Austausch, bei dem der PC der Zufallszahl des Geräts antworten muss.

sequenceDiagram
    participant PC as PC-Software
    participant DEV as FR-RATEL (USB-HID)
    PC->>DEV: 0x06 FindDevice
    DEV-->>PC: ack
    PC->>DEV: 0x01 ver=01, packSize=5120, devType=0F04, pcRandom=5264
    DEV-->>PC: status=1, devRandom (4 Byte, Offset 12..15)
    PC->>DEV: 0x01 Echo von devRandom
    DEV-->>PC: status=1 — Handshake fertig
    Note over PC,DEV: Erst jetzt nehmen 0x21 / 0x17 / 0x13 ... Befehle an
  

5 · Befehlssatz

CodeFunktionWireStatus
0x06FindDevice[06]verifiziert
0x01Handshake-Nonce[01][ver][pack 2B][devType 2B][pcRand 4B]verifiziert
0x10Init / Select (HF)[10]verifiziert
0x21HF-UID lesen[21] → UID 4B, ATQA 2Bverifiziert
0x17Auth + Sektor lesen[17][Sector][Flag][KeyA 6B][KeyB 6B]verifiziert
0x18Auth + Sektor schreiben[18][Sector][Flag][KeyA][KeyB][Data]experimentell
0x13HW-Dictionary-Check[13][Block][KeyType][Count][Keys…]verifiziert
0x14Nested (bekannter Key)[14][CheckBlock][Type][Key 6B][AttBlock][Type][Rand 4B]verifiziert
0x15Nested-Nonce (unbekannt)[15][02][AttBlock][AttType]verifiziert
0x28LF lesen (EM4100)[28][Auto=1][Freq=0] → ID 5B LEverifiziert
0x29LF lesen (HID Prox)[29]verifiziert
0x2DEM4100 → T5577/EM4305 klonen[2D][Freq][CardID 4B][PlantID 1B]hardware-verifiziert
0x2EHID Prox schreiben[2E][CardID 12B]unverifiziert

6 · Beispiel: HF-Scan Ende-zu-Ende

1

Payload bauen: [0x21] → mit Länge+CRC auf [len][0x21][crc_lo][crc_hi], Rest mit Nullen auf 64 Byte auffüllen.

2

Die vollen 64 Byte (inkl. Padding) mit RC4 verschlüsseln.

3

Als HID-Report senden: Byte 0 = Report-ID 0x00, Byte 1–64 = verschlüsseltes Frame.

4

Antwort-Report lesen (64 Datenbytes), mit demselben RC4-Key entschlüsseln.

5

Entschlüsselte Bytes 0–1 = Länge → ggf. weitere 64-Byte-Reports nachlesen und an den RC4-Stream anhängen, bis die volle Länge erreicht ist.

6

Byte 2 = Status (1 = OK), Bytes 3–6 = UID, Bytes 7–8 = ATQA (little-endian).

7 · Kurzfassung in Code

// FrRatelReader.cs — Kernschleife Send(BuildFrame(payload)); // Längen-Präfix + CRC16 + Padding + RC4 var resp = Recv(); // Report(s) lesen, RC4 entschlüsseln, Multi-Frame zusammensetzen bool ok = resp[2] == 1; // Status-Byte

Dieses Dokument beschreibt ausschließlich die USB-Transportschicht des eigenen Lesers zum autorisierten Pentesting/Reparatur-Zweck. Vollständige Referenzimplementierung: FrRatelClient/Hardware/FrRatelReader.cs (SSR-Labs.de).

Das hast du vielleicht verpasst