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

CTF-1 : Write-up

*dans un bruit de fond de classe* “Ouais non mais il est trop dur ce chall, on comprend rien….”

HOP HOP HOP ! Bonsoir à tous les petits pirates en herbe ! Professeur ZeR0 va tous vous expliquer ! On va faire une petite correction du CTF numéro 1 proposé par Kali France ! Si toi aussi tu as participé et que tu n’a pas réussi, ou que tu es simplement curieux c’est ici que cela se passe ! Prêt ? C’est parti !

I) Prérequis

Pour commencer voici simplement une petite liste de ce dont vous aurez besoin pour résoudre l’intégralité du challenge, je rappelle que le challenge était composé de 3 parties distinctes, dans chaque partie il fallait retrouvé un flag, ce flag vous donnez accès à l’étape suivante.

Nous aurons donc besoin des choses suivantes:

  • Un OS linux(il est probablement faisable avec d’autres OS mais je l’ai prévu pour être fait sous linux)
  • Un terminal (oui jusqu’a la merci captain Obvious…)
  • Un navigateur (Tu le fais exprès ou quoi…?)
  • Un cerveau (Non mais sérieux tu @#!~#@!?)
  • De la patience(….)
  • De l’archive contenant le challenge disponible ici pour ceux qui ne l’on pas déjà :
    https://www.kali-linux.fr/wp-content/uploads/2019/12/Chall_Kali_FR.tar.gz


Vous avez tous ça ? Et bien on y va !


II) Etape 1


Dans un premier temps nous allons décomprésser l’archive, pour ce faire :

tar -xvf Chall_Kali_FR.tar.gz

Dirigeons nous gentillement dans le dossier correspondant et nous voyons les fichiers suivants :

ls -l

Première chose qui attire nôtre attention un fichier README.md et un fichier INSTRUCTIONS, regardons dans un premier temps ce qui se trouve dans ces deux fichiers :

cat INSTRUCTIONS

le premier fichier semble vide, on aurait également pu s’en rendre compte en voyant sur le premier ls , fait la taille du fichier (0 dans le cas présent). Regardons maintenant le README.md :

cat README.md

Il semblerait que nous ayons à faire à un petit farceur…. Par logique nous allons donc nous intérésser au dernier fichier présent dans ce dossier à savoir le fichier WarLocG.jpg :

file WarLocG.jpg

Bon jusqu’a la aucune surprise nous avons bien à faire à un JPEG. Naturellement en voyant cette image vous pensez “Stéganographie” mais ne nous emballons pas et regardons étape par étape ce que l’on peut faire avec cette image.

Tout d’abord regardons l’image :


En regardant de plus prêt l’image (zoom, rotations,filtre couleurs….) On ne vois à priori aucun indice nous laissant penser que cette image contient un message caché… Celui qui a fait ce chall doit vraiment être un vicieux….

“Heu mais c’est pas toi qui l’a créé ?”

…… *sifflote*

Donc nous allons commencer par regarder le fichier dans un contexte un peu plus “bas niveau”, je m’explique nous allons regarder si aucune information n’est stockée directement dans l’image et que nous ne pourrions pas voir avec nos yeux si l’on ouvre l’image avec un logiciel prévu pour visualiser l’image.

Pour ce faire plusieurs options s’offrent à nous mais je vais opter pour la suivante car je la trouve beaucoup plus intuitive pour débuter :

cat WarLocG.jpg

Tout ceci semble du charabia… il s’agit en fait de données binaires correspondant à l’image, en d’autres termes c’est comme ça que l’ordinateur “voit” une image.

Sachant cela nous remarquons quelque chose qui semble familier à la fin du fichier :

Cette fin de fichier deviens de plus en plus intéréssante, en effet je crois reconnaitre un encodage en base 64 ici :

Essayons de décoder cela :

echo "JNQWY2KGOJ5UINCWGFCF6MJUGBPVCSK7IZKFO7I=" | base64 -d

Il semblerait que cela soit pas la bonne approche… pourtant le signe “=” à la fin me fait sincèrement penser à de la base 64….

“Et tu as pensé à vérifier que ce soit bien une base 64 et pas une autre base en vérifiant les caractères présents ?”

Mais quelle bonne idée ! En y regardant de plus près les caractères présent pourrait correspondrent à de la base 32… Et si…? :

echo "JNQWY2KGOJ5UINCWGFCF6MJUGBPVCSK7IZKFO7I=" | base32 -d

Et bien nous avons trouvé le premier flag ! Bravo !

III) Etape 2

Encore Bravo pour l’étape précédente ! Maintenant que nous avons le flag nous allons pouvoir accéder à l’étape suivante !

unzip Etape2.zip

On renseigne le mot de passe (le flag) trouvé précédément et on extrait l’étape 2.

On se retrouve maintenant avec le fichier suivant:

Voilà qui semble intéréssant nous allons pouvoir “Hacker” FaceBook wow !….. Désolé pour la blague..

Alors regardons à quoi nous avons à faire (les plus aguérits auront déjà remarqué d’après l’image précédente sur quoi va porter l’étape 2) :

Nous avons donc à faire à un ELF ! Logiquement nous pensons immédiatement “Reverse Engineering” mais avant de se lancer effectuons quelques tests de base:

cat HackFaceBook2

Jusqu’à la il semblerai que tout soit en ordre, nous avons bien un ELF et aucune informations ne semble caché ici.

strings HackFaceBook2

Il semblerai que un flag soit présent ici !

“Non mais sérieux tu nous prends vraiment pour des pingouins d’un jour, on a déjà testé ton flag pour accéder à l’étape 3 et il ne marche pas”

Haha bonne remarque, et effectivement vous avez raison il s’agit effectivement d’un piège!

“Tu es fourbe !”

Maiiiisss nooooonn , bon nous allons peut être maintenant lancer cet exécutable pour voir ce que nous avons :

./HackFaceBook2

En lançant le programme, il nous demande un Serial , ce qui semble confirmer la piste d’un possible reserve engeenering, par simple curiosité j’ai dans l’image précédente simplement tapé sur la touche “Enter” sans rien renseigner, on remarque alors que le programme nous retourne le même sérial que nous avions observé il y a quelques instants. Or nous savons déjà qu’il s’agit d’un piège, donc on peut conscidérer que le programme nous dit simplement que nous n’avons pas renseigné le bon sérial.


Ici j’ai renseigné un sérial au hasard (peut être pas aussi au hasard que ça…), le programme nous retourne toujours le même flag ce qui confirme le fait que en cas de mauvais sérial, le programme nous retourne toujours ce flag (vous pouvez vérifiez vous même en essayant ce que vous voulez en guise de sérial).

Nous allons donc passer aux choses sérieuses , nous utiliserons gdb pour la suite :

gdb ./HackFaceBook2

Maintenant on va regarder ce que contient la fonction Main du programme, c’est une bonne base pour commencer.

(gdb) disas main

il semblerait que le problème soit plus compliqué (quoi que ?) que prévu , on remarque dans le main que il y a un appel à une fonction nommée “XXXXYuIID” regardons de plus prêt ce que fait cette fonction :

(gdb) disas XXXXYuIID

C’est la que il va falloir suivre un peu, objectivement la personne qui a créée ce programme (quoi pourquoi tu me regardes comme ça…?) a cherché à cacher des informations notamment en donnant des noms de fonctions ne donnant pas d’indications, pour les besoins du writeup je vais vous diriger vers la bonne solution mais il est evident que lors du challenge vous auriez du passer un peu plus de temps pour comprendre quel était le rôle de chacune des fonctions.

On remarque néanmoins en regardant de plus prêt ici même si on ne sait pas ou chercher par avance quelque chose d’intrigant :

On remarque que le contenu de rsi est bougé dans r12 puis que un appel à la fonction SC est fait puis qu’ensuite on va effectuer une comparaison avec quelque chose, par logique on peut deviner que cette comparaison sera faite avec ce que l’on donnera au programme en entrée. (Pour vous aider je peux vous dire que SC = String Compare mais il n’y a pas vraiment besoin de savoir cette information pour comprendre le fonctionnement du reste c’est un simple petit plus que je vous donne, en temps normal vous auriez du regarder de plus prêt la fonction SC comme le contenu de toute les autres)

Le contenu de la fonction SC

Pour mieux comprendre ce qui se passe nous allons placer un breakpoint sur la fonction SC appellé après avoir bougé rsi dans r12 (il est evident que l’adresse peut varier pour vous):

(gdb) b * 0x000055555555531e

Une fois fais nous relançons le programme :

(gdb) r

et lorsque le programme s’arrête nous utilisons la commande suivante pour voir le contenu du registre r12 :

(gdb) x/s $r12

A vu d’oeil.. il semblerait que cela ressemble à un serial ! Essayons pour voir ? :

Le programme ne nous retourne pas le flag précédent vu mais une nouvelle string ! voilà qui est intéréssant ! La nous remarquons que la structure du flag semble la même que le flag précédent (KaliFr{…}) néanmoins ce n’est pas ce qui est écrit ici, en réfléchissant on peut voir que il y a un décallage de 13 lettres entre la premier ‘X’ affiché à l’écran et ce que l’on s’attend à avoir c’est à dire un ‘K’. Il semblerait donc que nous ayons à faire à un encodage de type Rot13, essayons de décoder ça en ligne (n’importe quel site de décodage Rot13 fera l’affaire mais pour l’exemple ici j’utiliserai le terminal)

echo "XnyvSE{VzFrkL&1Xa0j1g}" | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'

Et voilà le second flag !

IV) Etape 3

Nous voilà donc à la dernière étape !

Pour ceux qui n’arrive pas à unzip le dernier fichier il suffit de remarque la chose suivante :

file Etape3.zip

Il faut donc utiliser 7z pour l’ouvrir, ainsi :

7z x Etape3.zip

Une fois extrait regardons de plus près le contenu du dossier :

Un fichier est présent ‘EmNuR.OSI’ , regardons de plus prêt :

file EmNuR.OSI


Voilà qui nous aide vachement…. essayons de regarder autrement :

cat EmNuR.OSI

La normalement vous avez mal aux yeux, le fichier étant assez gros (17M). Essayons autrement :

head EmNuR.OSI

Jusqu’à la rien de bien fou, essayons de voir la fin ?

tail EmNuR.OSI

La normalement ça doit faire ’tilt’, on remarque la string “TempleOS”, avec le recul on remarque que si on inverse l’ordre des lettres du nom du fichier on peut lire ‘RuNmE.ISO’.

C’est la ou le piège se trouve, en effet on devine facilement que si le nom est inversé et que la commande file ne retourne pas d’informations comme quoi c’est un ISO, c’est que peut être l’intégralité du fichier est renversé. Mais en vérité nous n’avons pas besoin de l’ISO en soit, vous remarquez peut être que sur l’image précédente que un grand nombre de caractère ‘+’,’>’,'<‘ et ‘-‘ sont présents , ce qui ressemble étrangement à une grosse prise de tête…

“C’est toi qui nous prend la tête la accouche !”

Oui oui ça va ! Il s’agit en fait d’un bout de code dans un langage nommé ‘BrainFuck’, vous comprenez mieux maintenant ou je voulais en venir… commençons par extraire cette partie.

Si vous essayez de décoder ça en ligne grâce au site : https://www.dcode.fr/langage-brainfuck vous verrez que cela ne donne rien.

Et la si vous vous souvenez de ce que je disais il y a environ 2 minutes , le fichier semble renversé , si nous inversont ce bout de code ? :

tac -rs '.' extracted.txt > flipped.txt

Ici le fichier extracted.txt contient le code que j’ai extrait de l’ISO et il est nécéssaire d’utiliser la commande tac avec les arguments suivant pour retourner le fichier proprement.

Une fois fait on tente de décoder à nouveau sur le site et :

\o/ gloire aux patates !

Bravo à vous tous pour avoir participer à ce challenge , je tiens à remercier plus particulièrement les membres du forum suivants : Webmaster, Snk , Koma , Mikoto , WarLocG, _john_doe et tout ceux que j’oublie pour m’avoir soutenu dans ce procédé de création d’un CTF , je suis conscient que il est loin d’être parfait mais il fut fait avec le coeur ! 😀

Merci à tous d’avoir suivi ce writeup et à bientôt pour un prochain tuto !

ZeR0-@bSoLu




3 thoughts on “CTF-1 : Write-up”
  1. Salut, je ne comprends pas pour ouvrir l’étape2.zip le mot de passe (flag 1)

    KaliFr{D4V1D_140_QI_FTW}
    j’ai essayer un paquet de truc dont
    D4V1D_140_QI_FTW

    me renvoit ” mot de passe incorrect ”

    Je suppose qu’il y a une subtilité que je n’ai pas trouvé ?

    1. Salut,
      Il suffit de décomprésser une archive. 🙂
      Le mot de passe fonctionne chez moi a tu vérifier bien entendu la charge du fichier téléchargé ?

Leave a Comment

Time limit is exhausted. Please reload CAPTCHA.