Ma méthode pour les CTF

Points essentiels

À mon sens, les points essentiels pour facilement faire ses write-ups sont les suivants:

Organisation

J'ai un dossier par CTF
Dans le dossier du CTF, j'ai un sous dossier par catégorie (s'il y a des catégories)
Et donc, un dossier par challenge dans la catégorie, avec le nom et le nombre de points
Si je coince sur un challenge, je mets "TODO" dans le titre, j'y regroupe tous les fichiers (par exemple, les screens et leurs notes) et je change de challenge

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.

J'ai des raccourcis pour prendre des screens
Ils sont dans "clavier"
J'en ai défini en fonction des contextes/besoins (fenetre active, zone, tout etc)
Mon screenshoter va attendre un délais dans certains cas
Puis il prend la screen

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.

Avec un petit "clic" pour le retour utilisateur
Et il me demande une ligne de notes pour ne pas oublier le contexte de chaque image

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.

Et je me retrouve avec mes screens dans mon dossier d'image, pretes pour le writeup
Avec les notes qui accompagnent les screens

Rédaction

Pour rédiger le writeup de chaque challenge, je fais une archive du dossier du challenge
En tarxz (avant en zip, car le core2duo avait du mal avec xz 😄)
Après compression du dossier d'un challenge, je l'allège, car certains dossiers sont trop lourds pour trop peu de valeur ajoutée (eg: .venv ou __pycache)
Ensuite, dans mon writeup, il me reste alors à rajouter les screens

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.

Les screens sur l'écran de droite, le code à gauche, et je fais mon writeup

Ç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!

Dans un dossier de challenge, j'ai toujours un sous dossier "sources" avec les données de l'énoncés, non modifiées

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

Servez-vous sans vergogne de chatGPT, pour les cas les plus pertinents

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

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