Coffee, NFC, Exploit, Coffee again

Il existe beaucoup d'articles sur internet au sujet des failles NFC sur les cartes RFID MIFARE et je m'y suis intéressé il y a une grosse année. A l'époque je pensais qu'il serait facile de reproduire certaines actions comme recharger les badges de machines à café ou encore cloner mon badge d'accès d'immeuble.

Résultat : Fail! Les outils mfoc et mfcuk ne marchaient pas/plus pour des cartes MIFARE Classic Plus 1K qui sont plus récentes.

En cette fin d'année 2017 j'ai décidé de ressortir les outils dont je dispose :

  • Un lecteur NFC ACS ACR122u (40-50€ sur Amazon)
  • Des badges avec le bloc 0 réinscriptible (environ 5€ les 10 avec frais de port sur internet)
  • Différents badges de machines à café rechargeable par monnaie voir CB
  • Différents badges d'accès d'immeubles
Reprenons les bases :

Le NFC (Near-Field Communication) est une technologie de communication sans-fil à courte portée et à haute fréquence, permettant l'échange d'informations entre des périphériques jusqu'à une distance d'environ 5 cm. Cette technologie est une extension de la norme ISO/CEI 14443 standardisant les cartes de proximité utilisant la radio-identification (RFID).

MIFARE est une des technologies de carte à puce sans contact les plus répandues dans le monde et est propriété de la société NXP. MIFARE est fondée sur l'un des standards de l'ISO 14443 de Type A fonctionnant à 13,56 MHz. La technologie est intégrée à la fois dans les cartes (avec une puce pour stocker les données reliée à une antenne pour les transmettre) et dans les lecteurs/encodeurs. Ces lecteurs sont fabriqués
par différents fabricants sur la base d'un composant fourni par la société NXP.

Il existe différents types de cartes a puce MIFARE, je vais parler ici de la carte MIFARE Classic 1k, qui est la plus connu.

La carte est composé de 16 secteurs (de 0 à 15), chaque secteur est découpé en 4 blocs de 16 octets, 1 bloc de sécurité qui protège l'accès aux 3 autres blocs de data avec 2 clefs de chiffrement différentes A et B et les droits d'accès correspondant. Il y a donc au total 768 octets de stockage (16secteurs x 3blocs x 16octets).

Chaque carte dispose d'un numéro de série ou CSN appelé UID de 32 bits qui n'est pas censé être modifiable. Celui-ci est pré-encodé sur le bloc 0 du secteur 0. Le reste du bloc 0 est souvent accompagné d'informations sur le fabriquant ou sur le porteur de la carte.

Récapitulatif sur le schéma :

Les cartes MIFARE Classic sont protégées par un algorithme de chiffrement propriétaire NXP : CRYPTO1, pour l'authentification et le chiffrement qui a été cassé en 2008.
La connaissance des clés de chiffrement est nécessaire au déchiffrement des données présentes sur la carte MIFARE. On ne peut donc lire ou écrire sur la carte MIFARE sans connaître les différentes clés A et B de chaque secteur.

Principe rapide du fonctionnement du NFC entre une carte et un lecteur :

  1. Lorsque l'on approche une puce d'un lecteur, celle-ci est mise sous tension et répond à un message d'initialisation appelé ATR (Answer To reset) comprenant ses paramètres de communication et attend une commande du lecteur.
  2. Le lecteur répond par un message REQA (REQuest command for type A) et la puce va répondre par un message ATQA (Answer To reQuest code for type A)
  3. Le lecteur lit l'identifiant de la carte, son UID, pour dialoguer uniquement avec celle-ci par la suite et éviter les collisions et attend un SAK (Select AcKnowledge).
  4. Le lecteur informe les autres puces à proximité, s'il y en a, qu'elles peuvent retourner dans leur état semi-passif.
  5. la puce sélectionnée envoie une réponse ATS (Answer To Select) qui contient les caractéristiques de la carte.
  6. S'en suit un échange de commande de la part du lecteur pour lire/écrire sur la puce.

Exemple : lecture du premier bloc d'une carte Mifare Classic 1k

1- Message d'authentification avec la clé A par défaut : cmd bloc clé uid
cmd = 0x60
bloc = 00
clé A = ff ff ff ff ff ff
UID = c0 ff ee 42
Send : 60 00 ff ff ff ff ff ff c0 ff ee 42

2- Message de lecture du bloc 0 : cmd bloc
cmd = 0x30
bloc = 00
Send : 30 00

3- Message de retour de la puce (bloc 0) :
Receive : c0 ff ee 42 de ad c0 ff ee de ad c1 a5 51 c0 00

Je ne vais pas lister l'ensemble des commandes mais vous pouvez les retrouver sur le pdf complet qui présente l'ensemble du fonctionnement MIFARE page 15 : MF1S50YYX_V1.pdf

En pratique :

Après avoir branché le lecteur pour vérifier que celui-ci est bien reconnu :

Installer les différents outils/lib qui nous seront nécessaires :

$ sudo apt-get install pcsc-tools pcscd libpcsclite-dev libpcsclite1 libusb-dev

Installation de libnfc :

$ wget http://dl.bintray.com/nfc-tools/sources/libnfc-1.7.1.tar.bz2 
$ tar xjf libnfc-1.7.1.tar.bz2 
$ cd libnfc-1.7.1/ 
$ ./configure --with-drivers=all 
$ make
$ sudo make install 
$ sudo ldconfig

Test du lecteur :

Test d'une carte Mifare :

Pour dumper le contenu d'une carte il faut utiliser les outils open source de la suite nfc-tool.

Installation de mfoc :

$ git clone https://github.com/nfc-tools/mfoc.git
$ cd mfoc
$ autoreconf -vis
$ ./configure
$ sudo make
$ sudo make install

Cependant je vous conseille pour la suite de l'installer par l’intermédiaire du tool miLazyCracker qui implémente la Hardnested Attack :

$ git clone https://github.com/ilumitr/miLazyCracker
$ cd miLazyCracker
$ ./miLazyCrackerFreshInstall.sh

Une fois ces outils installés on peut tenter de dumper une carte/badge NFC avec mfoc :

$ mfoc -O badge_a_copier.dmp

Si le badge dispose uniquement de clés A et B par défaut comme ffffffffffff, 000000000000, a0a1a2a3a4a5, b0b1b2b3b4b5... cela ne devrait pas poser de problème.

Pour ensuite cloner votre badge, c'est à dire écrire le dump complet obtenu sur un autre badge vous aurez besoin d'un badge avec le secteur 0 réinscriptible.

Il faut commencer par dumper le badge vierge pour aussi extraire ses clefs A et B pour ensuite avoir les autorisations d'écriture :

$ mfoc -O badge_vierge.dmp

Pour lancer la copie il faut placer le badge vierge sur le lecteur et utiliser l'outil nfc-mfclassic avec les options :

  • W car nous écrivons aussi sur le secteur 0 ;
  • A et B car nous utilisons les 2 clefs à chaque fois pour écrire sur chaque secteur, le dump à copier ainsi que le dump du badge vierge comprenant ses clefs A et B actuelles ;
  • badgeacopier.dmp qui est le dump que nous voulons écrire sur le badge vierge ;
  • badge_vierge.dmp qui est le dump du badge vierge (Ou le dump du badge sur lequel on veut écrire).

$ nfc-mfclassic W A B badge_a_copier.dmp badge_vierge.dmp

Si tout se passe bien vous devriez avoir le résultat suivant :

Vous voilà avec une copie parfaite de votre badge, pratique en cas de perte.

Cependant il arrive souvent (heureusement) que des badges d'accès ou de machines à café ne possèdent pas de clés par défaut sur tous les secteurs ! Dans ce cas mfoc va tenter une attaque appelée "nested attack" sur la librairie crapto1. Crapto1, sous licence GPL et disponible publiquement permet d'exploiter les faiblesses cryptographiques des cartes à base de puce sans contact RFID utilisant la technologie crypto1 MIFARE, l'attaque est basée sur ce papier de 2008.

Il existe aussi une autre attaque dite "Dark Side", par Nicolas Courtois, mise en place dans l'outil open source mfcuk. Il utilise aussi LIBNFC et CRAPTO1 pour exploiter les faiblesses de la technologie crypto1 MIFARE à la différence que cette attaque ne nécessite pas de connaitre une clé A ou B valide pour retrouver les autres.

Je m'étais arrêté ici l'année dernière mais j'ai récemment découvert une nouvelle attaque. Effectivement les attaques "Nested Attack" de mfoc et "Darkside Attack" de mfcuk ne fonctionnent plus sur les cartes à Puce de type MIFARE Plus SL1 qui ont fixé la vulnérabilité sur le "pseudorandom number generator" (PRNG) mais ces nouvelles cartes utilisent toujours CRYPTO1 !

Dans un papier de Carlo Meijer et Roel Verdult une nouvelle attaque "Nested attack" est décrite. Celle-ci requiert de connaître au moins une clé A ou B. Si j'ai bien compris l'attaque, celle-ci consiste à faire de très nombreuses tentatives d'authentification imbriquées, ce qui va permettre de collecter des nonces chiffrés uniques et permettre par cette fuite de réduire les possibilités de clés pour ensuite finir par bruteforcer la clé cherchée.

L'implémentation de cette attaque dans l'outil miLazyCracker date de début d'année 2017. Elle nécessite de patcher les versions de LibNFC de mfoc, d’où l’installation de mfoc par le script miLazyCrackerFreshInstall.sh .
Pour lancer directement l'attaque sur une carte dont on connait une clé A ou B (par défaut), il faut lancer l'outil libnfc_crypto1_crack qui se situe dans "miLazyCracker/crypto1_bs/"

Avec cette découverte, je me suis relancé dans les tentatives de dumps/clonages/modifications de différents tags NFC MIFARE dont je dispose et qui résistaient aux attaques de mfoc et mfcuk :

  • 2 badges d'accès d'immeuble
  • 1 badge et 1 clé de machine à café

Prenons par exemple le badge de machine à café. Je connais la clé A et B par défaut sur l'ensemble des secteurs sauf la clé B des secteurs 8,9,10,11,12,13 et 14 (par chance ici il s’avérera être la même clé sur les 7 secteurs). Je vais donc attaquer la clé B sur le secteur 8 et son premier bloc : le bloc 32 (8ème secteur x 4 blocs) en connaissant la clé A du même bloc.

Moins de 10 minutes plus tard dans ce cas la clé est tombée, cela peut prendre plusieurs heures.

Une fois qu'une clé est découverte on peut tenter de relancer mfoc avec cette clé en paramètre (option -k) :

On voit ici que notre clé ajoutée aux clés par défauts est directement détectée en tant que clé B sur les champs voulues. Les tests avec les 2 autres clefs par défauts suivantes permettent par la suite de déchiffrer l'ensemble des secteurs et de réaliser un dump complet du badge à café.

A partir de là, il est donc facile de dupliquer le badge à café et même de réécrire par-dessus. On pourrait donc remplir le badge à café de monnaie, le dumper et réécrire sur le badge ce dump après utilisation pour retrouver le montant initial total sans le recharger avec de la monnaie. Manipulation faite uniquement à titre expérimental évidement.

En étudiant différents dumps de ce badge à café avec différents soldes je n'ai pas réussi à trouver une quelconque routine, trop de valeurs différentes changent entre chaque dump. Il faudrait réussir à reverse le firmware du lecteur pour comprendre comment sont traitées/encodées/chiffrées les datas.

En testant l'attaque sur la clé à café (C'est aussi un badge/tag NFC mais avec une forme de clé) j'ai pu de la même façon récupérer 4 clés B qui me manquaient, cela a pris plus de temps (2 heures au total). La comparaison par la suite de plusieurs dumps fut bien plus fructueuse !

On voit très vite en faisant une comparaison de 2 dumps sous leur forme hexadécimal qu'une seule valeur a changé et encore mieux, cette valeur correspond en décimal à la somme présente sur la clé ! Il est donc possible en changeant cette valeur de faire varier la somme présente sur la clef... Ce qui est interdit, je le rappelle !

J'ai ensuite voulu tester qu'elle était le montant maximum qui pouvait être mis sur la clé. J'ai donc essayé de mettre la valeur hexadécimal 0xFFFF qui aurait du créditer le badge de 65535 centimes soit 655,35€. Mais lorsque j'ai mis en contact la clé sur le lecteur la nouvelle somme affichée n'était que de 40,95€ ce qui correspond a la valeur hexadécimal 0xFFF qui est donc la somme maximale possible sur la clé (11111111 1111xxxxxx en binaire).

Concernant les badges d'accès d'immeuble, le premier ne présentait que des clés par défaut et a pu donc être cloné directement avec mfoc mais celui si disposait de 2 technologies différentes, une partie MIFARE Classic 1k et une partie HID iCLASS qui nécessite du matériel différent (Proxmark3, lecteur/graveur HID pour être analysé/cloné. Le second badge correspondant à celui de mon immeuble a pu être cassé, dumpé et cloné grâce à la "Nested Attack" en 1 heure.

Si vous possédez un smartphone compatible NFC, il existe plusieurs applications comme MIFARE Classic Tool - MCT qui vous permettrons de dumper/réécrire sur vos différents badges MIFARE CLassic 1k. Il vous suffira de rentrer les clés A et B si vous les connaissez ou les avez cassé.

Pour aller plus loin et si on en a les moyens le proxmark3 semble être l'outil parfait, il supporte les fréquences 125kHz, 134kHz (HID Prox II, HITAG, EM4100) ainsi que les communications en 13,56Mhz (MIFARE Classic/Ultralight et iClass). D'ailleurs si quelqu'un en a un qui traîne...

Fap'ment,

++