(modifié le 13 juin 2022 à 0:40)

Aujourd'hui je vous parle des tags NFC Mifare Classic 1K. Cela ne vous dit rien ? alors ce post est pour vous !

C'est la carte la plus répandue : carte de chambre d'hôtel, machine à café, badge personnel d'entreprise, ticket de transport, parking, immeuble... Elle est partout !

A force de parcourir les datasheets, forums et site web j'y vois beaucoup plus clair et je vous propose ici une découverte de ces tags sans-fil : Gen1 (UID), Gen2 (CUID) et Gen3 (FUID).

Plusieurs noms pour la même carte

Mifare est une marque déposée de NXP Semiconductors, un fabricant de semi-conducteurs fondé en 1967 sous le nom de Motorola. Elle est issue d'une scission de la division semi-conducteurs de Philips (wikipedia).

NXP est donc un poids lourd du secteur et la société a fait l'acquisition des activités WiFi et Bluetooth de Marvell en Mai 2019, rien que ça.

La carte que l'on trouve un peu partout est la Mifare Classic 1k, elle fonctionne sur la fréquence 13,56 MHz (HF : High Frequency).

Ajoutons aussi les Mifare Classic Mini (320 octets) et les Mifare Ultralight (64 octets)

On trouve la Mifare Classic 1K sous d'autres noms :

  • Mifare Classic 1024 bits
  • Mifare Classic 1ko
  • Mifare S50
  • MF1 IC S50 (datasheet)

En réalité, on parle bien de la même carte/tag.

Comment fonctionne un tag NFC ?

La carte contient une puce connectée à une bobine qui fait office d'antenne et qui fait plusieurs tours pour former une carte à puce passive sans contact :

La transmission des données se fait sans contact et sans alimentation (pas de pile ni de batterie, le champ électromagnétique  de proximité suffit pour alimenter la puce).

Bien sûr quand je parle de carte ou de tag je parle de la même chose. L'un se présente sous forme de badge ou étiquette dont la forme peut varier, l'autre au format carte format bancaire dont voici une vue transparente :

Le plus connu des badges en france est le badge d'immeuble vigik (+infos).

Stockage des données (mémoire)

La carte embarque donc 1ko de stockage EEPROM, réparti dans 16 secteurs de 4 blocs de 16 octets : 16*4*16 = 1024 octets (donc 1ko).

Les secteurs sont numérotés de 0 à 15. Le premier bloc du secteur 0 est spécial car il contient l'identifiant du tag (manufacturer block). On l'appelle vulgairement le "block 0" car c'est là qu'est écrit le numéro de série du tag UID (Unique ID), normalement inscrit en usine et pouvant être écrit (normalement) une seule fois. Dans notre cas l'UID est sur 4 octets.

Chaque secteur contient 4 blocs de 16 octets, le dernier bloc s'appelle le sector trailer :

Il contient en hexa :

  • octets 0-5 (vert clair) : une clé A
  • octets 6-9 (orange) : conditions d'accès du secteur (ACs : access conditions)
  • octets 10-15 (vert foncé) : une clé B

Je dis normalement car il existe des cartes qui permettent d'écrire et/ou réécrire ce numéro de série. On parle de carte chinoises et la transition est toute faite pour parler des générations de tag.

Info : les blocs peuvent contenir des données brutes ou êtres considérés comme des value blocks. Dans ce cas les données sont organisées dans un format spécifique avec un contrôle CRC, mais je ne rentre pas dans le détail ici.

NFC ou RFID : quelles différences ?

Le NFC concerne uniquement le High Frequency (HF) à 13,56 MHz.

NFC apporte des fonctionnalités supplémentaires à la norme RFID, comme l'échange de données entre 2 smartphones collés ou encore le paiement sans contact avec Google Pay par exemple.

NFC et RFID diffèrent dans le mode de stockage des données. Cela veut dire qu'un tag vierge qui n'est pas NFC peut le devenir si on utilise le format NDEF (NFC Data Exchange Format). Je ne rentre pas plus dans le détail,  je tire ces infos d'un  numéro du magazine Open Silicium.

Côté smartphone il faut disposer d'une puce Broadcom pour pouvoir lire et écrire des tags Mifare Classic Tool (MCT). De mon côté j'utilise un OnePlus 6 et un Galaxy S3 (LineageOS) et ça marche au top.

➡️ Liste des smartphones compatibles / incompatibles

Les différentes générations de tag

Il existe 2 façons d'écrire sur un badge :

  • avec un smartphone (équipé en NFC Broadcom)
  • avec un lecteur USB avec libNFC, comme l'abordable ACR122U ou proxmark sous Kali

Gardez bien ça en tête car c'est déterminant pour utiliser la bonne génération de tag (src).

Voici les différents types de badges Mifare 1k que j'ai trouvé.

[GENERATION 1] UID Modifiable :

  • UID modifiable plusieurs fois : oui
  • Tous les blocs peuvent être écrits plusieurs fois, y compris le bloc 0
  • Compatible avec un lecteur USB et libNFC : oui
  • Compatible avec MCT : oui, excepté le bloc 0
  • Backdoor pour réécrire sans tenir compte des ACs  (magic commands) : oui (Gen 1a)
  • Détectable comme copie : oui, à cause des commandes magiques

[GENERATION 2] CUID :

  • Tous les blocs peuvent être écrits plusieurs fois, y compris le bloc 0
  • Compatible avec un lecteur USB et libNFC : oui
  • Backdoor pour réécrire sans tenir compte des ACs  (magic commands) : non
  • Détectable comme copie : difficilement (ne répond pas aux commandes magiques)
  • Particularité : mort subite si écriture d'un bloc 0 invalide (voir procédure XOR > calculateur)

[GENERATION 3] FUID :

Notez que la génération 3 est en réalité un GEN2 FUID. Mais pour éviter la confusion je l'appelle GEN3.

  • Le block 0 peut être écrit une seule fois
  • Tous les blocs peuvent être écrits plusieurs fois, sauf le bloc 0
  • Particularité : protection contre la mort subite si écriture d'un bloc 0 invalide
  • Backdoor pour réécrire sans tenir compte des ACs  (magic commands) : non
  • Détectable comme copie : très difficilement (ne répond pas aux commandes magiques)

Sécurité

Les cartes MIFARE dites Classic sont protégées par l'algorithme de chiffrement propriétaire CRYPTO1. La connaissance des clés de chiffrement (A et B) est nécessaire pour lire ou écrire des données sur la carte MIFARE.

Le problème c'est qu'un chercheur en sécurité a trouvé des faiblesses dans Crypto1... qui font qu'il suffit de trouver une des deux clés par brutforce avec mfoc/mfcuk pour avoir l'autre (voir aussi BlackHat).

    • MFOC : MiFare Offline Cracker (nested attack)
    • MFCUK : MiFare Classic Universal toolKit (DarkSide Key Recovery Tool)

Là encore je ne rentre pas dans le détail de la sécurité, vous trouverez de nombreuses ressources sur le web. La faisabilité dépend également de la qualité du lecteur NFC, si un ACR122U n'est pas cher il n'est pas non plus ultra fiable par rapport à un proxmark3. Mais ce n'est pas le même prix !

Quoi qu'il en soit, un système uniquement basé sur la lecture du bloc 0, l'identifiant du tag, est une hérésie ! Car cette partie se copie bien trop facilement avec des tags chinois. Malheureusement ce système de badge est encore largement utilisé dans les entreprises 👏.

Aussi, les clés A et B des fabricants circulent très largement sur le web. C'est aussi le cas de MCT (Android) qui embarque extended-std.keys. Cela lui permet de tester les clés les une après les autres pour lire le contenu d'une carte/tag.

Particularité à MCT 📱

Pour écrire sur un tag vierge avec Mifare Classic Tool il suffit d'utiliser std.keys qui contient les clés de base, généralement c'est 12 xF (FFFFFFFFFFFF).

Avant tout il faut toujours aller dans Show Options et cocher "use these Access Conditions for all sectors : 08778F". Sans ça vous allez écrire des ACs qui vous empêcheront de réécrire certains blocs lors du restore d'un dump existant.

Ensuite je vous déconseille d'écrire tous les secteurs d'un coup si vous avez besoin d'écraser le manufacturer block :

  1. écrire d'abord le secteur 0 (en cochant les 2 options dans show options)
  2. écrire le reste des secteurs (en cochant uniquement use these Access Conditions for all sectors : 08778F)

Relire ensuite le dump pour vérifier qu'il correspond, excepté les ACs qui vont naturellement différer.

➡️ note : vous pouvez aussi utiliser les ACs FF078069 au lieu de 08778F (comprendre les ACs).

Conclusion

J'espère que vous y voyez plus clair dans tout ça. Je vous incite à pratiquer pour bien comprendre les tenants et aboutissants de tout ça.

Comme moi vous allez forcément flinguer des tags au début, alors n'hésitez pas à en acheter plusieurs.

Voici quelques liens de tags que j'ai testé qui supportent l'écriture du bloc 0 :

MàJ 25/11/2019 : Je vous propose également un script bash que j'ai écrit qui permet de convertir un dump MCT pour l'écrire avec un lecteur USB (libNFC) et aussi je vous expliquerai comment écrire ces tags GEN1 et GEN2, restaurer un dump, etc :

▶️ Script disponible ici !

J'espère que ce post vous a plu, la rédaction m'a pris beaucoup de temps 🙂

Auteur : Mr Xhark

Fondateur du blog et passionné par les nouvelles techno, suivez-moi sur twitter