Vous n'êtes pas sans savoir que la technologie évolue (rapidement même), notamment sur les machines à cafés/boissons qui de plus en plus intègre un système de paiement par badge (ou une carte, voyez la même chose) NFC, enfin pas réellement puisqu'il faut d'avance le créditer. Par curiosité, j'ai mis mon nez dedans !

Attention !

Cet article n'est pas là pour vous apprendre à comment hacker un badge NFC mais plutôt de démontrer les faiblesses, c'est en quelque sorte mon retour d'expérience sur le sujet. Vous pouvez toujours tester ça de votre côté mais n'oubliez pas que vous êtes responsable de ce que vous faites, à vos risque et périls !

Information !

Ces 6 derniers mois, vous avez été plusieurs à me demander les dumps de ces cartes et malheureusement chose que je refuse volontairement de faire. Le but de cet article est réellement de montrer les faiblesses du NFC, mes méthodes d'analyses, et ma conclusion personnel mais en aucun cas à vous fournir un dump prêt à utiliser sur vos cartes pour les machines D8/Selecta.

C'est quoi le NFC ?

Je vais pas ré-inventer la roue, la lecture de cet article sur Wikipédia fera parfaitement l'affaire.

Pourquoi faire ça ?

Pourquoi exploiter la carte gérant les crédits ? Simplement par curiosité et par objectif technique, rien de plus. C'est bête mais j'aime comprendre le fonctionnement et l'exploitation des choses :)

Quel matériel faut-il ?

On s'attaque à quelque chose de physique/hardware/matériel, forcement il faudra s'acquérir d'un peu de matériel. Fort heureusement il n'y a pas grand chose et le prix total ne sera pas d'une grande somme (- de 100€). Pour ma part, j'ai utilisé :

  • Un OrangePiZero sous Linux (Debian)
  • Un lecteur NFC, ACR122

Si vous commandez le ACR122 sur le net, faites attentions aux frais de douane. Sinon vous pouvez toujours vous rabattre sur le RC522 (beaucoup moins chère) mais plus chiant à installer pour les drivers.OrangePiZero + ACR122

Quel logiciel faut-il ?

Avoir du matériel sans les softs/drivers, ça sert pas à grand chose. J'ai utilisé :

  • Les drivers pour le lecteur NFC ACR122 (par ici)
  • Le soft mfoc pour faire du brute force sur les clés (on verra après les détails)
  • Le soft nfc-mifare pour faire l'injection (on verra ça aussi après)
  • Le soft xxd (qui sera très utile)
  • Le soft binwalk (qui s'avère pas très nécessaire)

Comme beaucoup de monde qui se lance dans l'aventure, il y a forcement des petits soucis sur des dépendances, par exemple avec libusb et/ou libnfc qui peuvent éventuellement rendre parano. C'est d'ailleurs pourquoi j'ai utilisé l'OrangePiZero car j'ai presque pas eu de problème, du moins pas sur les librairies mais sur d'autres petites bricoles (réglés en ~15min).

Au final pour avoir un truc prêt à l'usage, il faut avoir ça :nfc-list
Et avec la carte posée :nfc-list + carte

Exploitation du badge !

Etape 1 - Le dump

La première étape est bien évidemment de lire la carte, mieux encore, d'en faire un dump pour l'exploiter plus facilement. Pour ça j'ai utilisé mfoc bien célèbre dans la matière :mfoc dump1
J'ai eu le temps de prendre plusieurs cafés, le brute force est en action à ce stade. Bon généralement c'est assez rapide, faut compter 10-15 min...

Etape 2 - Le dump (encore)

Maintenant que j'avais réussi mon premier dump, il fallait trouver une méthode pour le lire, chose que j'explique dans la partie suivante, vous comprendrez mieux après...

La différence, c'est que le second dump devait être différent d'un certain point de vue, avec des crédits en moins (ou en plus, au choix). Par exemple en prenant un café (fonctionne pas si vous avez des cafés gratuits évidemment) ou une bière.

Second dump ! On check la différence rapidement :md5 dumps

Etape 3 - L'analyse

Maintenant que les dumps sont fait, faut encore arriver à les lires, plus compliqué ! Bon j'ai d'abord regardé le type de fichier et tenté de voir ce qu'on pouvais y trouver :
Bon c'est pas gagné :view with file
De cette manière non plus :view with less
Par contre on retrouve ce issi5650, j'ai donc fais quelques recherches sur le net. Bof rien trouvé de spécial... Et avec binwalk ?view with binwalk
Finalement (après quelques heures/jours) j'ai trouvé quelques pistes avec xxd, qui va s'avérer très utile par la suite ! view with xxd
A ce moment, je me suis dit, va falloir mettre les mains dans le cambouis (hexa)... Bon à l'arrache, j'ai chercher à savoir quels blocs étaient modifiés, j'ai fais assez simple :vimdiff
Après plusieurs heures/jours de recherches là aussi, j'ai finalement réussi à comprendre un peu la chose. Le montant de la carte est inscrit en dur... Bon vous serez d'accord d'avoir la même réaction que moi, beurk...

C'est le l'hexa, donc le montant n'est pas directement visible (sauf si vous êtes fort mais c'est pas mon cas ici), bref, c'est partie pour quelques conversions... Par exemple 15€00 fait 5dc en hexa :python hex 5dc
Pour retrouver l'inverse, presque même méthode, ici 4e2 fait 12€50 :python hex 4e2
J'espère que vous avez compris le principe. Dans mon cas voici ce que j'ai retrouvé :python tests and vimdiff
Vous comprendrez rapidement que :

  • Le dump n°1 contient un montant de 02€80 (hex: 0x118)
  • Le dump n°2 contient un montant de 00€30 (hex: 0x01e)

Bingo ! C'est exacte ! J'ai également constaté d'autres blocs modifiés en fonction des cafés mais j'ai pas étudié cette partie, peut-être que je le ferais un jour...

Je vous rajoute aussi un petit schéma concernant l'emplacement des secteurs/blocs :

Etape 4 - Les modifications

J'utilise directement vim pour y faire les modifications (oui à l'arrache). L'avantage d'y passer la commande xxd :

  • :% ! xxd (pour convertir le bin en hexa)
  • :% ! xxd -r (pour revenir en arrière avec les modifications)

J'ai donc testé en créditant la carte avec 15€00, donc 1500 en int, et 5dc en hexa. Les étapes :cp and vimview binaryconvert xxdchangesrevert xxdsave binary
N'oubliez pas de sauvegarde le fichier seulement une fois que vous êtes revenu à son point d'origine, sinon vous risquez d'avoir quelques surprises comme moi. M'enfin c'est pas dramatique non plus.

Etape 5 - L'injection

Maintenant que j'ai mon fichier modifié, il faut encore le renvoyer sur la carte. Volontairement je passe sur tous les petits détails mais la syntaxe est la suivante (pour ma part) :

nfc-mfclassic w B dump_modified.bin dump1.bin

Si vous souhaitez mieux comprendre pourquoi cette syntaxe, vous avez l'aide :nfc-mfclassic help
C'est parti pour l'injection (c'est rapide puisqu'on a déjà les clés) !nfc-mfclassic inject

Etape 6 - Les tests

Maintenant que la carte est modifiée, il faut la tester ! Rien de mieux qu'en situation réel non ? J'ai pas pris de photo pour des raisons privés.

Que faut-il en conclure ?

On va pas se mentir, c'est pas propre de gérer les crédits de cette manière, d'autant plus que la machine n'est pas connecté au réseau, donc aucune manière de contrôler ça... Je pense qu'il y a du travail à faire sur cette partie, peut être pas via un câble mais en wifi il y a matière à réfléchir sur la chose (puis avec un OrangePi/Raspberry, c'est assez simple de faire une passerelle).

Un autre point aussi très important, n'abusez pas du système pour vous payer des choses à gogo ! Vous serez rapidement pris la main dans le sac ! N'oubliez pas que votre carte possède un ID et que vous pouvez être tracé avec celui-ci, volontairement j'en parle pas pour éviter ça :)

Tout cela a été étudié pour la technique, rien d'autre !

Enjoy!
XORHAK