Petit solutionnaire pour le brute force du PIN code.
Selon les spécifications, on peut deviner que le protocole ressemble à ceci:
Kiosque --[VERIFY PIN_CODE]-> Carte Kiosque <-[ Pin Ok? ]-- Carte
Le format de la réponse pour la commande VERIFY est inconnu. Il suffit de faire une tentative pour avoir une idée du format de la réponse.
Requête VERIFY (tel que défini dans l'énoncé):
00 20 00 00 04 30 31 32 33 00: CLA 20: INS 00: P1 00: P2 04: Longeur du payload en bytes (4 chars) 30 31 32 33: Code ascii pour le code "0123"
Réponse obtenue:
FF 63 00 FF: Corps du message 63: SW1 Code de status 00: SW2 Code de status
Notre première intuition a été de détecter un changement au contenu du message (1er byte).
Après une centaine de requêtes, 0x00
est retourné. Lorsqu'une requête pour un autre code est fait, la réponse est également 0x00
. Le message était maintenant 0x00
à tout coup..
Comme le message semble changer périodiquement entre 0xFF
et 0x00
, une détection sur un changement de SW1 ou SW2 est utilisée. Cette verification a permis l'identification du code valide lorsque SW1 est devenu 0x90
. Et cette fois ci, la réponse était fiable.
Les "status bytes" (SW1, SW2) sont des codes qu'on pourrait comparer aux codes de retour HTTP (200 OK, 404 Not Found, etc). Pour le protocole Smart Card ISO/IEC 7816, voici les codes standards: ISO/IEC 7816 Table 12.
Requête pour le code "0719":
00 20 00 00 04 30 37 31 39
Réponse d'un succès:
90 00 [vide] : Corps du message 90: SW1 Code de status <-- Indicateur que le code est valide 00: SW2 Code de status
Pour faire le brute force, un script a été fait avec la librarie pyscard.