Dockerflag (Forensics) - 404CTF2025

Principe:
Retrouver, dans les "étages" d'une image Docker, un repo Git (endommagé) et trouver le flag dans un des objets git

Infos (cf menu latéral):
🚩 Flaggué! +100 points gagnés — 💾 Téléchargez les fichiers du challenge
404CTF{492f3f38d6b5d3ca859514e250e25ba65935bcdd9f4f40c124b773fe536fee7d}

Le challenge

L'énoncé du challenge

Tarball Docker

On extrait la tarball, et on récupère plusieurs fichiers

En pratique, chacun de ces fichiers est un "étage" d'une image docker, qui sont construites par différentiels successifs. Ainsi, si on vous donne un jour une image Docker à analyser, sachez que vous aurez plusieurs… "niveaux" successifs à investiguer.

On extrait donc chaque "étage" de l'image Docker
Faisons un petit grep pour trouver le flag (une recherche sur 404CTF n'avait rien donné)
On trouve alors un fichier HTML avec un formulaire permettant de "chercher" le flag
Si on va voir le code serveur associé, on retrouve une mention du "SECRET" recherché et des "DOTENV" (.env)

Chercher le SECRET

Si on cherche le SECRET un peu partout, on ne trouve rien d'intéressant
Pareil si on cherche l'env
Mais un .env cela fait référence non pas au contenu de l'image, mais plutôt à sa construction, donc, cherchons dans le fichier associé

L'image docker est en effet composé de tarball successive, représentant les "couches" de construction, et d'un fichier "d'assemblage" de ces couches, qui nous intéresse donc ici.

En parcourant les étapes de construction, on trouve une clef GPG dans les variables d'environnement
Mais c'est une clef standard de Docker: aucun intérêt pour nous ici
On continue de creuser, et… toujours rien! Étonnant, la piste du fichier de construction du Docker semble fausse?

ls… lahR!

Et là, ne sachant trop où chercher ce .env je fais un ls -lahR sur les fichiers, et boom, je repère un fichier caché!
Vu le nom du fichier, on cherche donc un repo git, qu'on trouve mais impossible de le parcourir classiquement

Dépôt Git

Il semble donc s'agir d'un challenge où il faudrait lire les fichiers d'un repo git "cassé"
On peut les lire au moyen de zlib_decode de PHP (ou d'autres méthodes, mais j'aime bien PHP 🤣)
On itère donc sur tous les objets du repo pour essayer de trouver le flag
Histoire de faire un truc sympa, je sauve chaque objet extrait dans un fichier (cf data-git dans l'archive du challenge)
Il ne reste plus qu'à grep sur ces fichiers extraits et bingo!
Bonus: parfois, le flag est dans les fichiers de commit, mais ceux-ci sont plus facile à lire car ils ne nécessitent pas zlib puisqu'ils sont en clair

Bonus: Image PNG

Il y avait une image PNG dans le repo, et ma curiosité me pousse à vouloir voir ce que c'est

Le tail permet ici de se passer du début de l'objet extrait, qui contient blob 3131 par exemple (la taille du document il me semble)

Bof, c'est juste un logo quelconque, même pas un RickRoll?! Je suis déçu… 😄

Flag: 404CTF{492f3f38d6b5d3ca859514e250e25ba65935bcdd9f4f40c124b773fe536fee7d}