06
juil.
'20

2020 est décidemment une année bien pourrie.

Publié le 06 juillet 2020
David Marclay (aka Dvrasp)

Je ne pensais pas écrire ce bout de texte maintenant, mais il semblerait qu'il en ait été décidé autrement. Un coup de fil d'un ami proche, passé un samedi midi ensoleillé, et que j'ai loupé car occupé à préparer le repas avec ma petite famille. J'ai répondu par SMS un "Tu voulais ?", histoire de voir si ça pouvait se régler simplement en quelques messages échangés. "Rappelle, important". Ce que je fis, donc. Pour apprendre que David M a.k.a dvrasp, un ami de longue date, s'est éteint la veille sans crier gare. Après Paolo, Peter, Simon, la communauté HZV perd un de ses plus anciens membres. Et nous, eh bien, on en a gros.

Ma première rencontre avec David s'est passé sur IRC, le Discord des vieux. A l'époque, j'étais étudiant et m'amusais à creuser le format de fichier des programmes exécutables de Windows, et je l'ai contacté pour savoir s'il y avait moyen de publier un article dans feu The Hackademy Magazine, dont il était rédacteur en chef. Il a trouvé l'idée sympa, et c'est ainsi que mon premier article est paru, en 2005. Ma première rencontre IRL avec David s'est déroulée quelques mois plus tard, quand nous discutions avec la société d'édition pour laquelle il travaillait d'un projet de magazine que nous souhaitions lancer, XeLoRy et moi-même. Ce premier vrai contact m'a marqué: j'ai découvert une personne qui semblait très réfléchie, ouverte et amicale. Nous avons assez peu échangé ce jour là, en vérité. Ce fut pour moi l'occasion de mettre un visage sur un pseudonyme, ce qui n'était pas rien. Nous avons continué à échanger par la suite, des articles, des idées, du code. Jusqu'à ce qu'il me fasse suivre une offre d'emploi.

A ce moment là, ma situation personnelle était assez précaire: j'étais étudiant, en couple, avec un loyer et une voiture, mais de maigres revenus. J'avais pris la décision de chercher du travail afin de pouvoir être serein et démarrer dans la vie active, et nous en avions discuté. David et moi étions d'accord sur le fait que pigiste n'était pas une situation d'avenir, surtout avec les retards de paiement de la société d'édition. Quand quelqu'un l'a contacté pour savoir s'il pouvait passer une annonce pour une offre d'emploi particulière, il y a jeté un oeil et a directement pensé à moi. Il s'agissait d'un poste d'ingénieur de développement C/C++ pour lequel des connaissances en reverse engineering étaient souhaitées. J'ai lu en diagonale l'offre, et me suis arrêté sur "Vous êtes diplômé(e) d'une école d'ingénieur ou équivalent universitaire (Bac + 5)". Je lui ai répondu que je n'avais pas ce niveau, et donc que je ne correspondais pas au profil. Il a insisté. Durant un mois, presque. Jusqu'à ce que je me décide à envoyer une lettre de motivation et un CV. Deux semaines plus tard, après un entretien téléphonique et un rendez-vous à Paris, j'étais embauché. "Je te l'avais dit que ton profil ferait l'affaire !", m'a-t-il répondu lorsque je lui annonçait la nouvelle. C'est grâce à David que j'ai eu mon premier job. Pas moins que ça.

Nous nous croisions régulièrement durant les meetings HZV organisés à Sysdream, l'occasion de discuter autour d'une bière ou quinze, mais aussi lors des Nuits du Hack que nous organisions plus ou moins de façon anticipée. Je me rappelle en particulier de la Nuit du Hack 2007, lorsque nous rentrions chacun chez nous via le premier RER du matin (ou presque). David était en face de moi, sa sacoche sur les genoux. Il l'ouvre, regarde dedans, et sort un "Ohhh meeerde ! Je crois que j'ai oublié mon laptop !" ... avant de se raviser et de sortir un ordinateur portable qui prenait toute la place dans la sacoche. Ainsi qu'un petit livre intitulé "Memoirs of a virus programmer", qu'il me présente comme étant un excellent ouvrage que je devrais lire, et me le donne ensuite. Nous nous quitterons quelques stations plus loin, nous donnant rendez-vous à un prochain meeting HZV ou à la prochaine Nuit du Hack, ou encore sur IRC. J'avalais le livre dans la semaine et effectivement, ce fut une lecture très intéressante. Quelques années plus tard, c'est à 4 heures du matin que l'on s'est retrouvé pour rédiger les slides de la présentation que je donnais le jour même lors d'une Nuit du Hack. L'occasion de bien rigoler et de fignoler le support d'un talk en y intégrant des références subtiles (ou pas), tout en l'ayant lui comme public fictif, challengeant mes arguments et posant des questions afin d'améliorer ma préparation.

J'ai ce souvenir de David, quelqu'un de sincère et généreux, intelligent et perspicace, avec qui j'ai eu de nombreuses discussions éclairées ou éclairantes. Je garde ces quelques anecdotes de lui et bien d'autres (mais impossible de toutes les narrer dans un billet de blog), ces moments simples où l'on se marrait, sa bienveillance. Repose en paix, l'ami.

07
avril
'20

Le Trésor d'Ecco Rona, un escape game pour enfants

Publié le 07 avril 2020

Je suppose que vous n'êtes pas passé à côté de la nouvelle, mais en ce moment c'est confinement. Je me retrouve donc à la maison avec mes deux minis-moi (un de 6 ans, l'autre de 7) que je dois occuper tant bien que mal. Une fois passé le stock de jeux de sociétés dont nous disposons, pourtant bien fourni, je me suis rapidement retrouvé sans munition.

Et c'est là que j'ai aperçu une de mes boîtes de Unlock, un escape game à base de cartes qui nous a fait passer de bonnes soirées, et je me suis dit: "Et pourquoi ne pas inventer un escape game pour enfants en CP/CE1 ?".

Unlock, un jeu d'escape game à base de cartes

Un cadenas, mon Royaume pour un cadenas !

J'ai de suite pensé à utiliser un cadenas pour l'épreuve finale, et en particulier mon cryptex de chez Ugears que j'ai eu à Noël il y a deux ans. Oui mais il y a un hic: je ne me souviens absolument plus du code de ce dernier ! Le code de ce cryptex est défini lors du montage, et est donc fixe. La première étape a donc été de retrouver ce code à 3 chiffres, sans faire de recherche exhaustive car bien trop longue (il faut placer les anneaux de manière à ce qu'ils soient parfaitement alignés sur la combinaison pour que le cryptex s'ouvre) ! J'ai donc opté pour une méthode plus rapide, assez similaire aux techniques employées sur certains cadenas à bagues: le décodage.

La combinaison est définie par la position de l'encoche sur les rotors

Le principe du cryptex est simple: chaque anneau possède une encoche en face du chiffre qui lui est associé dans la combinaison, ce qui n'autorise la partie mobile (l'anse) à ne bouger que lorsque les encoches des anneaux sont alignées avec la barre de verrouillage, autrement dit lorsque la bonne combinaison est choisie. L'objectif quand on cherche à décoder la combinaison est donc de retrouver la position de ces encoches à l'aide d'un outil nommé "décodeur".

Le cryptex de Ugears, ouvert :)

J'ai utilisé une canette vide pour en récupérer la tôle, puis découpé cette dernière de façon à avoir une fine languette de métal. En plaçant cette dernière entre deux anneaux (ou rotors), et en faisant tourner ces derniers, la languette est "attrapée" par l'encoche et entraînée dans la rotation de l'anneau, dévoilant ainsi un chiffre de la combinaison. J'ai ainsi pu retrouver les trois chiffres composant cette combinaison, et ouvrir le cryptex (ouf !).

Réalisation de l'escape game (phase 1)

Je pensais que cela allait être une tâche facile de créer cet escape game, mais non. La particularité des escape games basé sur des cartes, comme Unlock, c'est que la plupart des actions nécessitent de faire des combinaisons. Unlock utilise par ailleurs une application pour Android et iOS afin de proposer des casse-têtes, des puzzles, et même de la réalité augmentée. En ce qui me concerne, je n'avais pas le temps de développer une application aussi complexe, cela va de soi. Il faut donc anticiper un tantinet les numéros que l'on va attribuer aux cartes, afin d'éviter les erreurs et de permettre l'utilisation de valeurs crédibles en fonction des éléments à trouver.

Je me suis donc lancé en début d'après-midi, en partant de recherches sur Google Images pour trouver mes images de base (il ne vous aura pas échappé que je ne suis point graphiste, et heureusement) et Inkscape pour la conception des cartes. Il m'a fallu un peu plus d'une heure pour pondre une histoire et une ébauche de résolution, créer les différentes cartes et intégrer le tout.

J'ai ensuite imprimé l'ensemble des cartes, les ai découpées et assemblées. Je les ai ensuite essayées en y jouant avec mes minis-moi, qui se sont bien pris au jeu !

Test de l'escape game avec les enfants

Réalisation de l'escape game (phase 2)

Cette phase de test a été l'occasion de trouver des erreurs, de penser à des améliorations, en bref de le rendre un poil meilleur ! Car bon, il ne faut pas l'oublier: il s'agit d'un petit escape game conçu en moins de 2 heures avec les moyens du bord.

J'ai aussi publié sur Twitter et Instagram une photo de ce jeu, et plusieurs personnes ont manifesté leur intérêt. Du côté de la famille et des amis, où on avait fait passer quelques photos, c'était la même chose. L'idée a donc germé de le diffuser. Et pour le diffuser, il faut l'améliorer et le rendre utilisable par d'autres (aïe).

La première modification apportée a été de changer le nom. En effet, le nom d'origine était "Le trésor d'Ecco Vid", mais la blagounette n'a pas été directement comprise par les enfants. Dommage. Sur conseil de mon épouse, j'ai changé le nom de Ecco Vid en Ecco Rona, qui sonne mieux et annonce de suite la couleur :). J'ai aussi procédé à plusieurs bugfix suite à la session de test (quelques erreurs sur des numéros, un numéro caché trop visible, etc.), et ai ajouté toute une section concernant les règles (encore trop sommaires à mon goût), l'assemblage et la personnalisation.

Release de la version 1.0 du jeu

Après ces quelques heures supplémentaires à fignoler les cartes et les énigmes, j'ai tout poussé sur Github (fichiers de conception SVG, polices de caractères utilisées et PDF final), et vous pouvez donc vous en resservir. Vous pouvez imprimer le jeu à partir du fichier PDF ou bien le modifier comme il vous chante ce dernier, pour l'adapter à votre situation (cadenas différent, énigmes plus corsées, à vous d'improviser !).

Le tout est diffusé sous licence Creative Commons CC-BY-NC-SA, donc faites vous plaisir !

Télécharger le PDF du Trésor d'Ecco Rona

Accéder au repository Github pour contribuer

19
sept.
'19

Challenge Black Badge leHACK 2019: le vainqueur

Publié le 19 septembre 2019

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é.

Premières fausses pistes

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.

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.

Les différentes étapes

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:

  • Une petite épreuve de stéganographie des familles, avec un fichier polyglote très simple (coucou Ange !) et une truc moins sympa pour trouver l'URL de l'épreuve suivante ;
  • Un peu de cryptographie, là encore rien de très difficile si l'on connaît les différents modes d'opération ;
  • De la rétro-ingénierie de firmware, avec du nRF51822 et du Micropython dedans ;
  • Une capture radio d'une émission de données, à analyser avec certains outils dont je parlais (oh surprise) dans mon talk ;
  • Une devinette finale qui imposait de m'envoyer par email tout un ensemble d'informations répondant à celle-ci.

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).

Le vainqueur

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.

Write-ups

Encore bravo à vous deux d'avoir complété la majorité de ce challenge, j'espère que vous l'avez apprécié !



Les contenus disponibles sur ce blog sont publiés sous licence Creative Commons BY-NC-SA.
Vous pouvez réutiliser tout ou partie de ces contenus à condition de citer l'auteur et l'origine, vous ne pouvez en faire une utilisation commerciale, et enfin vous devez partager tout travail ou œuvre dérivée sous les mêmes conditions — c'est-à-dire avec la même licence d'utilisation Creative Commons.