Points essentiels
À mon sens, les points essentiels pour facilement faire ses write-ups sont les suivants:
- Avoir un dossier pour tout le CTF, dans lequel on mettra tout (pour ne pas disperser les choses)
- A chaque challenge son sous-dossier dans ce dossier du CTF, pour ne pas se mélanger
- Toujours travailler sur un seul challenge à la fois, et mettre "TODO" dans le titre du dossier d'un challenge qu'on mettrait temporairement de côté
- Prendre régulièrement des screens, avec des notes, pour pouvoir faire son writeup à la fin
- Toujours travailler sur des copies des fichiers donnés par le challenge, et conserver le(s) fichier(s) originaux du challenge intacts, sinon, on risque d'altérer ces sources et de ne pas s'en rendre compte, ce qui fera perdre du temps
- Utiliser tous les outils à disposition: contenu de l'énoncé du challenge (qui donne parfois des indices), documentations en ligne, IA/LLM (ChatGPT), etc
Organisation
Screenshots
Pour un bon writeup, le plus simple à mon sens est de prendre des screens régulièrement, à chaque étape de la résolution (ou de la tentative de résolution 😄) du challenge. Ajouter à cela un système de notes à la volée, et le writeup s'écrit quasiment tout seul, en même temps qu'on flag un challenge.
Parfois, le fait d'appuyer sur les touches du raccourcis (pour prendre la screen) va fermer le menu déroulant ou la toolbox que l'on veut screener. La commande avec un délais permet d'appuyer sur le raccourcis, et on a alors 5 secondes pour ouvrir le menu déroulant ou survoler la toolbox, et la screen se prend ensuite toute seule. N'ayant pas eu besoin d'appuyer sur une touche à ce moment-là, la toolbox/le menu déroulant reste visible.
Cette note "à la volée" est une nouveauté que je me suis rajoutée, car je me suis aperçu qu'au moment du write-up final, il était parfois difficile de retrouver le contexte et l'idée que j'avais en tête pour chaque screen. Ces notes au moment du screen évitent cet écueil.
Rédaction
.venv ou __pycache)
J'ai simplifié depuis. Avant, je passais bien 10 à 30 minutes par writeup comme pour le 404CTF 2022 par exemple. Pour un CTF de 50 challenges, cela signifie 10h voire 20h de rédaction!
C'est une perte de temps: mieux vaut passer ce temps-là sur ne serait-ce que 1 ou 2 challenges qu'on n'a pas réussis, histoire de réellement apprendre quelque chose.
Ça, c'est pour les writeups "complets" avec tout le détail.
En pratique, maintenant, la plupart des writeups sont un simple paragraphe de texte (TL;DR) décrivant l'idée principale du challenge, et un lien vers l'archive contenant les fichiers ainsi que les screens (qui seront anotées automatiquement à partir de maintenant).
Cela permet d'avoir, en un coup d'oeil sur la page du compte-rendu du CTF, tous les challenges et l'idée principale pour les résoudre.
Garder les sources
Il est essentiel de garder les sources du challenge (les fichiers de l'énoncé) dans une version "originale" (intacte). En effet, il va souvent être nécessaire de bidouiller ces fichiers pour trouver une solution au challenge. Or, si vous bidouillez les originaux, vous risquez de modifier la réponse au challenge (par exemple, si le fichier original contient le flag chiffré) et votre méthode, pourtant juste, va foirer au moment de flagguer, vous faisant perdre du temps!
Backuper la machine avant le CTF
Je fais personnellement des backups réguliers de mes machines, mais je recommanderai de toujours en faire un avant de commencer un CTF. Cela permettra d'une part d'installer ce qu'on veut sans vergogne et de revenir en arrière si besoin, et d'autre part d'être tranquille d'esprit si jamais un antivirus pète un plomb.
Bien que ce soit l'approche de certains, je déconseillerai l'usage systématique d'une VM pour un CTF car la VM pourrait d'un côté poser des soucis dans les challenges (par exemple niveau réseau) mais aussi car elle vous empêchera de capitaliser les outils et scripts glanés pendant le CTF. Par exemple, grâce à certains CTF, j'ai maintenant SageMaths sur une de mes machines et je m'en sers parfois, pour d'autres CTF ou hors CTF.
Utiliser tous les outils
Les challenges sont parfois testés sur ChatGPT, pour vérifier qu'il n'en donne pas une réponse immédiate. Certains peuvent même être bidouillés pour que la réponse du LLM soit fausse! Il faut donc utiliser ChatGPT de manière intelligente, pour lui faire ce qu'il sait faire uniquement.
Les LLM marchent très bien pour:
- identifier des choses (par exemple, identifier qu'une courbe elliptique est une courbe standard, donc solide et qui ne sera pas votre vecteur d'attaque)
- ou pour chercher dans la documentation comme le ferait un "dictionnaire" inversé (par exemple, pour lui demander quelle est la fonction numpy pour calculer les vecteurs propres d'une matrice)
- ou pour les templates simplistes (par exemple, pour lui demander le template de code Python pour ouvrir un socket vers un serveur)
- ou pour chercher des images en ligne (par exemple, pour retrouver une image d'une personne dans un OSINT ou d'un évènement)
Ils sont en revanche mal adaptés pour réfléchir ou raisonner, et vous risquez dans ce cas là de perdre inutilement des heures sur des fausses pistes suite aux hallucinations de l'IA.
Ré-utilisez les challenges
Si deux challenges s'enchainent (1/2 puis 2/2), souvent, le 2e ne peut être résolu avec la méthode du premier. Mais l'inverse n'est pas vrai: si vous avez trouvé une méthode pour résoudre le 2e challenge, essayez-la sur le premier.
Toutefois, quand vous avez une méthode pour résoudre le 1er et même si cela a des chances de ne pas marcher, essayez-la quand même sur le second. Parfois, votre méthode n'était pas celle prévue, et elle marchera quand même sur le 2nd challenge.
Indices dans les flags
Parfois, le flag lui-même n'est pas une chaine aléatoire (hexa) mais un texte (leet ou similaire): sa signification peut alors aiguiller sur une piste, ou inversement, le contexte et l'énoncé peuvent permettre de réduire les flags possibles
Méthodes de réflexion
- Concentrez-vous sur un challenge à la fois, et coupez les distractions autour si possible (sauf pour les challenge Facile éventuellement 😄).
- Soyez attentif à toute information de l'énoncé (titre du challenge, nom des fichiers, contexte…) car ceux-ci contiennent souvent des indices ou une "confirmation" d'une piste que vous pourriez avoir
- Pensez à bien noter le flag quand vous l'avez!
- Si vous coincez sur un flag, changez d'approche. Le brute-force marche mal? Essayez un reverse. Vous ne trouvez pas de SQLi? Essayez une XSS. etc; et gardez les échecs de côté, au cas où.
- Faites simple! Piffez si besoin! Parfois, cela marche. Par exemple, si une application demande un code PIN de 8 chiffres, essayez-en quelques-un qui ont un "sens" (date du CTF, 1337,…). Ou brute-forcez-le pendant la nuit 😄.
- Au besoin, mettez le challenge de côté (voir ci-dessus), faites-en un autre, et aidez-vous de cet autre challenge pour refaire le premier.
- Utilisez les niveaux de difficulté pour savoir quelle piste choisir. Si vous coincez sur un challenge "Facile" alors que les "Moyen" sont pliés, c'est que vous cherchez sans doute trop compliqué pour ce "Facile".
- Changez d'air. Faites autre chose. Parfois, une idée vous viendra en faisant la vaisselle ou le ménage, ou en partant en foret pour écouter les oiseaux.
Notez ou screenez le flag dès que possible: une panne de courant, une coupure réseau, une erreur de frappe, un reboot intempestif… Il y a tant de choses qui peuvent vous le faire perdre!
À la fin
- Pillez le CTF une fois terminé. Récupérez tous les challenges, tous les énoncés et tous les fichiers. Cela vous permettra d'y revenir ou de les faire sans limite de temps.
- Allez voir les writeup des autres concernant les challenges que vous avez ratés. Prenez quelques notes pour savoir quelle piste et quelle méthode vous a échappé, et appliquez-les la prochaine fois.
- Gardez le contact avec les autres joueurs, et/ou les organisateurs: cela pourra vous aider en termes de réseau pro.