Fetch the Flag CTF 2022: Lösung zu git-refs
Iulia Manda
9. November 2022
0 Min. LesezeitVielen Dank, dass Sie bei Fetch mitgespielt haben! Glückwunsch an die Tausenden von Spielerinnen und Spielern, die beiFetch the Flag CTF dabei waren. Ein großes Dankeschön auch an das Snyk-Team, das die Challenges entwickelt, getestet und dokumentiert hat!
Wenn Sie bei der diesjährigen Veranstaltung Fetch the Flag CTF dabei waren, haben Sie vielleicht die Challenge git-refs in Angriff genommen. Falls Sie sie nicht abschließen konnten oder einfach mehr darüber erfahren möchten, gehen wir sie in diesem Blogbeitrag gemeinsam durch. Name und Beschreibung der Challenge deuten auf Git hin – das behalten wir bei unserer Untersuchung im Hinterkopf. Kann Git uns helfen, die Flag zu finden? Sehen wir uns mögliche Angriffsvektoren in der Anwendung git-refs an.
Challenge
Bei dieser Web-Challenge erhalten wir einen Link zu einer Website, auf der wir Informationen zu öffentlichen Git-Repositories sehen können. Über die Textsuche lassen sich Branches und Commit-Hashes eines bestimmten Repositories auflisten. Für erfolgreiche Anfragen ist keine Authentifizierung erforderlich – das macht die Challenge etwas einfacher.
Lösungsschritte
Sehen wir uns zuerst die gesendeten Anfragen an.


Wir stellen fest, dass eine POST-Anfrage an http://git-refs.c.ctf-snyk.io/git gesendet wird, mit einer Liste im Request-Body:
Interessant! Wir vermuten, dass ls-remote ein Git-Befehl ist. Können wir wohl auch andere Git-Befehle im Request-Body übergeben …?

Es sieht so aus, als hätten wir jetzt über den Git-Befehl eine Remote-Shell. Finden wir heraus, ob wir Informationen zum Repository git-refs abrufen können.
Es scheint ein leeres Git-Repository zu sein. Ist es das wirklich? Vielleicht finden wir etwas, das in der Git-Historie rückgängig gemacht wurde?

Auch das Reflog scheint nicht besonders hilfreich zu sein. Das sieht nach einem lokalen, gerade erst initialisierten Repository aus, in das noch nichts an ein Remote-Repository übertragen wurde.
Könnten wir diese Erkenntnisse vielleicht nutzen, um Informationen über Systemdateien abzurufen? Vielleicht können wir nach einer flag.txt oder etwas Ähnlichem suchen.

Im Git-Handbuch finden wir heraus, dass sich der Befehl --work-tree möglicherweise eignet, um das Dateisystem zu durchsuchen.

Super! Mit Git konnten wir „/“ auf dem Remote-System auflisten.
Bei diesem Untersuchungsansatz hatten wir allerdings kein Glück. Vor allem schlugen alle Versuche fehl, Dateiinhalt auszulesen (also git add und anschließend git diff auszuführen). Vielleicht lässt sich wegen der .gitignore-Datei nichts hinzufügen oder committen? Ganz sicher sind wir nicht, da wir auch den Inhalt von .gitignore nicht sehen konnten.
Lesen wir weiter, was wir sonst noch mit git machen können.
Ein anderer Ansatz
Als Nächstes kam uns der Gedanke, die Repository-Konfiguration zu überprüfen. Bei der Durchsicht der Optionen von git config fanden wir eine, die interessant klang:
Hmm, interessant. Probieren wir es aus:

Und da ist die Flag. :)
Zusammenfassung
Fassen wir zusammen, was wir zur Lösung dieser Challenge verwendet haben:
Analyse der Netzwerkanfragen der Webanwendung: URL, Request-Body und Status prüfen
Einen möglichen Angriffsvektor identifizieren, indem wir anhand der vorliegenden Informationen herausfinden, wie wir Zugriff auf eine Remote-Shell erhalten
Das Git-Handbuch (oder das eigene Gedächtnis – je nachdem :) ) durchlesen, um herauszufinden, was uns der Flag näherbringen könnte
Command Injection kommt nach wie vor häufig vor. Deshalb ist die Bereinigung von Eingaben nach wie vor ein Muss in modernen Anwendungen. Wir hoffen, Ihnen hat diese Challenge Spaß gemacht und Sie konnten dabei etwas lernen.
Möchten Sie erfahren, wie wir alle anderen Flags gefunden haben? Auf unserer Seite Fetch the Flag solutions erfahren Sie, wie wir dabei vorgegangen sind.



