Voici la cinquième partie du récit de la piste des cartes à puce au NSEC 2013. Vous pouvez consulter les quatre premières parties: partie 1, partie 2, partie 3 et partie 4.
J’avais bien avancé et il ne me manquait plus qu’une information pour construire les clés nécessaires au changement de NIP sur la carte: les app log data xorées.
J’ai alors décidé de regarder la seule application que je n’avais pas encore examinée, la nouvelle application d’accès. Elle offrait plus de commandes: GetChallenge, verify, read record, write secured et write unsecured. J’étais pas mal certain que write secured servirait à écrire le nouveau NIP au terme de la procédure complexe, alors j’ai d’abord lancé un GetChallenge. Il m’a retourné une chaîne hexadécimale de la bonne longueur. J’ai essayé de la soumettre, au cas où la partie XOR serait une fausse piste.
C’était évidemment mauvais et, comme GetChallenge ne prenait aucun paramètre, il fallait essayer une autre commande. Je me suis tourné vers read record, qui semblait la bonne façon d’extraire des données de la carte. Après avoir cherché les bons octets à envoyer, j’ai lancé une lecture du premier enregistrement et j’ai obtenu une autre chaîne hexadécimale de la bonne longueur. J’ai essayé de faire un XOR entre le défi et cette chaîne et… échec. J’ai donc lu le deuxième enregistrement et reçu une autre chaîne hexadécimale de la bonne longueur. À ce moment-là, j’ai écrit un programme Java pour lire tous les enregistrements de 1 à 255. Voici la sortie:
00B200067F response: 6A83
00B201067F response: D9D12BF27418984A9000
00B202067F response: 30E4F1EE16B6A5999000
00B203067F response: 5D16DA4DF926A0D89000
00B204067F response: 6A83
00B205067F response: 6985
00B206067F response: 6A83
00B207067F response: 6A83
00B208067F response: 6985
00B209067F response: 6A83
00B20A067F response: 6A83
00B20B067F response: 6A83
00B20C067F response: 6A83
00B20D067F response: 6985
00B20E067F response: 6A83
00B20F067F response: 6A83
00B210067F response: 6A83
00B211067F response: 6A83
...
J’ai obtenu 3 chaînes hexadécimales, puis tous les enregistrements suivants étaient invalides. J’ai fait le XOR de ces 3 chaînes et soumis le résultat: mauvais. J’ai essayé toutes les permutations de ces 3 chaînes: mauvais. J’ai fait le XOR de ces 3 chaînes avec le défi: mauvais. Chaque fois, je relançais la lecture complète de la carte, au cas où il y aurait eu quelque chose lié au nombre de lectures ou aux tentatives de VERIFY qui aurait ajouté des enregistrements. À un moment donné, la carte s’est mise à se comporter bizarrement et à retourner l’erreur 6985 pour tous les enregistrements, ce qui m’obligeait à la retirer physiquement et à la réinsérer. Le comportement était donc capricieux. Ça peut sembler ridicule, mais j’ai passé bien plus d’une heure à essayer des choses pour obtenir les app logs xorées. Je suis même allé dire aux organisateurs que leur drapeau était erroné dans la base de données, tellement j’étais convaincu d’avoir fait les XOR correctement. Ils sont venus voir ce que je faisais et m’ont répondu que non, tout y était.
00B200067F response: 6A83
00B201067F response: D9D12BF27418984A9000
00B202067F response: 30E4F1EE16B6A5999000
00B203067F response: 5D16DA4DF926A0D89000
00B204067F response: 6A83
00B205067F response: 6985
00B206067F response: 6A83
00B207067F response: 6A83
00B208067F response: 6985
00B209067F response: 6A83
00B20A067F response: 6A83
00B20B067F response: 6A83
00B20C067F response: 6A83
00B20D067F response: 6985
00B20E067F response: 6A83
00B20F067F response: 6A83
00B210067F response: 6A83
00B211067F response: 6A83
...
J’étais fatigué d’essayer des permutations, alors je suis allé aider Daniel sur une autre piste. Au bout d’un moment, je suis revenu à celle-ci, j’ai relancé la boucle de lecture et j’ai vu que j’avais des erreurs 6985. Je me suis dit que c’était encore la carte corrompue qui retournait de mauvaises valeurs. Je l’ai retirée et réinsérée: mêmes erreurs. J’ai cherché la signification de l’erreur 6985: « conditions of use not satisfied ». J’avais aussi remarqué à ce stade que c’étaient toujours les enregistrements 5, 8 et 13 qui retournaient ces erreurs, les autres retournant toujours « enregistrement invalide », sauf quand la carte était en mode corrompu et que tous les enregistrements retournaient 6985.
Juste pour voir, j’ai essayé de lire les enregistrements 5, 8 et 13 avant les 1, 2 et 3. Cette fois, ça a fonctionné: j’ai obtenu les 6 valeurs et j’ai remarqué que le défi que je recevais était égal à la valeur de l’enregistrement 13. J’ai fait le XOR de tout ça et j’ai obtenu le drapeau.
J’étais vraiment content, parce que ce drapeau signifiait que j’avais tout ce qu’il fallait pour suivre la procédure de changement de NIP. Je raconte cette histoire dans la prochaine partie.
