logo

Cette page a au moins 13 ans !
This page is at least 13 years old !

L'utilisation concrète des méthodes décrites dans cet article est sevèrement punie par la loi.
Le fait d'altérer à profit une somme d'argent virtuelle est considéré au mieux comme du vol, ou au pire comme de la fausse monnaie. Les peines liées a ces infractions peuvent être appliquées de la même façon, même si il n'est question que d'une tasse de café ou d'un paquet de m&m's.

Mise à jour: replay attack testée et approuvée !

Version en anglais

Description du hardware

Les iButton™ (Maxim/Dallas) sont des circuits intégrés conçus pour être maltraités et intégrés dans plein de choses.
Le package F5 en lui-même peut contenir différents circuits, allant de la simple mémoire, au logger de température protégé par mot de passe.
Ils sont souvent confondus avec des piles bouton (piles de montre) à cause de leur apparence.

Ils sont couramment utilisés dans les badges et autres systèmes d'identification (certaines entreprises de location de véhicules s'en servent à la place d'autocollants RFID).
Les applications sont vastes et avantageuses dans de nombreuses situations.
Ils utilisent la technologie 1-Wire, tous les transferts de données se font entre la masse (bord) et le contact (centre) du boitier.
La plupart s'auto-alimentent "avec les données": L'énergie necessaire pour que le iButton fonctionne est tirée d'un faible courant absorbé pendant les états haut sur le contact.

Une catégorie d'iButtons est spécialement faite pour contenir des données sensibles;où la lecture et l'écriture de données ne doit pas être à la portée du premier abruti venu (Challenge/Response SHA1, ça rappelle malheuresement les cartes téléphoniques). Mais là où les décisions sont prises en faveur du cout initial plutôt que de la sécurité, on peut se retrouver avec de simples RAMs non-volatiles contenant des sommes d'argent pas tout à fait négligeables.

La face de contact des iButtons est gravée avec leur numéro de série (unique), leur CRC ROM, et leur "reférence silicium". Elle est souvent illisible sur les clés utilisées par des bourrins.

 

Trouvailles, théories et idées

C'est un ami [yotienpluche], qui a son travail, dispose de machines à bouffe et à boisson fonctionnant soit avec des pièces, soit avec une clé iButton ("clé Dallas" ou encore "Clé Nespresso Professional" comme certains revendeurs les appellent). En la regardant de plus près, on s'attendait à lire "DS1961" soit un iButton monétaire (SHA1 1KBit NVRAM), mais c'est "DS1992" (1KBit NVRAM) que nous avons lu.

Je doute beaucoup que ce genre de jeton monétaire tenant sur de la simple RAM soit très répandu mais... On en tient un, pourquoi ne pas en profiter ?

On pensait alors au départ noter la somme indiquée par le distributeur, et la comparer avec le contenu brut du iButton, pour d'abord savoir si elle était écrite en clair, et sinon, trouver une éventuelle correspondance avec les différentes données (somme, CRCs, numéro de série, valeur fixe imposée par le constructeur des monnayeurs...).
En sachant que le distributeur peut lire le numéro de série du iButton, et qu'il pourrait facilement coder la somme avec celui-ci, on a vite oublié l'idée de vraiment "forger" des données avec une somme variable à souhait.

Une méthode beaucoup plus simple consisterait à recharger l'iButton avec une image copiée.
Voici une illustration de ce qui pourrait être possible, moyennant quelques bricolages et écritures de programme:

- L'utilisateur recharge sa clé iButton normalement, avec 10 Euros par exemple.
- Il fait ensuite un "backup" de l'image mémoire du iButton avec un montage portable, qui la retiendra indéfiniment.
- Une certaine quantité de nourriture et de boissons peut alors être achetée tout à fait légalement, avec les 10 Euros.
- Une fois le crédit écoulé, l'utilisateur pourrait récharger lui-même sa clé avec l'image précedement enregistrée depuis le montage.
- Il peut donc recommencer à acheter avec 10 Euros virtuels tout frais, en parfaite illégalité.

Comme écrit ci-dessus, cette pratique serait tout à fait illégale et est punie par la loi. Ne faites donc jamais ça, n'y pensez même pas. D'ailleurs je l'ai jamais fait.

 

Recherche

Pour des raisons similaires à celles qui motivent ce projet (radinerie excessive), j'ai construit un petit montage sur plaque d'essai pour lire et écrire dans ces types d'iButtons (NVRAM DS1992/DS1993).
Le premier µC à me tomber dans les pattes était un AtMega8, mais au final, n'importe quel µC ayant un UART et un bon 2Ko de flash fera l'affaire (Tiny2313, Tiny26, PIC16F88...).
Le circuit consiste en une LED rouge, l'AtMega8 et un Max232.
J'utilise un adaptateur série/USB chinois à $4, un vieux câble de modem coupé et un bloc d'alim à 5 euros chez Castorama (qui, au passage donne généreusement 7.4V quand on en veut 5).

Les premiers éssais furent menés avec HyperTerminal et un gros firmware de 7120 octets. Il permettait de lire le ROM, identifier le type d'iButton, de lire une partie de la RAM et de la réécrire, le tout par liaison série. La LED rouge servait au début à confirmer simplement la détéction du iButton.

Les détails techniques suiveront plus tard. Le firmware d'essais actuel fait maintenant juste l'intermédiaire entre la liaison série et la liaison 1-Wire, sans réflechir. Un pauvre programme fait avec Visual Basic permet de s'occuper des messages à transmettre et de déchiffrer ceux qui sont reçus. Toute la RAM (128 ou 512 octets) des deux types de composants peut être lue et écrite.
Toutes les vérifications sont assurées par le microcontrolleur, et les erreurs sont reportées dans le logiciel.

La RAM ne peut être écrite que par "banks" de 32 octets, le DS1992 possède 4 de ses banks. Si il faut écrire des données sur deux banks, il faut écrire le début sur l'une, valider, écrire la fin sur l'autre, puis revalider.
L'étape de validation est nécéssaire car les données sont d'abord écrites dans le "scratchpad", une sorte de mémoire temporaire pour pouvoir être vérifiée avant d'être copiée dans la vraie RAM.
C'est d'ailleurs dans cette étape que se trouve la plus évidente des vulnérabilité avec les iButtons à mot de passe: si le scratchpad n'est pas remis à zéro après un accès à une bank protégée, il y a de grandes chances qu'il traîne encore dessus même après avoir retiré l'iButton...

 

Format des données numériques

Malheuresement, les données dans les iButtons DS1992 pour ces distributeurs ne suivent pas de conventions précises données par Maxim, et utilisent des UDP (Universal Data Packet).
Les seuls octets significatifs que l'on connais à ce jours sont:

Le CRC16 de la page en rouge.
La Longueur du contenu en vert.

Dump complet avec 2.07€: Serial: 0000008DB8D6 CRC: B2

Page 0:
1D 32 14 88 8B 20 68 C8
02 BC 83 55 55 A1 AB B5
ED A7 30 07 B1 93 7C 55
75 25 BD 8C 16 F4 2B 99
Page 1:
05 CC 4C BE 36 D2 0C F1
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55
Page 2:
05 13 45 25 C5 CA 56 52
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55

Page 3:
05 11 1E 8F 36 67 DF 9D
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55
55 55 55 55 55 55 55 55

Les dumps suivants sont tirés depuis cet article.

Dump de la première page avec 3.39€: Serial: 000000A5425B CRC: B8

Page 0:
1D 22 D5 0C B4 D3 2A 06
DD 6C 20 D1 79 17 E6 73
6B E2 23 7F 8D EB 6E CE
43 22 2F 9A DF 9F 1F 5A

Dump de la première page avec 0.95€: Serial: 000000A5425B CRC: B8

Page 0:
1D 23 D9 0C B4 D3 2A 06
DD 64 20 D1 79 17 EA 73
6B E2 23 7F 8D EB 6E CE
46 2E 2F 9A DF 9F C7 1B

 

 

Exploitation: Réalisations matérielles

Un bouton poussoir permet d'alimenter le montage, il permet de ne pas siffler les piles avec un mode veille (SLEEP) durant les longues périodes où il n'est pas utilisé.

Un switch Backup/Restore permet de choisir dans quel mode le montage fonctionnera (il faut positionner ce switch avant d'alimenter le montage).

Deux LEDs indiquent ce qui est en train de se passer.

LED verte fixe: Le montage est en mode Restore (restauration, recharge) et attends le contact d'un DS1992. Ensuite...
LED verte clignotante: La restauration a été correctement effectuée, la clé est rechargée.
LED rouge clignotante: La restauration a échoué, les différentes causes peuvent être (dans l'ordre de probabilité): un faux contact, la clé n'est pas un DS1992, la clé est crammée.
Les deux LEDs sont allumées: Le Serial de l'image enregistrée n'est pas le même que celui de la clé. Une image mémoire faite d'une clé ne peut pas fonctionner sur une clé différente. C'est normal.

LED rouge fixe: Le montage est en mode Backup (enregistrement) et attends le contact d'un DS1992. Ensuite...
LED verte clignotante: L'enregistrement a été effectué et restera inchangé jusqu'au prochain enregistrement.
LED rouge clignotante: L'enregistrement a échoué, les différentes causes peuvent être (dans l'ordre de probabilité): un faux contact, la clé n'est pas un DS1992, la clé est crammée.

Le logiciel et le montage ont été testés et fonctionnent. L'essai sur le terrain a finalement été fait, et ça marche.

Exploitation: Réalisations logicielles

Désolé, je ne fournis plus les sources ni les firmwares compilés. Les corbeaux rodent...

MAXRETRY définit le nombre d'essais de lecture ou d'écriture avant de déclarer un échec (LED rouge clignotante), fixé par défaut à 5.
RWSWITCH PB3 broche du switch R/W
IBUTTON PB2 broche du contact iButton
GREENLED PB1 broche de la LED verte
REDLED PB0 broche de la LED rouge

Selon les specs officielles du DS1992 et du book of standards:
WRITEONE 10 // min:1µs max:15µs Temps du l'état bas pour l'écriture d'un 1
WRITEZERO 90 // min:60µs max:120µs Temps de l'état bas pour l'écriture d'un 0
TIMESLOT 120 // min:60µs max:120µs Temps total d'écriture d'un bit
RESETLOW 500 // min:480µs Temps de l'état bas pour décharger et redemarrer un iButton
RESETHIGH 500 // min:480µs max:960µs Temps de l'état haut entre deux requètes de presence
PRESENCE 70 // min:60µs Temps à attendre avant de lire une éventuelle réponse

MINWAIT 100 // Ralentissement arbitraire pour des questions d'ergonomie et de fiabilité (en millisecondes)

footer
symbol symbol symbol symbol symbol