Cracking BreizhCamp Enigma

Le BreizhC@mp c’est la conférence tech la plus à l’Ouest (Rennes). Mais c’est surtout un joli plateau de speakers, des sujets extrêmement variés et innovants, une réception quatre étoiles, et un bel esprit déjanté tout en restant pro. C’est dans ce cadre que depuis 2 ans, Michel (aka @Mimah35) propose aux participants de résoudre une énigme composée d’arcanes propres aux informaticiens.

Et depuis deux ans, avec Aurélien Maury (@aurelienmaury), notre challenge personnel est de la résoudre ! Voici comment nous avons fait.

A l’origine était le QR code…

La conférence démarre mercredi, mais nous ne pouvons être présent que jeudi matin. Nous découvrons fébriles le premier indice : l’énigme est affichée depuis la veille sur les murs du BreizhCamp. Et si quelqu’un nous avait devancé cette année ? Qu’à cela ne tienne, nous ne nous laisserons pas déposséder de notre titre sans combattre !

Le flashage d’un QR code de 4 m² tendu au dessus d’une table de l’accueil nous donne le texte suivant :

avec Humeur Rage! 0 chemises Halogènes Mais 6 Lumineux yeux. 90 noeuds avec Xantia. Rongez odieusement des Wursts. Il unifie Yams 22 9 très Largement 0. Julien y Zone. Wax lutte 6 ans Exceptionnellement pour Vous! Rassemblez y 9 idées comme mardi. Vendez peut etre mon histoire jeudi. Yvan Wagner 1000 watts. Le Xeon Jaune lourd consomme 200 90 100 champs magnétiques. Nous le conseillons yoyo 900 yens. Yvan Xeon chante vraiment bien. Wagner Freud zombie des Gamelles. Vous y Longerez 300 Joules légers comme 200. 9 100 cent mètre. Notre loi cache y 9 kryptonites. Yvan Xantia Rhone hippie. Laisse nous protéger particulièrement ce Dragon 9 jours.

Mouais… Même dans le cerveau malade de nos amis organisateurs bretons, ça ne veut pas dire grand chose. Des majuscules au milieu de la phrase, pas au début, des chiffres… Hum… Et si c’était un code ? Genre un base64 ? Allez, on tente, on prend la première lettre de chaque mot et on passe le tout au décodeur :

echo "aHR0cHM6Ly9naXRodWIuY29tL0JyZWl6aEpVRy9icmVpemhjYW1wLXJlc291cmNlcy9yYXcvbWFzdGVyL3Jlc291cmNlcy9kYXRhLnppcD9j" | base64 -d => https://github.com/BreizhJUG/breizhcamp-resources/raw/master/resources/data.zip?c  

Première victoire, cela nous renvoie une url github ! Un petit coup de téléchargement (malgré un wifi capricieux) et nous voilà à l’étape suivante. Le zip téléchargé contient 3 fichiers :

input.bin decode.prog secret.rar

Le secret.rar est bien sûr protégé par mot de passe. Qui devrait logiquement nous être donné par les autres fichiers.

Le decode.prog contient le pseudo-code suivant :

program {  
 data = readFile('input.bin')
 data = data xor 'BreizhCamp2016'
 writeFile('output.bin', data)
}

Bon. C’est fourbe. Du binaire avec XOR ca fait un moment que nous n’avons pas fait ça. Qu’à cela ne tienne, c’est l’occasion de refaire un peu de python… Un peu… Nous y passons bien deux heures, entrecoupées de conférences parfois poilues (“Comment sécuriser Docker en prod”… pas vraiment compatible avec l’arrachage de cheveux sur XOR). Voici notre version finale :

 binary_data = open("input.bin", "rb").read()
 binary_pass = b'BreizhCamp2016' while len(binary_pass)

Tout ça pour nous rendre compte qu'au final, nous avions probablement la solution dès le début... Sauf qu'à la place d'un bête mot de passe (comme on l'espérait fortement) le XOR renvoie un autre fichier binaire (c'est vil). Au bout d'un moment, nous remarquons que la première ligne du fichier contient l'extension :
headerPNG

Une redirection fichier, un ajout d'extension et nous allons avoir la révélation...
output.bin

Ah... Pas vraiment, en fait.

Ils n'ont quand même pas fait de la stéganographie ?!?

Mais si, souvenez vous, la stéganographie : cacher une information (un mot de passe par exemple) dans les bits de poids faibles d'une image. Nous nous cassons les dents de longues minutes avant que nous vienne l'illumination : la stéganographie n'est pas le seul moyen de cacher une information dans une image. Et si l'image comportait des nuances de couleurs que notre oeil ne peut pas distinguer ? "Bring out the Gimp".
recolor

Et bien voilà. Tout bêtement, deux nuances de blancs. Et qui nous donne un "Qui ?" suivi de ce qui ressemble furieusement à des coordonnées GPS, qui pointent juste à l'extérieur de l'université.
Capture d’écran 2016-03-25 à 02.01.01

À ces coordonnées se trouve une sculpture. Malheureusement, pas de plaque, pas de nom, rien. Et là, nous dégainons la compétence ultime : le Social Engineering. Direction l'accueil de l'université : "Bonjour Madame, sauriez-vous qui est le sculpteur de l'œuvre sur le parvis ?". Bien embêtée mais de bonne volonté, elle fouille dans ses tiroirs et nous remet le sésame : le guide des sculptures du campus de l'université de Rennes !

Nous rentrons le nom du sculpteur (Griot) comme mot de passe et miracle, le rar se décompresse, et nous découvrons... un fichier wav ?!?

Ah oui... en fait ce n'est pas fini, on va devoir décoder quelque chose qui ressemble fortement à du morse.

Trait point trait point point.

Il doit bien y avoir moyen de décoder du morse automatiquement... Mais rendu à ce point de l'énigme, et après quelques recherches infructueuses de traitement de son, nous optons pour la méthode Ken Thompson : When in doubt, use brute force.. Nous ouvrons donc le fichier avec Audacity.

code_morse

Et c'est parti pour la dictée pendant la pause goûter : "trait point point espace trait trait point ..."

Ce qui nous mène vers la dernière pièce du puzzle :

ENCORE UN PETIT EFFORT,IL FAUT TROUVER LA COULEUR PREFEREE DU DICTATEUR DU BREIZHCAMP :)

Bon, avouons-le ce n'est pas celle qui nous a posé le plus de problème. Le fort penchant pour le orange de Nicolas est un sujet de conversation récurrent chez les organisateurs du Breizhcamp, même la keynote d'ouverture du matin y a fait référence.

Rendez vous l'année prochaine !

Reconnaissons le, cette énigme fait partie du charme de la conférence : qu'un organisateur suffisamment malade se rajoute cette charge de travail, nous disons bravo ! Et nous nous faisons un devoir de lui rendre hommage en s'attaquant à son défi.

−− · ·−· −·−· ·· −−··−−  −−− −·  ·−  −·− ·· ··−· ··−· ··−··  −·−·−− ·−· · −· −·· · −−··  ···− −−− ··− ···  ·−·· ·−−−−· ·− −· −· ··−·· ·  ·−−· ·−· −−− −·−· ···· ·− ·· −· ·  ··−−··