Der CCC veranstaltet seit 35 Jahren einen Kongress. Der diesjährige fand unter dem Motto Refreshing Memories statt. Auch in diesem Jahr gab es ein CTF (Capture the flag) Spiel. Ziel eines CTF-Spiels ist es, eine Schwachstelle zu finden, diese auszunutzen und ein „Flag“ in Erfahrung zu bringen.
Challenge
Fun with flags: http://35.207.169.47
Flag is at /flag
Difficulty estimate: Easy
Beim Aufruf der Adresse wurde folgende Seite angezeigt.
Analyse
Der PHP Code holt sich die aktuellen gesetzten Browsersprachen.
$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'ot';
Danach werden die Sprachen (falls mehrere gesetzt sind) aufgeteilt und die erste wird in die Variable geschrieben.
$lang = explode(',', $lang)[0];
Daraufhin wird der Inhalt der Variable gesäubert bzw. geschützt.
$lang = str_replace('../', '', $lang);
Als nächstes wird aus dem Ordner “flags” das Bild passend zur Sprache geladen.
$c = file_get_contents("flags/$lang");
Jetzt erfolgt eine Prüfung, ob eine Datei vorhanden ist und wenn nicht, wird ein default Bild geladen.
if (!$c) $c = file_get_contents("flags/ot");
In der letzten Zeile erfolgt die Ausgabe.
Information gathering
Was wissen wir:
- Das Ziel liegt unter “/flag”.
- Eingabeparameter, der beeinflusst werden kann, ist die erste Browsersprache.
- Es gibt einen Schutzmechanismus “str_replace”.
Unser Ziel ist es, dass Laden des Inhaltes zu beeinflussen.
$c = file_get_contents("flags/../../../../../flag");
Das ist prinzipiell möglich, da die Browsersprache selbst festgelegt werden kann. Dafür im Firefox in der Adresszeile den Befehl “about:config” eingeben und nach “intl.accept_languages” suchen.
Jetzt noch den Schutzmechanismus “str_replace” umgehen. Die Funktion ersetzt den Text “../” durch einen leeren String. Der Mechanismus ist leicht zu umgehen, denn es wird nur “../” ersetzt. Wenn aber als Input für die Funktion “….//” beinhaltet, ist das Output “../” und genau das möchten wir erreichen. Es werden lediglich zwei Punkte und ein Slash entfernt, der Rest bleibt erhalten.
Exploiting
1. Wir ändern unsere Browsersprache in “….//….//….//….//flag”
2. Wir rufen die Seite auf.
Es wird kein Bild angezeigt. Also den Quelltext der Seite anzeigen lassen (STRG +U).
3. Den Text kopieren und dekodieren.
echo "MzVjM190aGlzX2ZsYWdfaXNfdGhlX2JlNXRfZmw0Zwo=" | base64 -d
Solution: 35c3_this_flag_is_the_be5t_fl4g
Diese Art von Angriff nennt man directory traversal attack. :)