Diese Challenge (bigfile of secret) berichtet von Verbindungsproblemen im Internet. Bereits beim ersten Verbindungsversuch mit “netcat” stellen wir dies wie folgt fest:
rup0rt@lambda:~/SecuInside2013$ nc -v 119.70.231.180 80
nc: connect to 119.70.231.180 port 80 (tcp) failed: Connection refused
Das ist für Capture the Flags – besonders zu Beginn – eigentlich nicht ungewöhnlich, da alle Gruppen zeitgleich versuchen, die Aufgabe lösen ;-). Da das Problem jedoch auch nach einiger Wartezeit fortbesteht, scheint es tatsächlich an den geschilderten “Verbindungsproblemen” zu liegen.
Wenn man nun mehrfach und schnell hintereinander den Verbindungsaufbei mit “netcat” durchführt, erhält man nach einigen Versuchen dieses Ergebnis:
rup0rt@lambda:~/SecuInside2013$ nc -v nc -v 119.70.231.180 80
Connection to 119.70.231.180 80 port [tcp/http] succeeded!
GET /secret_memo.txt HTTP/1.0
Das direkte Abrufen der gesuchten Datei (secret_memo.txt) mit dem entsprechenden HTTP-Get-Request liefert keine Ausgabe mehr, was vermuten lässt, dass die Verbindung wieder abgebrochen ist. Das Vorgehen muss also automatisiert werden.
Um nun nicht bei den Übertragungsversuchen durch neue Verbindungsabbrüche unterbrochen zu werden, nutzen wir eine Möglichkeit des HTTP-Protokolls, bei der nur ein Teil der Datei übertragen werden soll – den range – Header. Folgendes Skript soll diese Aufgabe erledigen:
#!/bin/bash part=0 step=1000 while [ 1 ]; do end=$(expr $part + $step) GOT=`echo -en "GET /secret_memo.txt HTTP/1.0\nRange: bytes=$part-$end\n\n" | nc 119.70.231.180 80` TEST=`echo $GOT | grep "Partial Content"` if [ "$?" == "0" ]; then echo "PART $part: $GOT" part=$end fi done
Hierbei soll die Datei in 1000-byte Schritten vom Server geladen werden und erst bei der korrekten Serverantwort (“Partital Content”) den Block akzeptieren. Nach einiger Wartezeit liefert das Skript diese Ausgabe:
rup0rt@lambda:~/SecuInside2013$ ./getfile.sh HTTP/1.1 206 Partial Content Date: Tue, 21 May 2013 09:09:30 GMT Server: Apache/2.2.22 (Ubuntu) Last-Modified: Mon, 20 May 2013 14:09:34 GMT ETag: "4095e-5f5e2e9-4dd26e1d56d24" Accept-Ranges: bytes Content-Length: 1001 Vary: Accept-Encoding Content-Range: bytes 0-1000/100000489 Connection: close Content-Type: text/plain Dear comrade! The Moment of Truth has come. We have successfully brought chaos to this filthy world. Every great words he has spoken are coming true, and he expects the best out of you to fulfill his great plan. Now, it is time to give you orders. I will give you the password for the mission. The password follows at the end of this file. (Don't forget the exclusive communication method I told you about, during the network crisis) the password is... .......................................................... [...]
Uns wird der Anfang der gesuchten Datei übertragen, wobei uns mitgeteilt wird, dass sich das Passwort ganz am Ende dieser Datei befinden soll. Zusätzlich können wir aus dem HTTP-Header die Gesamtgröße der gesuchten Datei ablesen, nämlich 100000489 Bytes. Nun müssen wir nur noch im folgenden Skript mit der selben Methode das Ende der Datei übertragen:
#!/bin/bash step=1000 size=100000489 end=$size part=$(expr $end - $step) while [ 1 ]; do GOT=`echo -en "GET /secret_memo.txt HTTP/1.0\nRange: bytes=$part-$end\n\n" | nc 119.70.231.180 80` TEST=`echo $GOT | grep "Partial Content"` echo "$GOT" if [ "$?" == "0" ]; then echo "PART $part: $GOT" part=$end exit 0 fi done
Nach Ausführung und weiterer Wartezeit auf eine erfolgreiche Verbindung, erhalten wir die Ausgabe:
rup0rt@lambda:~/SecuInside2013$ ./getend.sh
HTTP/1.1 206 Partial Content
Date: Tue, 21 May 2013 09:19:00 GMT
Server: Apache/2.2.22 (Ubuntu)
Last-Modified: Mon, 20 May 2013 14:09:34 GMT
ETag: "4095e-5f5e2e9-4dd26e1d56d24"
Accept-Ranges: bytes
Content-Length: 1000
Vary: Accept-Encoding
Content-Range: bytes 99999489-100000488/100000489
Connection: close
Content-Type: text/plain
............................................ [...]
.......key is : we will destroy the world!
Die Lösung lautet somit “we will destroy the world!“.