Yescard cafe

Auteur : Xylitol
Zine : Rafale #20


Salut à vous, dans cet article on va s'intéresser aux badges à café qui 
fonctionnent via la techno Mifare Classic !

Pour ma part j'ai en ma possession un badge U-key, voilà à quoi ça ressemble :








Ce badge utilise la technologie sans contact mifare, c'est compatible ISO 14443, 
et le design a été breveté par Microtronic.

Le badge est utilisé en tant que porte-monnaie électronique pour différents 
systèmes cashless, notamment dans la distribution automatique.


Voilà un aperçu de la doc commerciale :




Microtronic fournit juste une solution, les compagnies de distributions 
l'implémentent par la suite à leur sauce.



Dans un premier temps on va mettre en place un environnement, pour pouvoir lire 
le contenu de nos badges à café et pouvoir en faire un backup.

Cet exemple s'applique de manière générale a tous types de badge utilisant la 
technologie mifare classic. Vous aurez donc besoin d'un raspberry pi ainsi que 
d'un module PN532, le mien provient d'Adafruit.

 tout connecté en UART comme sur cette illustration :
  



Pour pouvoir faire une copie sur un autre support, il nous faut aussi un badge 
vierge ! À savoir que chaque badge possède un UID écrit en usine situé dans le 
bloc 0 du secteur zéro, celui-ci est non modifiable.

Heureusement pour nous, nos amis chinois ont trouvé une parade et du coup, 
certains vendent des cartes avec UID modifiable.

On parle souvent de 'backdoor' ou de 'magic card' pour désigner ce type de 
carte, et y'en a plein en vente sur eBay.


L’occasion aussi pour moi de ressortir l’embosseuse : 






Y’a juste un truc à prendre en compte quand on embosse une carte sans contact, 
c'est de faire attention à ne pas frapper la bobine ou la chip.

Pour les trouver dans l'espace, un coup de lampe derrière la face que l'on 
regarde donne assez de lumière pour révéler la zone à éviter.




Comme système d'exploitation pour Raspberry pi, j'utilise Raspbian Stretch sur 
une carte micro SD de 16 Go.

Commençons donc par le début : l'installation de libnfc pour pouvoir communiquer 
avec notre module PN532.

Tapez donc ça dans le terminal :

apt-get install autoconf libtool libusb-dev libpcsclite-dev build-essential
wget https://github.com/nfc-tools/libnfc/releases/download/libnfc-1.7.1/libnfc-1.7.1.tar.bz2
tar -jxvf libnfc-1.7.1.tar.bz2
cd libnfc-1.7.1
autoreconf -vis
./configure --with-drivers=all --sysconfdir=/etc --prefix=/usr
make
sudo make install
sudo mkdir /etc/nfc
sudo mkdir /etc/nfc/devices.d



Ensuite on copie le fichier de configuration pour utiliser la breakout sur les 
pins uart:

sudo cp contrib/libnfc/pn532_uart_on_rpi.conf.sample /etc/nfc/devices.d/pn532_uart_on_rpi.conf


Et c'est terminé pour l'installation de libnfc, sauf si vous utilisez un 
raspberry pi 3 : /dev/ttyAMA0 a été détourné pour les besoins du Bluetooth 
(nouvelle fonctionnalité dans rpi 3).

À la place on a une substitution, un mini-uart qui réside dans /dev/ttyS0.

Pour faire fonctionner l’interface série et le Bluetooth, il n'y a qu'un pas :

sudo nano /boot/config.txt


puis rajouter:

enable_uart=1


Ou modifier enable_uart=0 par enable_uart=1 si vous l'avez déjà.

Un redémarrage système est nécessaire pour prendre en compte le changement, 
ensuite il faut également éditer le fichier de configuration qu'on a 
précédemment copié pendant l'installation de libnfc:

sudo nano /etc/nfc/devices.d/pn532_uart_on_rpi.con


Et remplacer :

/dev/ttyAMA0

Par : 

/dev/ttyS0


Voilà, si tout se passe bien en tapant nfc-list vous devriez voir apparaître ça :

pi@raspberrypi:~ $ nfc-list
nfc-list uses libnfc 1.7.1
NFC device: pn532_uart:/dev/ttyS0 opened


Super, maintenant on sait lire les badges, sauf si ceux-ci sont protégés en 
lecture.

On va donc installer mfoc (Mifare Classic Offline Cracker) qui est un outil qui 
récupère les clés inconnues à partir de clés connues, on parle ici de 'Nested-
attack' qui a été développé en 2009 par Nijmegan Oakland et implémenté par 
Nethemba dans leur outil mfoc :

wget -O mfoc-master.zip https://github.com/nfc-tools/mfoc/archive/master.zip
unzip mfoc-master.zip
cd mfoc-master/
autoreconf -vis
./configure
make
sudo make install

Et voilà on est bon !

Maintenant y'a plus qu'a placer votre badge sur la PN532, puis :

mfoc -P 500 -O badge_cafe.mfd

mfoc va d’abord essayer de lire les secteurs à partir de clés connues, puis 
avec les résultats obtenus faire une attaque nested pour trouver les clés 
manquantes (A) et également récupérer les clés qui permettent l'écriture du 
badge (B).




C’est une opération qui peut pendre du temps, avant d’obtenir un résultat.





Une fois le dump obtenu vient le temps de la réflexion sur "comment ça marche".

J'utilise hexedit pour visualiser/éditer le contenu du dump.

sudo apt-get install hexedit
hexedit badge_cafe.mfd

La solution la plus simple est d’interagir avec le distributeur : mettre de 
l'argent ou en dépenser puis refaire un dump, de manière à pouvoir comparer ce 
qui change entre les dumps.

Voir s’il y a des timestamps, crc, ou autre...

On peut essayer aussi de faire du double spending : le principe et de faire une 
copie identique du badge, puis de dépenser de l'argent sur l'un des deux badges, 
et de voir si le second badge a toujours la valeur d'origine.

Si l'un des badges a toujours le solde d'avant l'achat, cela signifie très 
probablement que le solde du compte est stocké dessus.



Dans mon cas je me suis rendu compte que dans le secteur 1 bloc 2, à chaque 
fois, j'avais 4 bytes qui changeaient. Par exemple : 01DE devenait 019C et dans 
tout le reste du secteur rien d'autre ne changeait.

Converti en décimale 01DE donne: 478. Pour 019C : 412. Soit 4.78€, après un café 
: 4.12€, le café coûtant 66 centimes.

Aucun doute, c’est le solde du compte !



En regardant plus loin et en convertissant un peu tout le dump en décimal j'ai 
retrouvé autre chose : mon numéro d'utilisateur (cf la doc commerciale U-key), 
qui permet de "tracer" les transactions du badge.

Donc possibilité d'usurper un autre badge en plus de pouvoir manipuler le solde, 
c'est pas mal !

Il n'y a plus qu'à tester.

Pour faire une copie, placer votre badge chinois sur le PN532 et dumper le de la 
même manière que votre badge avec mfoc, puis on utilise nfc-mfclassic pour 
écrire notre badge chinois:

nfc-mfclassic W B badge_cafe.mfd badge_chinois.mfd




Assurez-vous que vous écrivez bien tout les 64 blocs de votre badge chinois, et 
non pas 62 sur 64.

L'argument 'W' est pour 'unlocked write' qui sert uniquement aux magic cards 
(qui permet d'essayer d'écrire sur le secteur zéro.


Viens le temps du test. Ici j'ai remplacé ma valeur par 0539 (soit 1337 en 
décimal):







leet money !

Dans mon cas je ne peux pas aller au-delà de 40€ sinon la machine bloque le 
badge, on n’y pense pas assez souvent, mais certaines machines ont un plafond et 
si celui-ci est dépassé, la machine verrouille le badge.




Dans mon cas la machine écrit un byte dans le secteur 1 bloc 1. Elle remplace un 
'01' par '81' et mon badge semble refusé par toutes les machines par la suite, 
même en alliant un seuil inférieur au blocage, la solution est donc de remplacé 
le '81' par le '01' et voilà, on a déblacklisté le badge.



Conclusion ?

Cette série de machines est vulnérable sans doute, car ancienne. Il serait assez 
simple d'éviter ce genre de hack si le système avait été pensé autrement 
(stocker le solde du compte sur un serveur, et non pas sur le badge ; utiliser 
mifare DESfire à la place de mifare Classic et rajouter plus de contrôles.

Cet article vous a présenté ce qu'on est capable de faire avec juste un 
raspberri pi et un badge chinois. Il y a d'autres attaques envisageables (par 
exemple bloquer l'écriture pour ne pas que la machine puisse modifier le solde 
du badge, utiliser un bus pirate pour sniffer la machine, etc..). Mais ici j'ai 
juste choisi de vous présenter les deux plus simples méthodologies.

Garder à l'esprit que manipuler le solde du compte pour avoir des cafés gratuits 
ça reste du vol.

Cet article a été écrit pour le fun et la recherche, pas pour tirer profit d'un 
système vulnérable.