Solution du CTF Fetch the Flag 2022 : git-refs
Iulia Manda
9 novembre 2022
0 minutes de lectureMerci d’avoir participé à Fetch avec nous ! Félicitations aux milliers de joueurs qui nous ont rejoints pour leCTF Fetch the Flag. Et un immense merci aux Snykers qui ont créé, testé et documenté les défis !
Si vous avez participé à l’événement CTF Fetch the Flag de cette année, vous avez peut-être relevé le défi git-refs. Si vous ne l’avez pas terminé ou souhaitez simplement en savoir plus, nous allons l’examiner dans cet article. Le nom et la description de ce défi font penser à Git : nous garderons donc cela à l’esprit pendant notre enquête. Git pourrait-il nous aider à trouver le flag ? Voyons quelles vulnérabilités potentielles se cachent dans l’application git-refs.
Défi
Dans ce défi Web, un lien nous mène à un site qui affiche des informations sur des dépôts Git publics. Une recherche textuelle permet de répertorier les branches et les empreintes de commit d’un dépôt donné. Aucune authentification n’est nécessaire pour que les requêtes aboutissent, ce qui va nous faciliter un peu la tâche.
Étapes de résolution
Commençons par examiner les requêtes envoyées.


Nous constatons qu’il s’agit d’une requête POST vers http://git-refs.c.ctf-snyk.io/git, avec une liste dans le corps de la requête :
Intéressant ! Nous pensons que ls-remote est une commande Git. Voyons si nous pouvons passer d’autres commandes Git dans le corps de la requête…

On dirait que nous avons maintenant un shell distant via la commande Git. Voyons si nous pouvons obtenir des informations sur le dépôt git-refs.
Il semble s’agir d’un dépôt Git vide. Mais l’est-il vraiment ? Pourrions-nous trouver quelque chose qui a été supprimé de l’historique Git ?

Le reflog ne semble pas très utile non plus. On dirait que c’est un dépôt local qui vient d’être initialisé, car rien n’a été envoyé en amont.
En fait, pourrions-nous exploiter ces découvertes pour obtenir des informations sur les fichiers système ? Cherchons peut-être un fichier flag.txt ou quelque chose de similaire.

En consultant le manuel Git, nous découvrons que l’option --work-tree pourrait nous aider à explorer le système de fichiers.

Super ! Nous avons utilisé Git pour lister le contenu de « / » sur le système distant.
Cette piste ne nous a toutefois pas menés bien loin, principalement parce que toutes nos tentatives de lecture du contenu des fichiers ont échoué (nous avons essayé git add, puis git diff, mais rien ne pouvait probablement être ajouté ou validé à cause du fichier .gitignore. Nous n’en sommes pas sûrs, car nous n’avons pas non plus pu en voir le contenu).
Poursuivons notre lecture pour découvrir ce que nous pouvons faire d’autre avec git.
Changer d’approche
Nous avons ensuite pensé à vérifier la configuration du dépôt. En parcourant les options de git config, nous en avons trouvé une qui semblait intéressante :
Hmm, intéressant. Essayons :

Et voilà le flag. :)
Pour conclure
Récapitulons les étapes qui nous ont permis de résoudre ce défi :
Analyser les requêtes réseau de l’application Web : vérifier l’URL, le corps de la requête et le statut
Repérer une vulnérabilité potentielle en déterminant comment obtenir un accès à un shell distant à partir des informations disponibles
Parcourir le manuel Git (ou faire appel à ses souvenirs, selon le cas :) ) pour découvrir comment nous rapprocher du flag
L’injection de commandes reste assez fréquente. Il est donc toujours indispensable de nettoyer les entrées utilisateur dans les applications actuelles. Nous espérons que ce défi vous a plu et que vous avez appris quelque chose au passage.
Vous voulez savoir comment nous avons trouvé tous les autres flags ? Consultez notre page Solutions de Fetch the Flag pour découvrir comment nous avons procédé.



