Secuinside CTF 2013 – bigfile of secret

Secuinside 2013 CTF - bigfile of secret - task description

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!“.

Leave a Reply

Your email address will not be published. Required fields are marked *