12 minutes
OverTheWire Natas WriteUp - Level 0 bis 14
Einleitung Wargames
OverTheWire.org bietet über 15 verschiedene Wargames an, welche verschiedene Schwierigskeitgrade haben. Wenn du den Begriff “Wargame” im Bezug zu Cyber Security zum ersten Mal hörst, fragst du dich bestimmt: “Was ist eigentlich ein Wargame?”.
Wargames sind Herausforderungen, entweder online oder offline als Virtuelle Maschine, in denen man versucht Sicherheitslücken auszunutzen und/oder Zugriff zu etwas zu erlangen. Sie sind teilweise sehr unterschiedlich was die benötigten Fähigkeiten, die Herausforderung und die Vorgehensweise anbelangt. Wargames werden von verschiedenen Internetseiten angeboten und haben teilweise eine große Community. Eine Liste von Wargame Anbietern kannst du hier finden.
Level 0
Nachdem wir uns auf http://natas0.natas.labs.overthewire.org/ mit dem Nutzernamen natas0 und Password natas0 angemeldet haben, sehen wir eine Seite mit dem Text You can find the password for the next level on this page.. Wenn wir uns den Seitenquelltext anzeigen lassen, finden wir bei Zeile 16 folgendes:
Level 0 -> Level 1
Diesmal ist das Password für das nächste Level wieder im Seitenquelltext versteckt, allerdings wird der Rechtsklick der Maus blockiert. Das ist aber kein Problem für uns, da wir mit Strg + U uns trotzdem den Seitenquelltext anzeigen lassen können. Bei Zeile 17 finden wir dann folgendes:
Level 1 -> Level 2
Wir sehen uns wieder zuerst den Seitenquelltext an. In Zeile 15 finden wir folgendes:
Wenn wir nach http://natas2.natas.labs.overthewire.org/files/ gehen, sehen wir dort eine Datei users.txt.
In dieser steht:
Level 2 -> Level 3
Wenn wir uns den Seitenquelltext ansehen, finden wir diesmal nur den Kommentar <!– No more information leaks!! Not even Google will find it this time… –>.
Sehen wir uns doch mal die robots.txt Datei an, welche bestimmte User-Agenten ausschließen kann, z.B. auch die Bots von Suchmaschinen.
Der Ordner /s3cr3t/ wird also von Suchmaschinen ausgeschlossen… Sehen wir uns diesen mal an.
In dem Ordner befindet sich die Datei Users.txt mit dem Inhalt:
Level 3 -> Level 4
Bei diesem Level müssen wir den Referrer veränder. Um das zu machen brauchen wir die Hilfe von Burp. Mit Burp können wir den Datenverkehr unterbrechen und Anfragen bearbeiten.
Wenn wir auf Refresh Page klicken und Burp gerade unseren Verkehr unterbricht, können wir unter headers den Referrer von natas4 zu natas5 ändern.
Danach müssen wir das Request nur noch weiterleiten und schon wird uns das Passwort angezeigt.
Level 4 -> Level 5
Wenn wir uns einloggen, steht auf der Seite, dass wir keinen Zugriff haben, weil wir nicht eingeloggt sind. Das könnte eventuell daran liegen, dass ein Cookie falsch gesetzt ist.
Mit dem Browser Addon **EditThisCookie **können wir den Inhalt von Cookies sehen und bearbeiten.
Es gibt also einen Cookie der loggedin heißt und den Wert 0 besitzt. Wenn wir den Wert auf 1 setzen und die Seite neu laden, wird uns das Passwort für das nächste Level angezeigt.
Level 5 -> Level 6
Bei diesem Level hier müssen wir das richtige Password für das für Input Secret finden. Im Quelltext steht in Zeile 17:
Wenn wir nun zu http://natas6.natas.labs.overthewire.org/includes/secret.inc gehen, finden wir:
Jetzt müssen wir nur noch das Secret einfügen, absenden und geschafft.
Level 6 -> Level 7
Im Seitenquelltext steht in Zeile 21:
Wenn wir auf Home klicken sehen wir die URL http://natas7.natas.labs.overthewire.org/index.php?page=home
Hier können wir eine LFI/RFI Schwachstelle ausnutzen. Dafür müssen wir nur folgende URL eingeben:
Jetzt wird uns das Password angezeigt: DBfUBfqQG69KvJvJ1iAbMoIpwSNQ9bWe
Level 7 -> Level 8
Im Seitenquelltext sehen wir, dass unser Input mit der Variable $encodedSecret verglichen wird. Dazu wird unser Input erst in Base64 enkodiert, dann umgedreht und schließlich werden die Binär Daten in Hex konvertiert. Um an das richtige Secret zu kommen, müssen wir diesen Prozess umkehren.
Dazu können wir den Interactiven Modus von PHP benutzen:
Das Secret ist also oubWYf2kBq.
Level 8 -> Level 9
In Zeile 29 vom Quelltext finden wir folgendes: passthru(“grep -i $key dictionary.txt”); Wobei $key unser Input ist.
Es wird also ein Linux Befehl ausgeführt. Das können wir ausnutzen. Suchen wir zum Testen mal nach ; ls.
Durch das Semikolon wird der grep-Befehl beendet und ls wird ausgeführt. Unter /etc/natas_webpass befinden sich die Passwörter für alle Level.
Wir haben immer nur die Rechte, die Datei für das derzeitige und das nächste Level zu lesen. Benutzen wir:
Als Ausgabe werden uns die Passwort-Dateien aller Level aufgelistet. Lassen wir uns natas10 doch mit cat ausgeben.
Level 9 -> Level 10
Die Zeichen ; und & werden in diesem Level gefiltert, weswegen wir hier nicht wie in Level 9 vorgehen können.
Allerdings können wir uns grep von nutzen machen. Der Befehl grep -i nimmt als ersten Parameter das Suchwort und alle danach folgenden als Datei in der gesucht werden soll. Also können wir einfach /etc/natas_webpass/natas11 als zu durchsuchende Datei hinzunehmen.
Geben wir a /etc/natas_webpass/natas11 ein…
Der Buchstabe a scheint nicht im Passwort vorhanden zu sein.
Probieren wir u /etc/natas_webpass/natas11 aus.
Level 10 -> Level 11
Bei diesem Level haben wir einen XOR Verschlüsselten Cookie, welchen wir verändern müssen.
Der Quelltext ist wie folgt:
Im Cookie Editor können wir sehen, dass der Cookie data den Wert ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw%3D enthält.
Außerdem wissen wir dank des Quelltextes wie der entschlüsselte Wert lautet:
“showpassword”=>“no”, “bgcolor”=>"#ffffff"
Eine XOR Verschlüsselung ist einfach zu entschlüsseln, wenn man 2 der 3 folgenden Sachen weiß:
Der verschlüsselte Text, der entschlüsselte Text und der Schlüssel der zum verschlüsseln benutzt wird.
Wir wissen die ersten beiden Sachen. Wir können nun die xor_encrypt Funktion anpassen, um den Schlüssel herauszufinden.
Wenn wir die Datei nun ausführen erhalten wir: qw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jqw8Jq
Der Schlüssel ist also qw8J
Wenn wir die Funktion erneut etwas anpassen, können wir verschlüsseln, was wir möchten.
Wenn wir die Funktion ausführen erhalten wir den Cookie ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK
Ersetzen wir nun den Wert des Cookies data damit, müssen wir nur noch die Seite neu laden und es erscheint der Text
The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3
Level 11 -> Level 12
Bei diesem Level können wir eine JPEG Datei hochladen. Sehen wir uns mal den Quelltext an.
Wenn wir eine Datei hochladen, wird bekommt diese einen zufälligen 10-stelligen Namen, die Endung .jpg und wird unter /upload/ gespeichert. Den Link zu der Datei bekommen wir danach angezeigt. Wir können ein PHP-Skript erstellen, welches für uns ein System-Kommando ausführt und müssen dafür sorgen, dass es mit der Endung .php in dem Ordner /upload/ gespeichert wird und nicht mit der Endung .jpg.
Durch dieses Kommando erstellen wir ein PHP-Skript welches auf dem Server cat /etc/natas_webpass/natas13 ausführen wird. Das \ ist bei echo ein escape character. Ohne das \ würde der echo Befehl bei system(" enden. system führt bei PHP ein System Kommando aus und gibt den Output aus. Wird speichern das PHP-Skript als cutecat.jpg ab, wobei die Endung bei diesem Beispiel egal ist, da die Datei eh umbenannt wird und die Seite die Datei nicht auf ihre Endung überprüft.
Es gibt verschiedene Möglichkeiten, wie wir dafür sorgen können, dass unsere Datei nun als .php gespeichert wird.
Zum einen können wir Strg + Umschalt + I drücken um die Elemente der Seite zu untersuchen. Dann suchen wir nach dem verstecktem Input-Feld und können dort den Wert von filename ändern.
Danach müssen wir nur noch auf Upload File klicken, die Datei wird unter dem Namen gespeichert, welchen wir festgelegt haben und wenn wir durch den Link, welcher uns angezeigt wird, die Datei ausführen, bekommen wir das Passwort angezeigt.
Alternativ können wir auch Burp benutzen. Wenn wir das Upload Anfrage abfangen, können wir dort auch den Dateinamen ändern.
Wenn alles geklappt hat, bekommen wir das Password angzeigt.
Level 12 -> Level 13
Dieses Level ist eine Erweiterung zum vorherigen. Der Quelltext hat drei neue Zeilen dazu bekommen.
Jetzt wird bei der Datei, welche wir hochladen, zusätzlich überprüft um was für einen Bildtyp es sich bei der Datei handelt. Dies wird durch exif_imagetype(datei) realisiert. exif_imagetype liest die ersten Bytes der Datei aus und überprüft anhand der Signatur um welchen Dateityp es sich handelt. Wenn wir etwas anderes als eine Bilddatei hochladen erhalten wir nur die Rückmeldung File is not an image.
Auf Wikipedia können wir eine Liste mit Signatur für verschiedene Dateitypen finden. Die Signatur für JPEGs ist FF D8 FF DB.
Hier gibt es auch wieder verschiedene Möglichkeiten, wie wir die Signatur an den Anfang unserer Datei einfügen können, sodass diese als JPEG erkannt wird.
Dadurch haben wir nun die JPEG Signatur in der Datei jpeg gespeichert. Jetzt müssen wir nur noch unser PHP-Skript erstellen und die beiden Dateien zusammenführen.
- Wir können auch den Hexeditor dafür benutzen.
Viermal Strg + A drücken um null-Bytes zu erstellen, FF D8 FF DB eingeben und mit Strg + X speichern.
- Wir laden unser Skript ganz normal hoch und fangen die Anfrage mit Burp ab. Wir kopieren dann die ASCII Kodierung der Signatur von Wikipedia und fügen diese vor dem Inhalt unserer Datei ein.
Natürlich dürfen wir nicht vergessen, wie im vorherigen Level, dafür zu sorgen, dass unsere Datei wieder mit der Endung .php gespeichert wird. Wenn alles funktioniert hat, bekommen wir wieder das Passwort angezeigt, wenn wir dem Link zu unserer Datei folgen.
Level 13 -> Level 14
Sehen wir uns den Quelltext an:
Wir können die genaue SQL Abfrage sehen, welche gemacht wird:
Wir können nun eine ganz einfache SQL Injection machen, um an das Passwort zu kommen
Dadurch erhalten wir folgende SQL Abfrage
Wir werden also also als irgendein beliebiger Benutzer eingeloggt.