Lors de la première édition de leHACK qui a eu lieu en juin dernier, tous les participants se sont vu remettre un badge électronique assez minimaliste. Ce badge était constitué d'une LED et de ce qui ressemblait à une antenne. Et quelques petits trucs en plus, sensiblement cachés dans le circuit imprimé.
Ce n'était pas le premier challenge lié au badge que je réalisais, mais celui-ci a eu tout de même son lot d'erreurs. La plus grosse fut de ne pas mettre directement, comme je l'avais fait il y a deux ans, un indice ou un lien vers le début du challenge. Du coup, tous ceux qui s'y sont collés n'ont pas vraiment su par où commencer, et bon nombre d'entre eux ont repéré l'indice placé sur le badge: "Place me somewhere and be enlightened". Aussi se sont-ils empressés de chercher où placer le badge, harcelant le staff et moi-même pour avoir un indice permettant de localiser l'endroit en question.
Et il y a ceux qui ont cru que l'antenne était une antenne NFC (il y avait de quoi s'y méprendre), et qui ont essayé de "lire" le badge avec différentes applications. Ce qui a eu pour conséquence de faire clignoter la LED, avec un motif propre au fonctionnement du NFC. Certains ont pris cela pour le début du challenge, et ont ainsi cherché à décoder la trame, qui n'était qu'une conséquence de la tentative de communication du téléphone avec le badge. Ce dernier ne répondant bien évidemment pas.
J'ai ainsi rectifié le tir via un tweet indiquant qu'il y avait un indice pour identifier l'endroit où démarrait le challenge, qu'il s'agissait d'une URL, mais que ce n'avait rien à voir avec le texte. On était déjà l'après-midi, la journée était bien entamée.
Vous êtes intrigués par le badge @_leHACK_? Il y a pourtant bien un indice dessus sur l'endroit (URL) où il faut commencer. #BlackBadge #leHACK
— Damien Cauquil (@virtualabs) July 6, 2019
Finalement, plusieurs participants ont tiqué sur la présence de mon avatar sur le circuit imprimé, et sont allé chercher du côté de ce blog. D'autres ont juste pensé qu'il s'agissait d'une sorte de signature, là encore un manque de clareté de ma part dans la conception de ce challenge.
Quand j'ai pensé à ce challenge black badge, je voulais qu'il y ait différentes techniques et connaissances mises en oeuvre. Pour varier les plaisirs, mais aussi pour amener les participants sur des terrains qu'ils ne connaissent pas forcément, bien qu'il n'y ait rien eu de super exotique en soit. Les étapes étaient donc les suivantes:
Je ne vais pas entrer dans les détails de la résolution de ces épreuves car différents write-ups ont été écrits et publiés par les participants (liens plus bas), mais je vais élucider certains points techniques et l'origine de certaines étapes.
Tout d'abord, la seconde étape. Je voulais intégrer une épreuve de cryptographie abordable, pas techniquement très complexe mais qui joue avec la manière dont elle est mise en oeuvre plutôt que la robustesse des clés ou des algorithmes. Disons que le bruteforce c'est bien, mais l'objectif était d'amener une vulnérabilité moins triviale qu'une clé de chiffrement facilement devinable (ou factorisable), et des concepts de mathématiques rebutant le débutant. Il m'a semblé intéressant d'explorer les modes d'opération, car tout le monde connaît le mode CBC (on dit un grand "merci" aux attaques par oracles de padding), mais je me suis rendu compte que les autres modes étaient un peu délaissés. j'ai donc opté pour une épreuve basée sur le mode CTR, qui est méconnu de certains bien que très utilisé (notamment dans divers protocoles utilisant de l'AES-GCM ou de l'AES-CCM).
De même, il me semblait inévitable de réaliser une épreuve de rétro-ingénierie de firmware. Le souci, c'est que le RE d'instructions ARM est devenu mainstream et qu'avec la sortie de Ghidra, eh bien c'est devenu beaucoup plus simple. J'ai alors pensé à une fonctionnalité que j'avais découvert quand je bossais sur le développement de Radiobit: les frozen modules. Le système Micropython, que l'on trouve notamment sur le Micro:Bit, permet lors de sa compilation d'intégrer des modules complémentaires développés en Python, mais de façon native. Un outil permet alors de transposer le code python du module en question en code C, et de le compiler et de l'intégrer aux bibliothèques de base. Bien sûr, le code C contient le bytecode du module ainsi que des métadonnées, et donc toutes les informations pour désassembler et interpréter le code du module (méthode pour les furieux). Par ailleurs, le code principal de cette troisième étape en a fait buggé plus d'un: on a bien le code Python du programme principal, mais pas de trace du module crackme ! Plusieurs solutions utilisant différentes techniques ont été trouvées, dont certaines assez originales. Je vous laisse lire les write-ups pour vous faire une idée des différentes méthodes. Cette étape a été la plus difficile à résoudre, beaucoup de participants l'ayant téléchargée mais peu résolue durant l'évènement.
L'étape suivante, la quatrième donc, consistait à aller au stand de digital.security et de demander la "boîte magique", une boîte spécifiquement conçue pour utiliser l'antenne du badge pour transmettre une donnée via un signal lumineux. Seulement voilà, il y avait un hic. Ma super boîte magique n'a pas supporté le voyage, et ne voulait plus faire allumer la LED du badge. J'ai passé quelques heures à debugger le truc, sans succès, puis j'ai indiqué aux personnes du stand de renvoyer ceux qui demanderaient cette boîte vers moi (via Twitter ou e-mail). Bizarrement, personne ne m'a contacté durant l'après-midi ou dans la nuit. Le troisième niveau aura eu raison de la majorité des participants.
J'ai donc, durant les jours suivants, distribué par Twitter et autres médias l'URL de la cinquième étape: un fichier de capture radio effectué via un SDR. L'objectif était clairement d'extraire le contenu de la communication. Là encore, rien de difficile pour qui connaît le domaine, mais c'est loin d'être le cas de la majorité des hackers présents: ces derniers savent utiliser GQRX ou des outils similaires, mais quand il faut enchaîner les blocs GNURadio, c'est une autre histoire. Avec la bonne méthode d'analyse (subtilement abordée dans mon talk de leHACK), cela allait tout seul et l'extraction ne posait plus trop de problème. On trouvait alors un lien vers l'épreuve finale: la devinette de la mort.
La devinette de la mort était la suivante:
Already there when I started to hack, it is nowadays gone and will never come back. This platform was once among the bests, providing an early hacking contest and amazing tasks to solve without a rest.
Show me your abilities by telling me what this platform is. But don't yell it here, just whisper it to my ear, show me what it did look like, show me what I did look like at this time, and the black badge will no longer be mine.
Virtualabs
L'objectif était donc d'identifier une plate-forme où j'ai découvert le hacking, de me montrer à quoi elle ressemblait, et à quoi je ressemblais à cette époque (histoire de ressortir les photos dossier).
La première personne à m'avoir fourni tous les éléments, et je dis bien TOUS les éléments, est Vincent Dehors. Bravo à lui, il remporte le Black Badge leHACK 2019 ! Il y aura peut-être un visuel dans les semaines à venir, qui sait.
Encore bravo à vous deux d'avoir complété la majorité de ce challenge, j'espère que vous l'avez apprécié !