leHACK 2024 : mes résultats du CTF

Publié le 10 juillet 2024

Whatelse ? (niveau facile)

Le flag est dans le text

Url : whatelse.wargame.rocks

La première chose à faire, c’est un bons gros nmap sur le DNS, pour voir les ports ouvert. Il n’y en a que deux : le 443 qui réponds en HTTPS, et le 80 qui réponds en HTTP. Si on interroge le site en HTTP, il fait une simple redirection vers sa version HTTPS.

Je fais un curl -i https://whatelse.wargame.rocks/, pour voir ce que retourne cette page en incluant les en-têtes.

HTTP/2 200 
accept-ranges: bytes
alt-svc: h3=":443"; ma=2592000
content-type: text/html; charset=utf-8
etag: "d2imqxrbsfnr3f"
last-modified: Sat, 06 Jul 2024 17:25:21 GMT
server: Caddy
vary: Accept-Encoding
content-length: 123
date: Sat, 06 Jul 2024 20:24:35 GMT

 <!DOCTYPE html>
<html>
<head>
<title>What else ?</title>
</head>
<body>

<p>The flag is in the text</p>

</body>
</html>

Ce challenge m’a posé quelques difficultés. J’ai retourné le résultat dans tout les sens sans rien trouver.

C’est en relisant l’énoncé que j’ai eu une idée. Le flag est dans le text ⇒ Il y a une faute d’orthographe. Il est où le e à la fin de text ? Et si ce n’était pas une faute ? C’est ce qui m’a donné l’idée d’aller voir le champ TEXT de l’enregistrement DNS, en faisant un dig -t txt whatelse.wargame.rocks.

; <<>> DiG 9.18.24-0ubuntu5-Ubuntu <<>> -t txt whatelse.wargame.rocks
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28161
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;whatelse.wargame.rocks.        IN  TXT

;; ANSWER SECTION:
whatelse.wargame.rocks. 1702    IN  TXT "leHACK{wh47_d1d_y0u_3xp3C7_?}"

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Sat Jul 06 22:24:46 CEST 2024
;; MSG SIZE  rcvd: 93

Et voilà, le flag est bien dans le text.

Permanent Calculus (niveau facile)

Serez-vous capable de résoudre tous les calculs demandés ?

C’est accompagné du fichier suivant : question

C’est un fichier exécutable. Il suffit de le lancer.

what is the result of : 2+4/2-9-6/3+2*2-3-3*3-3*3+4+2*3+3*2+6/2-3+6-2-6+4+3*2-2+2*3+2*2 ?

C’est juste une opération. J’entre le résultat

8
congratulation !
what is the result of : 4*2-8/2+6/3+3-2*2-2*4-9+4/2+8/4+6/3-7+6/2+6+4*2-8/2+4+4+4/2+8/2-8/2-4 ?

Ah, OK. J’entre le nouveau résultat.

6
congratulation !
what is the result of : 6/2+8/4+1-9-6/2+6+8+5+4*2-4*2+3*2+9-8/2+4+9/3+5+3*3-1-9/3-2*4-4 ?

Et si j’entre volontairement un résultat faux ?

42
You're wrong, bye !

Là je n’ai testé que les trois premières opérations, mais je me doute qu’il doit y en avoir beaucoup plus. Il faut donc automatiser ça.

J’écris un simple script Bash qui va répondre en boucle aux questions proposées (attention les yeux, c’est déguelasse).

while [ 1 ]; do ./question <<<`cat reponses` | grep result | tail -n 1 | cut -d ' ' -f 7 >ques; echo $((`cat ques`)) >>reponses; done

En gros, voilà comment fonctionne le script :

  1. Avant de le lancer, je mets le résultat de la première opération dans le fichier reponse
  2. Ca exécute le programme question, en lui passant les réponses enregistrées dans le fichier reponses
  3. Quand le fichier reponse a été entièrement dépilé, ça envoie un résultat vide, donc faux. Le programme question s’arrête alors
  4. Le | grep result | tail -n 1 | cut -d ' ' -f 7 permets de ne retourner que la dernière question (la première dont je n’ai pas la réponse)
  5. La question est mise dansle fichier temporaire ques
  6. Le echo fait l’opération du fichier ques et l’ajoute à la fin du fichier reponses
  7. Ça recommence en boucle tant que toutes les réponses n’ont pas été trouvées.

Une fois toutes les réponses trouvées, je ne peux pas voir le flag à cause du grep. Il faut que je lance le programme une dernière fois à la main avec :

./question <<< `cat reponses`.

La dernière ligne me donne :

OK, The flag is : leHACK{519c58a4d508f1291b35}

Note : pour une raison inconnue, le script plante s’il y a deux fois de suite un résultat identique. Dans ce cas il faut entrer le résultat à la main dans le fichier reponse, puis relancer le script Bash à la main.

Note 2 : il y a 400 opérations en tout. J’ai mis le fichier reponses ici, si ça vous intéresse.

Reverse - Guessy (niveau difficile)

Alors là, je n’ai pas compris le niveau de difficulté. Ce challenge était largement plus simple que le précédent.

Tu es bon en devienttes ? Si oui, trouve le nombre correct pour valider le challenge !

C’est accompagné du fichier suivant : question

Là encore, c’est un fichier exécutable. Je le lance donc, et j’obtiens :

Welcome to the guessing game! try to find my secret number!

Je tente une réponse au hasard :

> 42
That's not my secret number!

Il faut juste trouver un nombre, qui fait office de mot de passe. Il suffit de tous les tester. Je fais une simple boucle en Bash (attention les yeux, c’est déguelasse) :

for i in {0..1000000}; do ./guessy <<<$i | grep -v 'Welcome to the guessing game' | grep -v 'not my secret number'; done

Ce script va tester toutes les combinaisons de nombres en entrée entre 0 et 1000000. Les deux grep servent à filtrer l’affichage pour ne pas avoir la question ni le mesage d’erreur. Ainsi, seul le message de succès s’affichera. Le script me retourne :

grep: (entrée standard) : fichiers binaires correspondent
> O_o How did you find my secret number ?!?
Congratulations! You can validate with:

J’ai un message de félicitation, mais je n’ai pas le flag. Ce n’est pas grave, il suffit de procéder par dichotomie. Je recommence le même script, mais en testant les nombres de 0 à 100000, puis de 0 à 10000, et ainsi de suite. Quand l’intervalle est suffisament petit, je termine à la main. Le résultat est donc :

./guessy
Welcome to the guessing game! try to find my secret number!
> 193
O_o How did you find my secret number ?!?
Congratulations! You can validate with:
leHACK{y0u_d1d_f1nd_my_53cr37_numb3r}�

Fin alternative

Je ne l’ai remarqué qu’en écrivant cet article, mais il était possible d’aller beaucoup plus vite. Mon script Bash n’affiche pas le flag à cause de l’erreur grep: (entrée standard) : fichiers binaires correspondent. La ligne retournant le flag est malformée. Il y a un caractère binaire dessus, ce qui fait penser à grep que toute la ligne est au format binaire, et donc il ne l’affiche pas.

Il suffisait de passer le paramètre -a aux deux grep pour que le flag s’affiche, sans avoir à faire la phase de dichotomie.

Les challenges que je n’ai pas réussi

Il y beaucoup de challenges que je n’ai pas réussi, mais la plupart je ne les ai même pas tentés. Je vais indiquer ici uniquement ceux pour lesquels j’ai cherché.

ARCSI - miaou (niveau très facile)

Trouvez le flag

Je me doute bien que si m’image est au format PNG, c’est pour garder les pixels 100% intacts. Mais j’ai eu beau retourner l’image dans tous les sens, je n’ai rien trouvé. J’ai même utilisé TinEye pour retrouver l’image d’origine, mais mis à part les logos elle a zéro pixel de différence avec l’image du challenge.

Tis the time’s plague when madmen lead the blind (niveau moyen)

Peu avant sa re-disparition mystérieuse annuelle, un ami vous a re-demandé de l'aide pour analyser ce fichier. "Surement un coup des illuminati" affirmait-il encore...

Le message caché contenu dans le fichier commence par les caractères "X11N35". Il doit être encapsulé dans "leHACK{}" format du flag : leHACK{X11N35...}

La personne sur la photo est John Gardner, un physicien aveugle. Le titre du challenge fait référence au Roi Lear, une pièce de théâtre de William Shakespeare.

Il y a probablement de la stéganographie dans cette image. J’ai essayé des mots de passe divers et variés avec steghide, en m’inspirant des deux éléments ci-dessus, mais ça n’a rien donné.

YAWE - Yet Another WhatElse (niveau moyen)

Le flag est dans le texte

Url: https://static.wargame.rocks/yetanotherwhatelse/README.txt

Ce coup-ci, le mot texte est bien écrit. Je fais un curl -i https://static.wargame.rocks/yetanotherwhatelse/README.txt pour voir le contenu de la page, en incluant les en-têtes.

HTTP/2 200 
accept-ranges: bytes
alt-svc: h3=":443"; ma=2592000
content-type: text/plain; charset=utf-8
etag: "d2iryy194i8b5d"
last-modified: Sat, 06 Jul 2024 21:30:54 GMT
server: Caddy
vary: Accept-Encoding
content-length: 193
date: Sat, 06 Jul 2024 23:58:06 GMT

Le flag est ‫‌‌⁠‍​⁠⁠‎​dans le text

Vous ne le voyez probablement pas, mais il y a un problème dans le contenu de la page. Ca se voit mieux avec un hexdump.

00000000  4c 65 20 66 6c 61 67 20  65 73 74 20 e2 80 ab e2  |Le flag est ....|
00000010  80 8c e2 80 8c e2 81 a0  e2 80 8d e2 80 8b e2 81  |................|
00000020  a0 e2 81 a0 e2 80 8e e2  80 8b 64 61 6e 73 20 6c  |..........dans l|
00000030  65 20 74 65 78 74 0a                              |e text.|
00000037

Il y a des caractères non affichables dans le texte. Je n’ai pas trouvé quoi en faire, mais j’ai remarqué qu’en prenant les octets par groupes de trois, il y avait une certaine répétition.

e2 80 ab
e2 80 8c
e2 80 8c
e2 81 a0
e2 80 8d
e2 80 8b
e2 81 a0
e2 81 a0
e2 80 8e
e2 80 8b
e2 80 8c
e2 80 8e
e2 80 ab
e2 80 8d
e2 81 a0
e2 81 a0
e2 80 8f
e2 80 aa
e2 80 8e
e2 80 ab
e2 80 8f
e2 81 a0
e2 80 8e
e2 81 a0
e2 80 8d
e2 80 8d
e2 80 ab
e2 80 8b
e2 80 8f
e2 80 ab
e2 80 8e
e2 81 a0
e2 81 a0
e2 80 8d
e2 80 ab
e2 80 8b
e2 80 8f
e2 80 8b
e2 80 8e
e2 81 a0
e2 80 8e
e2 80 8b
e2 80 8e
e2 80 ab
e2 80 8f
e2 81 a0
e2 80 8b
e2 81 a0
e2 80 aa
e2 80 8d
e2 80 8b
e2 80 8f
e2 80 8f
e2 81 a0
e2 80 aa
e2 80 8f