Kali-linux distribution GNU/Linux spécialisée dans l'audit et le pentest.
Kali-linux.fr Communauté française de kali-linux
write up challenge kali linux ctf 2

CTF-2 : Write-up

*chahut dans la classe*

« Mouhaha je suis Snk le Grand, chef de la classe et… »

*se prend un coup de règle dans la tête*

Du calme les enfants ! Aujourd’hui nous allons étudier la correction du second contrôl…… du second CTF !

Pour une fois de plus rester raccord avec le thème, je vais vous proposer UNE manière de résoudre le second CTF avec Kali, ce n’est certainement (et même sûrement) pas la seule, libre à vous d’essayer d’aborder les choses sous différents angles ! (et je vous encourage vivement à le faire) J’utiliserai Kali pour résoudre ce challenge comme cité plus haut, mais il est tout à fait possible de le faire sous d’autres OS.

I) Prérequis

Je vous rappele au passage que le but du CTF était à chaque étape de retrouver le flag, ce même flag servira alors à dévérouiller l’étape suivante. Ce challenge comportait 5 parties , donc 5 flags à trouver. Chaque flag est de la forme Kali_Fr{…}

Vous aurez donc besoin au préalable :

SHA256: 2aa214f62d51e9d560344a1ce33af22dc23262c8499ef94f396d56b41aad3206

Vous êtes prêts ?

« Non je voudrais me faire d’abord un café et…. »

C’est parti !

II) Etape 1

Une fois l’archive entre vos mains et le sha256sum vérifié, on dezip’ le fichier et nous avons la structure du challenge :

Nous voyons donc que seule la première étape nous est accesible, regardons.

En faisant un ‘file ‘ sur le fichier il semblerait que nous ayons bien un fichier de capture comme nous le suggère l’extension ‘.pcapng’, de plus on remarque subtilement que le fichier se nomme HTTP_Security, peut être un indice tordu de celui qui a fait ce chall ?

« Ouais en parlant de ça faudra qu’on le chope celui qui fait ces challs, qu’on lui explique deux trois choses »

Heu… oui bien sur on finira par le retrouver haha.. hum je disais donc, le plus simple pour regarder un peu ce que contient ce fichier c’est de l’ouvrir tout simplement.

« Tu nous prend pour des co.. »

Pour ce faire ! Nous allons utiliser WireShark ! Premièrement on ouvre le fichier avec ce bon vieux requin (je précise pour les pointilleux que j’utilise WireShark Version 3.2.4 (Git v3.2.4 packaged as 3.2.4-1) ) :

Arriver à ce stade, on peut décortiquer tout petit à petit bien sur, mais je vais essayer comme première stratégie de m’attacher au nom du fichier vous vous souvenez ?

« Heu… HTTP_Security ? »

Exactement je vais donc me concentrer sur le protocole HTTP dans un premier temps, fort heureusement WireShark nous permet d’utiliser une option bien pratique, commencez par renseigner dans la barre de recherche le protocole voulu (donc HTTP) :

C’est ainsi que on se retrouve avec seulement 4 paquets différents, on remarque que seulement le second paquet (sur mon image ci-dessus) est la seule requête HTTP ayant comme code de réponse la valeur 200, ce qui veut dire que c’est une requête qui a aboutit.

Pour avoir plus d’informations et avec une jolie présentation, on sélectionne simplement la requête qui nous intérèsse , clic droit dessus, puis Follow, puis HTTP Stream :

Nous avons donc ici la requête qui a été envoyée, et quelle surprise , nous avons cette ligne :

{« messageBody »: »Kali_Fr{ThisIsSuperSecretHTTPYouKnow} »}

Nous avons donc trouvé le premier flag ! il s’agit de : Kali_Fr{ThisIsSuperSecretHTTPYouKnow}

Testons si c’est bien le bon flag en essayant de dévérouiller la seconde archive :

On nous demande donc le mot de passe :

On renseigne donc le flag comme mot de passe :

Et voilà ! première étape terminée ! facile non ?

II) Etape 2

Maintenant que le fichier est extrait regardons ce qui se trouve dans le dossier :

Encore une fois nôtre petite commande ‘file’ nous revêle que nous avons bien à faire à un JPEG, rappelez vous que un fichier n’est pas forcément ce qu’il semble être… en parlant de ça… le nom du fichier est King_of_spades… ouvrons le :

Mmmmmm cela vous fait penser à un roi des as ? Moi non ! il y a sûrement anguille sous rôche !

A première vue un ‘strings’ ou un ‘cat’ sur ce fichier ne nous apprend rien de bien intéréssant, serait-il possible que nous ayons à faire à de la stéganographie ? Mmmmm utilisons l’outils steghide que je connais pour voir (apt install steghide sous kali).

steghide info King_of_spades.jpg

Va nous donner des informations sur l’image :

Diantre ! Un mot de passe est nécéssaire… aucune idée du mot de passe pour l’instant, essayons juste d’appuyer sur entrée (donc aucun password) au cas ou :

Tiens ? On voit que même sans password un fichier caché dans l’image est trouvé, le fichier est nommé ‘mes.txt’ est fait 25 octets.

Bien essayons donc de l’extraire !

steghide extract -sf King_of_spades.jpg

On ne renseigne donc aucun password, et un fichier est extrait ! Un petit ‘cat’ dessus :

Et hop ! le second flag ! qui se trouve être : Kali_Fr{Arthur_Kouiyere}

Testons quand même en dézippant l’étape 3 de la même manière que précédemment c’est à dire en renseignant le flag entier en tant que mot de passe :

Ettttt…

C’est le bon flag !

III) Etape 3

Nous voila maintenant à l’étape 3, regardons ce que nous avons :

Comme toujours vérifions que ce soit bien le fichier qu’on crois voir :

Il semblerait que nous soyons effectivement bien en face d’un fichier ‘.wav’ !

« Et c’est censé être une bonne nouvelle ? »

Heu…. Donc nous allons commencer par tout simplement écouter ce ‘.wav’, par simple curiosité !

En l’écoutant même attentivement il semble impossible de comprendre ce qui est dit, mais on peut entendre que quelque chose est dit c’est déjà pas mal !

Pour une première approche on peut remarquer à l’oreille que le texte semble être dit à l’envers, mais ce n’est qu’une simple impression qui reste à etre confirmée.

Vérifions tout ça en utilisant un logiciel de manipulation de son, il sera ainsi plus aisé de faire des opérations sur une bande sonore, pour ce faire je vais utiliser Audacity, un très célèbre logiciel pour manipuler le son, il est également open source, mais il est possible encore une fois de le faire avec n’importe quel logiciel de manipulation de son. A l’heure ou j’écris cette correction, ma version d’audacity est la v2.3.3 pour information.

Bien ouvrons le son avec audacity :

Pour la suite je vais vous guider directement vers la « bonne voie », le cas contraire ce tuto serait beaucoup beaucoup beaucoup trop long , mais vous comprendrez bien que dans le cadre du CTF il aurait fallu tester petit à petit, manipuler le son en appliquant des modifications légères et essayer d’écouter le son au fur et à mesure pour vérifier que vous alliez dans la bonne direction, ou alors si vous avez l’habitude de manipuler du son, se fier à votre expérience quant à l’écoute de la bande sonore.

Premièrement sélectionnez la piste entière, puis nous allons devoir inverser la piste, pour ce faire allez dans l’onglet Effets > Inverser :

Maintenant nous allons inverser le sens de la piste pour essayer de comprendre ce qui est dit, pour ce faire allez dans Effets > Inverser Sens en ayant toujours la piste selectionnée :

Après une autre écoute un remarque que le son est enormément saturé et très rapide, dans un premier temps essayons de réduire la saturation, pour ce faire (en ayant toujours la piste sélectionnée) allez dans Effets > Distortion :

Selectionnez ‘Saturation Dure’ comme type de distorsion, puis il suffit maintenant de baisser le niveau de saturation (clipping) petit à petit jusqu’a ce que vous entendiez une voix « quasi-naturelle » bien que toujours accélérée selon votre convenance, chaqu’un aura un niveau de sensibilité différent.

Pour finir nous allons réduire la vitesse de la piste car la personne parle vraiment très vite, pour ce faire..

« Oui on sait, en ayant la piste sélectionnée »

C’est bien vous suivez !

Donc une fois la piste sélectionnée, allez dans Effets > Changer la vitesse :

De la même manière que précédément , à vous de reduire la vitesse à votre convenance.

Une fois tout ceci réglé, vous devriez entendre la phrase « Hasta la vista baby » avec une voix robotique. (comme par hasard !)

Nous avons donc un semblant de flag avec cette phrase mais nous ne savons pas exactement comment cela s’écrit, le seul indice que nous ayons c’est que les flags s’ecrivent tous en étant de la forme « Kali_Fr{…} ».Nous allons devoir essayer plusieurs possibilités soit en essayant à la main les quelques possibilités evidente, soit en créeant un petit dictionnaire et en l’utilisant avec zipcrack par exemple…

Le flag à obtenir est le suivant : Kali_Fr{hasta_la_vista_baby}

Normalement si vous l’avez trouvé vous savez que c’est le bon vu que vous avez dézippé l’archive ! Bravo à vous dans ce cas !

IV) Etape 4

Regardons ce que nous avons pour cette quatrième étape !

un seul fichier à première vue, regardons en détail avec la commande file :

Il semblerait que ce soit un bon vieil ELF 64 !

« Youuuuuuuppp..attend mais ça veut dire que… »

Queeeeeeeeeeeeee ?

« Qu’on va devoir faire du reverse…? »

Ouiiii !

« Noooooooooooooooooooooooooooooooooooooooooooooooooooon »

Mais si vous allez voir ça va bien se passer !

Commençons simplement par lancé le programme :

Apparement le programme est un petit peu taquin….

« Le programme ou le créateur du CTF…? »

Probablement les deux !

En relançant le programme plusieurs fois on vois que le résultat est toujours le même, mais en le lançant avec un argument, peut importe lequel :

Décidément… Ce programme est vicieux !

Pour cette fois je vais utiliser le debugger Cutter, qui est une version graphique de radare2, le but est de vous faire voir différentes possibilités au travers de mes articles.

Vous pouvez trouver cutter (que ce soit pour linux, windows ou mac) ici : https://github.com/radareorg/cutter/releases

A l’heure de cet article j’utilise la version v1.10.3 de Cutter pour Linux.

Une fois le fichier de l’application (portable) de Cutter téléchargée, le fichier chmodé, on lance cutter, sur l’écran de démarrage pour ceux qui le lance pour la première fois, il vous sera demandé de choisir le thème du logiciel (J’utiliserai le Dark Theme ici) et la langue du logiciel (Anglais pour ma part).

Une fois ce premier écran passé, vous arriverez sur l’ecran d’ouverture de fichier, selectionnez le fichier à l’aide du bouton ‘select’ et cliquez sur ‘Open’ :

Une fois le fichier selectionné, vous arriverez sur cet écran :

Vous pouvez laisser tel quel les options, assurez vous juste que dans les options avancées, le mode 64 bit soit selectionné, vous pouvez laisser le reste en auto également.

Vous devriez après l’analyse vous retrouver sur cet écran :

la raison pour laquelle je n’ai pas fais de commande strings qui est la base avant de lancer le débugger c’est pour vous montrer que il suffit de cliquer sur l’onglet ‘Strings’ en bas de l’écran pour les voir :

Comme vous pourrez le voir vous même aucune chaine ne semble être celle qui ressemble à un flag.

Allons regarder dans un premier temps la structure globale du programme, pour ce faire double cliquez sur la fonction ‘main’ dans la liste des fonctions, puis aller en bas de l’ecran et cliquez sur l’onglet ‘Graph’ pour afficher le graph décrivant le programme :

Après analyse du graph du programme, nous trouvons rapidement l’endroit du programme qui va nous intérésser :

Plus particulièrement :

Mais il ne faudra pas négliger le reste du graphe également.

Pour avoir plus de visibilité allons dans le menu ‘WIndows’ et cochons la case ‘Decompiler’, de cette façon nous avons accès au programme décompilé par Cutter.

Les plus aguérris d’entre vous aurons déjà surement compris à l’aide de ces quelques screens ce que le programme fait grossièrement. Vous remarquerez que j’ai surligné une valeur dans le screen plus haut, en effet c’est une valeur qui va fortement nous intérésser également.

« Ouais jusqu’à la tu nous dis que beaucoup de choses vont nous intérésser mais tu nous explique pas , c’est nul ! »

Calmez vous bande d’impatients ! On y vient !

Donc commencons par lancer le débugger avec Cutter, pour se faire aller dans le menu ‘Debug’ puis ‘Start Debug’ vous pouvez aussi utiliser le raccourci par défaut ‘F9’.

Une fênetre s’ouvre, rentrez l’argument souhaité pour le passer au programme :

Vous pouvez mettre ce que vous voulez bien evidémment.

Une fois cliqué sur ‘OK’ Cutter va lancer l’éxécution et désassembler le programme à la volée, vous devriez après quelques instants d’attente arriver sur cet écran :

Allons direct à l’essentiel, encore une fois il existe plusieurs approches et méthodes possibles mais nous allons en traiter qu’une ici. Donc que fait exactement ce programme ? Au coeur du code nous pouvons observer que le paramêtre passé est analysé pour vérifier qu’il ne soit pas vide (comparaison avec ‘\0’) et de plus on vérifie en même temps que le registre esi contienne bien la valeur ‘0x6e2’.

Le nombre d’octet non nul de la chaîne est stocké et comparé avec la valeur ‘0x6e2’, cherchons donc en vu des formats de données, une chaîne de 16 caractère avec pour valeur totale ‘0x6e2’ , soit 1762 en décimal. La un rapide calcul via une division euclidienne simple : 1762/16 = 110 avec comme reste 2. Donc il suffit d’utiliser le caractère numéro ‘110’ à savoir donc la lettre ‘n’ 15 fois suivis d’une fois le caractère numéro ‘112’ à savoir ‘p’.

Essayons donc de donner au programme la chaine : ‘nnnnnnnnnnnnnnnp‘ :

Bravo voice le flag ! il s’agit de : Kali_Fr{Snk_is_Gates}

Testons quand même pour être sur :

Youpi ! c’est bon on peut passer à la suite !

V) Etape 5

« Après l’étape 4 j’espère qu’on va avoir une dernière étape plutôt tranquille »

Et bien… pas sur !

Regardons ce à quoi nous avons à faire !

Etrange extension de fichier, vérifions :

Ah ! Quel petit malin a mis un jeu de gameboy ici !?

« Heu… »

Oubliez-ça.. Donc premier réflèxe

« Je sais ! on lance un strings dessus ? »

Non on lance le jeu avec un émulateur bien sur !

J’utiliserai pour ce faire l’émulateur Higan (v1.0.6) :

Lançons le jeu en allant dans le menu ‘Library’ et puis ‘Load ROM file’. Une fois chargé notre jeu apparait ! :

« Wow trop bien un jeu officiel Kali ! »

Héhé exactement, créer par votre serviteur pour vous divertir, mais vous allez voir que peut être le jeu va etre plus dur que prévu !

« C’est mauvais pour nous ça… »

Regardons ce qu’il est possible de faire avec ce jeu ! Avant d’appuyer sur ‘START’ comme nous le dis le jeu, on peut voir qu’il est possible de bouger le petit dragon avec les flêches directionnelles :

Maintenant essayons d’appuyer sur ‘START’ :

Essayons d’appuyer encore une fois pour voir ? A noté que le petit logo est toujours déplaçable.

Hum.. pardon je m’enflâme, continuons à appuyer sur ‘START’ :

Encorrrreee !!!!

Bon il semblerait qu’après ça le programme nous affiche le message suivant :

« Ok you wanna play ? Fine. »

Puis l’écran s’emble s’éffacer en laissant toujours le petit curseur en forme de dragon a l’endroit ou nous l’avions laissé :

Il semblerait que nous ayons fait le tour de la question, en effet le jeu ne semble pas proposer d’autres options ou possibilitées, en tout cas en le lançant avec un émulateur, peut être va il falloir mettre les mains dans le cambouis !

Pour ce faire plusieurs solutions s’offrent à nous, l’une serait de débugger directement le programme avec par exemple Ghidra et l’extension GhidraBoy, ou d’utiliser un émulateur dans lequel est directement intégré un débugger, comme par exemple visualboyadvance-m.

Nous allons donc utiliser les deux ! Il est évident qu’avec seulement visualboyadvance-m il est possible de le faire depuis le debugger intégré mais pour eviter de devoir faire un cours d’assembleur GBz80 ici.

Donc nous allons avoir besoin de 2 choses :

Lors de l’écriture de cet article j’utiliserai la version 9.1.2 de Ghidra et la version de GhidraBoy associée. Les instructions d’installation de GhidraBoy sont disponibles sur le github ci-dessus.

Une fois Ghidra lancé et l’extension installée, chargez la ROM, et lancez l’analyse avec les paramètres par défauts de Ghidra.

Vous arriverez sur cet écran :

Allez dans le sous-menu Functions de la fenêtre ‘Symbol Tree’ et faites un double-clic sur la fonction nommée ‘entry’ c’est théoriquement la première. Vous aurez ainsi l’écran suivant :

Nous avons donc accès au code décompilé de la fonction principale du jeu, je vais grandement simplifié l’explication ici pour ne pas que cette correction soit trop lourde mais je vous mettrez des liens à disposition un peu plus bas pour ceux qui voudront s’intérésser de plus prêt au fonctionnement interne de la GameBoy.

Ce qu’il faut savoir sur le programme se résume comme ceci :

  • un compteur de type UINT8 est instancié avec une valeur de base égale à 0
  • une boucle while(compteur != 42) constitue le coeur du jeu, à chaque fois que la touche directionnelle ‘HAUT’, ‘GAUCHE’ ou ‘DROITE’ est préssée (pour faire bouger le petit logo en forme de dragon) le compteur est décrémenté de 1
  • A chaque fois que le texte « Ok you wanna play ? fine. » est affiché, le compteur est incrémenté de 1

Le but du jeu est donc de faire arriver le compteur à 42 en appuyant sans cesse sur la touche ‘START’, sans toucher aux touches directionnelles ‘HAUT’,GAUCHE’ ou ‘DROITE’.

Pour la suite je vais utiliser l’emulateur visualboyadvance-m (v2.1.0), encore une fois cela est faisable autrement. Juste un petit conseil préparez vous à mettre l’emulateur en pause pour avoir le temps de lire.

Donc appuyons sur ‘START’ jusqu’à ce que finalement vous observiez cela :

Mettez en pause à ce moment l’emulateur (par défaut sous visualboyadvance-m c’est le raccourci ‘CTRL+p’) . On voit alors que nous avons à faire au début du flag, seulement si je vous fais mettre en pause le jeu c’est pour pas que vous soyez frustré lors de cette correction, en effet cet écran va disparaitre assez rapidement et n’affichera rien de plus que ce que vous voyez ci-dessus. La raison est que la GameBoy peut afficher qu’une quantité limité de carreaux (Tiles en anglais) de sprites à la fois mais aussi pour que ce soit plus marrant. Pour obtenir le flag complet il va falloir (une fois seulement que vous serez sur cet écran, cela ne sera pas possible avant) afficher le contenu des carreaux.

Sous visualboyadvance-m cela se fait facilement de la manière suivante, une fois le jeu en pause, aller dans l’onglets « Tools » puis « Tiles Viewer » et vous finirez par voir cet écran :

Le dernier flag de ce ctf est donc affiché sous forme de carreaux ici est c’est le suivant :

Kali_Fr{video_killed_the_radio_stars}

Bravo à vous le cours est maintenant terminé !!

*La sonnerie de l’école retentit* Pensez à prendre vos gouters !

VI) Conclusion

Je vous remercie dans un premier temps d’avoir lu cet article, et j’aimerais m’excuser publiquement du retard que j’ai pris pour écrire cet article, suite à des problèmes personnels je n’ai pas pu le rédiger avant et encore une fois je m’en excuse. Cela ne devrait plus se reproduire à l’avenir.

Pour ceux qui sont intéréssés par en apprendre plus sur les jeux de GameBoy et l’assembleur GBz80 voici deux excellents liens que j’ai d’ailleurs utilisés lors du codage de ce jeu (codé from scratch pour l’occasion)

J’espère de tout coeur que ce CTF vous aura permis d’apprendre des choses, j’ai moi même beaucoup appris en le fabricant.

Bravo à tous les participants et j’espère à la prochaine !

ZeR0-@bSoLu

6 thoughts on “CTF-2 : Write-up”
  1. Bon sang ! J’ai commencé avec le hasta la vista baby, je l’ai décrypté sans problème en 10 minutes, et je n’ai même pas tenté de prendre pour un mot de passe. Je me suis contenté de démonter le wav dans tout les sens pendant 15 jours >_<

    Je n'aurai pas été plus loin cela dit, enfin je pense 😀

    Merci encore

    1. Le terme exacte est déchiffré 😛 décrypter ça veut rien dire en français 😛 Haha tu as cherché trop loin !
      Je suis sur que la prochaine fois tu l’aura !
      Merci à toi 🙂

      1. Le malin ce Zer0, il nous aura bien fait tourner en rond… Et oui, ni windobe, ni les voleurs à la pomme, chez moi. Beaucoup de défauts mais je n’ai pas ce vice, je touche pas à ça! 😉
        J’aurais toujours appris à me servir un peu d’audacious. J’étais pas très loin, inversé puis ralentis, mais quand même pas trouvé… :8
        Snk

Leave a Comment

Time limit is exhausted. Please reload CAPTCHA.