Einführung
(dieser Artikel wurde zur Bewertung an Google gesendet und ist urheberrechtlich geschützt. Wenn Sie also Ihre eigene Lösung einsenden möchten, war das gestern. Sie müssen im Scoreboard registriert sein, damit Ihr Artikel berücksichtigt wird.)
MindReader war angeblich eine der einfachsten Herausforderungen bei GoogleCTF und es ist nach einigem Raten auch so. Also los gehts
Als erstes sehen wir auf der Challenge-Seite ein Feld mit einer Schaltfläche „Lesen“.
Als erstes kommt einem der Test auf „XSS“ in den Sinn. Daher wurden einige XSS-Versuche getestet, darunter die folgenden:
<script>alert(test)</script>
Leider war die Reaktion nicht wie erwartet
Es wurden auch Befehlsinjektionstechniken mit einigen „ls“ und „cmd“ ausprobiert, aber auch ohne Erfolg.
Der nächste Schritt war nun der Versuch einer Verzeichnisüberquerung. Dabei stellte sich heraus, dass der Host anfällig ist. Die folgenden Versuche wurden unternommen, aber auch ohne Erfolg.
../.././../etc/passwd
../../../../usw./Schatten
../../../../etc/resolv.conf
../../../usw./Hosts
Nach ein paar Fingerprintings stellte sich heraus, dass in der Umgebung ein Docker ausgeführt wird. Daher wurde die Hauptseite erneut geöffnet, „main.py“ eingegeben und das Hauptskript wurde angezeigt.
Das obige Skript verwendet das „Flask“-Framework und die Funktion „index()“, um die Aufgaben zum Lesen der im Challenge-Feld eingegebenen Werte auszuführen.
Zeile 6 sagt uns, dass es eine Umgebungsvariable gibt, die vor dem Ausführen der Funktion aktiviert wird, und Google hat uns einen Hinweis gegeben, dass diese Umgebungsvariable das eigentliche FLAG ist.
Und da die Angabe des Hosts anfällig für Verzeichnisdurchquerungen ist, muss auf die Umgebungsvariable auf diese Weise zugegriffen werden.
Ich habe jede Kombination mit /proc/self/environ ausprobiert, aber es scheint, dass wir keine Zugriffsberechtigungen haben
Gute Kenntnisse von Linux-Systemen sind dabei von Bedeutung. /proc/self/fd verfügt über symbolische Links zu /dev/fd. Dies bedeutet, dass in Linux Beziehungen zwischen Umgebungsvariablen und Dateideskriptoren bestehen, die es uns ermöglichen, von Dateideskriptoren oder von /dev/fd aus, das bei 0,1,2 usw. beginnt, auf die Umgebung zuzugreifen.
Wenn wir also /dev/fd/0 versuchen, aber /dev/fd/8 binden, erhalten wir
Gekoppelt mit Directory Traversal
/dev/fd/../Umgebung
Und die Flagge wurde erobert