WriteUp IRL Hacking – Le porte-monnaie NFC “””sécurisé”””
Ce “challenge” IRL est exposé ici à titre d’information. Je ne suis pas responsable de l’utilisation que vous ferez de ce writeup (faites pas les cons 😉 ).
Aussi, pour des raisons de confidentialité, je vais flouter une bonne partie des captures, données etc. Le but ici étant juste d’exposer une vulnérabilité connue, non pas une entreprise qui ne s’est pas tenue à jour sur le sujet InfoSec de ses produits.
On va donc aujourd’hui s’intéresser à la technologie NFC (Near Field Communication ou communication en champ proche). Cette technologie se répartit en plusieurs sous catégories, différentiées par leur débit de communication.
Mon but: Démontrer qu’une erreur de programmation / conception peut être exploitable sans trop de connaissances.
Le matos (indispensable):
- La clé est un modèle peu standard par sa forme, mais qui fonctionne comme n’importe quel badge NFC.
- Le lecteur est un lecteur classique ACR122U lowCost en vente chez tous vos revendeurs chinois !
- Une bière (voire plusieurs), parce qu’il y a 31 étapes de brute-force (no joke).
Niveau software il va falloir s’armer: d’un linux, de la lib nfc, de miLazyCracker et de patience, beaucoup de patience. Pour ce WriteUp, je vous épargne les étapes d’installation des librairies et je vais rentrer direct dans le vif du sujet.
Il ne faut pas oublier d’effectuer les commandes suivantes, sinon vous allez avoir un accès refusé (ou un message chiant qui s’y rapproche) au lecteur:
La première étape du raisonnement, c’est tenter de déchiffrer chaque secteur avec des clés connues (par défaut). Cette opération se fait avec la commande mfoc/
On remarque qu’il n’a réussi à trouver que la clé A d’un seul secteur. C’est là que se trouve l’erreur du fabriquant. En effet, il existe une attaque qui se base sur une clé connue pour retrouver (toutes) les autres ! Cette attaque s’appelle “Hardenested mifare attack”, et c’est une dérivée de dark_side, qui elle est plus ancienne.
On va donc s’appuyer sur l’outil miLazyCracker qui nous permet d’exploit cette attaque facilement:
Cette commande peut se traduire de la manière suivante: “Je connais la clé a0a1a2a3a4a5 qui correspond au secteur 0 clé n°A, et je veux la clé n°A du secteur 1”.
Si vous avez de la chance, le tool va vous trouver votre clé en moins de temps qu’il n’en faut pour dire “bruteforce”… et puis il y a moi .
Dans ce genre de cas, deux solutions s’offrent à nous. Soit on give up direct, soit on crie très fort et on initialise le bruteforce dès qu’il nous le propose (avec une complexité élevée -> ~2^42 au max, soit 20 min de bruteforce sur mon laptop nul)
Et la magie opère :
Voila ! et de une ! plus que ….. 30 ! wouhou.
Vu que je n’ai pas scripté le process, et que le but c’est pas de l’industrialiser, je l’ai fait à la main …. 🙂 j’aime souffrir. Après plusieurs heures de bruteforce plus ou moins fructueux, j’ai trouvé toutes les clés ! je les ai rassemblées dans un fichier, une clé par ligne:
Et enfin, on relance mfoc mais avec notre keyfile:
Et bingo… un dump tout frais de la clé ! On converti tout ça en hexa:
Après analyse, et de nombreux achats de café, redump, rachat de café, re-redump, je n’ai toujours pas réussi à comprendre comment ils stockaient les données sur la clé (même avec l’aide de switch :O).
Lors de ce dump, le montant de ma clé était de 904 centimes, soit 0388 en hexadécimal. qui est noté deux fois sur la clé. On a également l’ancien solde de la clé qui est noté juste en dessous: 03A0 soit 928 centimes.
Dans tous les cas, j’ai continué mon investigation en essayant de réécrire sur la clé grâce à la librairie nfc:
Mais comme on peut le voir, ça a planté ! et pour une bonne raison ! c’est que cette commande ne permet que d’écrire avec les clés A. Il faut donc recommencer avec les clés B:
Et magie ! Après vérification à la machine à café, je suis bien retourné à mon solde précédent.
Voilà, je pense que je ne vais pas m’attarder plus sur ce PoC, je tiens à rappeler que je n’utiliserai pas cette technique pour bénéficier d’avantages quels qu’ils soient, et vous ne devriez pas le faire non plus….
Je me demande quand même pourquoi ils ont décidé de laisser cette clé par défaut… probablement que le lecteur effectue un calcul simple avec l’uid de la clé NFC et la clé n°A pour déterminer le reste des clés des secteurs, et déchiffrer la clé….
La bise.
Commentaires
Salut Sicarius,
Lorsque je souhaite faire une hardnested attack, j’ai un message d’erreur. J’ai l’impression que mon script présent dans le dossier crypto-bs (libnfc_crypto1_crack.c ) n’est pas le meme que celui que tu utilise ici (libnfc_crypto1_crack), c’est normal ce petit .c à la fin?? 🙂
Salut ! si il n’y a pas le .c à la fin c’est que j’ai utilisé GCC pour le compiler le rendant exécutable 🙂