Mémo – Lecture / écriture de TAG NFC type Mifare

Ludo | 13 février 2025

Il devait s’agir d’un simple mémo, partagé au cas où il pourrait être utile à d’autres personnes, mais j’ai fini par en faire un article.
Bonne lecture!

Quelques rappels ou infos de base

Config minimale :

  • Raspberry Pi Zero
  • Raspberry Pi OS Bookworm Lite (sans interface graphique)
  • Un lecteur / programmateur (encodeur) RFID 13.56MHz (ACR122U dans mon cas)
  • De quoi connecter la Raspberry Pi à Internet et à l’encodeur RFID -> voir ceci par exemple, en vente chez AliExpress notamment : https://www.waveshare.com/eth-usb-hub-hat.htm

S’il s’agit d’une nouvelle installation, l’outil Raspberry Pi Imager permet de préconfigurer quelques bricoles pour vous simplifier la vie dès la première utilisation. Avant de lancer l’écriture de l’image sur la carte SD, cliquer sur MODIFIER RÉGLAGES:

Cocher ensuite Définir nom d’utilisateur et mot de passe puis saisir les identifiants souhaités, et s’en souvenir!

Le paramétrage Configurer le Wi-Fi sera nécessaire si vous souhaitez l’utiliser sur votre carte. Je privilégie les connexions filaires, vu que mes cartes ne sont pas mobiles, donc je laisse ce paramétrage inactivé.

L’option Définir les réglages locaux semble être inutile si vous ne souhaitez pas utiliser de paramètres différents de ceux en vigueur sur votre PC.

Cliquer sur l’onglet SERVICES tout en haut de la fenêtre et cocher Activer SSH. Cela permettra de se connecter à la carte avec un client SSH (port 22), comme Putty par exemple sous Windows. Il faudra juste retrouver l’adresse IP de la carte Raspberry Pi sur votre réseau, depuis l’interface de votre routeur ou box Internet attribuant les adresses IP (DHCP).

Valider avec le bouton ENREGISTRER tout en bas, puis de retour sur l’écran précédent, cliquer sur OUI:

Une fois l’image copiée sur la carte SD, il suffit d’insérer cette dernière dans le lecteur de la Raspberry Pi et d’attendre la fin de l’initialisation faite au tout premier démarrage. C’est une opération qui peut sembler être très longue, selon votre seuil de patience ainsi que les ressources matérielles de la carte Raspberry Pi, et surtout si vous oubliez de mettre la carte sous tension.
Ensuite, tant que la LED verte clignote, de façon aléatoire, c’est bon signe. Attendez que la carte apparaisse dans la liste des adresses IP attribuées par votre routeur/box Internet. Vous devrez voir apparaître un périphérique réseau intelligemment nommé raspberrypi.

Qu’il s’agisse d’une carte SD sur laquelle l’image vient tout juste d’être écrite, ou d’une installation plus ancienne, il est recommandé de maintenir le système à jour :
sudo apt-get update
sudo apt-get upgrade

La partie intéressante commence ci-dessous. Elle concerne l’installation de tous les outils nécessaires pour utiliser l’encodeur RFID, et est très fortement inspirée du tutoriel publié par Adafruit : https://learn.adafruit.com/adafruit-nfc-rfid-on-raspberry-pi/overview.

Les librairies et outil de macros pour la compilation

cd ~
sudo apt-get install git autoconf libtool libusb-dev -y
sudo git clone https://github.com/nfc-tools/libnfc

libnfc

sudo mkdir -p /etc/nfc/devices.d
cd libnfc
sudo autoreconf -vis
sudo ./configure --sysconfdir=/etc --prefix=/usr
sudo make
sudo make install all

La première partie de la suite de logiciels étant installée, il ne reste plus qu’à tester en posant un Tag RFID compatible sur le lecteur et en exécutant la commande suivante :
sudo nfc-poll

Le résultat obtenu doit ressembler à ça :

pi@raspberrypi:~/libnfc$ sudo nfc-poll
nfc-poll uses libnfc libnfc-1.8.0-78-g3379466
NFC reader: ACS / ACR122U PICC Interface opened
NFC device will poll during 36000 ms (20 pollings of 300 ms for 6 modulations)
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
UID (NFCID1): 3e 3e b5 7c
SAK (SEL_RES): 08
Waiting for card removing…nfc_initiator_target_is_present: Target Released
done.
pi@raspberrypi:~/libnfc$

Lorsque je me suis lancé dans la conception de mon propre encodeur RFID autonome multi-protocoles, il y a une bonne quinzaine d’années, j’ai verrouillé quelques Tags Mifare à cause de bugs dans la routine d’écriture des clés Crypto1, qui permettent d’empêcher le lecture/écriture aux blocs de données du Tag si on ne connaît pas la clé, selon les conditions d’accès définies. Vue la taille d’un Tag, et comme je n’ai pas pour habitude de jeter quelque chose qui est potentiellement encore récupérable, j’ai gardé ces quelques Tags et pensant pouvoir un jour les déverrouiller en utilisant la méthode brute-force avec le petit microcontrôleur de la famille M16C (Renesas) qui équipe mon encodeur. Disons que j’étais encore jeune et insouciant, à cette époque.
Heureusement, cette génération de Tags est concernée par la faille de l’algorithme mise en lumière en 2009 il me semble, pouvant depuis quelques années déjà être exploitée avec des appareils abordables et des logiciels libres.

Donc, pour récupérer ces Tags, il faut installer quelques outils supplémentaires.

mfoc

cd ~
git clone https://github.com/nfc-tools/mfoc.git
cd mfoc
sudo autoreconf -is
sudo ./configure
sudo make && sudo make install

mfcuk

cd ~
git clone https://github.com/nfc-tools/mfcuk.git
cd mfcuk
sudo autoreconf -is
sudo ./configure
sudo make && sudo make install

Test de bon fonctionnement

Lisons le contenu d’un Tag vierge avec la commande suivante :
mfoc -P500 -O blank.dmp

Le résultat doit ressembler à ça :
Found Mifare Classic 1k tag
ISO/IEC 14443A (106 kbps) target:
ATQA (SENS_RES): 00 04
* UID size: single
* bit frame anticollision supported
UID (NFCID1): 3e 3e b5 7c
SAK (SEL_RES): 08
* Not compliant with ISO/IEC 14443-4
* Not compliant with ISO/IEC 18092

Fingerprinting based on MIFARE type Identification Procedure:
* MIFARE Classic 1K
* MIFARE Plus (4 Byte UID or 4 Byte RID) 2K, Security level 1
* SmartMX with MIFARE 1K emulation
Other possible matches based on ATQA & SAK values:

Try to authenticate to all sectors with default keys...
Symbols: '.' no key found, '/' A key found, '\' B key found, 'x' both keys found
[Key: ffffffffffff] -> [xxxxxxxxxxxxxxxx]
[Key: a0a1a2a3a4a5] -> [xxxxxxxxxxxxxxxx]
[Key: d3f7d3f7d3f7] -> [xxxxxxxxxxxxxxxx]
[Key: 000000000000] -> [xxxxxxxxxxxxxxxx]
[Key: b0b1b2b3b4b5] -> [xxxxxxxxxxxxxxxx]
[Key: 4d3a99c351dd] -> [xxxxxxxxxxxxxxxx]
[Key: 1a982c7e459a] -> [xxxxxxxxxxxxxxxx]
[Key: aabbccddeeff] -> [xxxxxxxxxxxxxxxx]
[Key: 714c5c886e97] -> [xxxxxxxxxxxxxxxx]
[Key: 587ee5f9350f] -> [xxxxxxxxxxxxxxxx]
[Key: a0478cc39091] -> [xxxxxxxxxxxxxxxx]
[Key: 533cb6c723f6] -> [xxxxxxxxxxxxxxxx]
[Key: 8fd0a4f256e9] -> [xxxxxxxxxxxxxxxx]

Sector 00 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 01 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 02 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 03 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 04 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 05 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 06 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 07 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 08 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 09 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 10 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 11 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 12 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 13 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 14 - Found Key A: ffffffffffff Found Key B: ffffffffffff
Sector 15 - Found Key A: ffffffffffff Found Key B: ffffffffffff

We have all sectors encrypted with the default keys..

Auth with all sectors succeeded, dumping keys to a file!
Block 63, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 62, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 61, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 60, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 59, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 58, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 57, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 56, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 55, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 54, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 53, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 52, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 51, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 50, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 49, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 48, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 47, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 46, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 45, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 44, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 43, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 42, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 41, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 40, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 39, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 38, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 37, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 36, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 35, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 34, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 33, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 32, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 31, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 30, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 29, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 28, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 27, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 26, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 25, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 24, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 23, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 22, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 21, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 20, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 19, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 18, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 17, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 16, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 15, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 14, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 13, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 12, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 11, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 10, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 09, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 08, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 07, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 06, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 05, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 04, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 03, type A, key ffffffffffff :00 00 00 00 00 00 ff 07 80 69 ff ff ff ff ff ff
Block 02, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 01, type A, key ffffffffffff :00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Block 00, type A, key ffffffffffff :3e 3e b5 7c c9 08 04 00 62 63 64 65 66 67 68 69

Ça, c’est facile à faire puisque les clés Crypto1 des Tags vierges sont connues.

Si on a perdu ces clés, on peut utiliser la commande suivante pour les retrouver :
sudo mfcuk -C -R 0:A -s 50 -s 50 -o recovered.dmp -v 3

Ceci a pour effet de chercher, et si possible trouver, la clé A qui est nécesaire pour lire le contenu d’un Tag.

Une fois que cette clé est trouvée, on peut lancer la copie du contenu de la mémoire du Tag dans un fichier avec cette commande :
sudo mfoc -P500 -k laclé -O copy.dmp

Il conviendra de remplacer ci-dessus laclé par la clé qui a été trouvée.

Enfin, si on veut créer une copie sur un autre Tag, on utilise la commande suivante :
sudo nfc-mfclassic w b blank.dmp copy.dmp

Pour que la copie soit conforme, il faut utiilser un Tag cible dont l’UID est réinscriptible (nommés CUID), et remplacer le w minuscule par un W majuscule dans la commande ci-dessus.

Ne perdez pas votre temps à essayer de cloner des clés de contrôle d’accès. Les industriels ont mis à jour leurs équipements :

  • Miface Classic délaissé, au profit du DESFire par exemple ;
  • Écriture d’un compteur ou code trournant dans un secteur du tag, invalidant d’office le clone ;
  • Corruption de l’UID du clone réinscriptible ;
  • Utilisation de nouvelles clés Crypto1 ;
  • etc.

Leave a Reply


La période de vérification reCAPTCHA a expiré. Veuillez recharger la page.