ForbiddenBITS CTF 2013 – X93

ForbiddenBITS CTF 2013 - X93 - task description

Diese Challenge (X93) ist der vorherigen “X94-Machine” sehr ähnlich. Nicht nur die Aufgabenstellung ist identisch, auch der Server selbst bietet exakt die gleichen Funktionen.

rup0rt@lambda:~/FB2013$ nc 95.170.83.28 3003
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 _    _  93   _________   ______   ______  _    _  _____  ______   ______
\ \  / /     | | | | | \ | |  | | | |     | |  | |  | |  | |  \ \ | |
 >|--|<      | | | | | | | |__| | | |     | |--| |  | |  | |  | | | |----
/_/  \_\     |_| |_| |_| |_|  |_| |_|____ |_|  |_| _|_|_ |_|  |_| |_|____

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Really Wanna Trade with us ? yes/no
yes

Enter Username :
1338-offbyone

Welcome 1338

Enter your Command :

[1] balance
[2] exchange
[3] transfert
[4] restricted area
4

This Area is restrcited for accounts with 5000usd+

Wieder geht es darum, unseren Kontostand auf über 5000 US-Dollar zu erhöhen um so auf den geschützen Bereich zugreifen zu können. Zunächst wiederholen wir testweise unser Vorgehen aus der voherigen Challenge.

[1] balance
[2] exchange
[3] transfert
[4] restricted area
2

Enter Destination currency
EUR 

Enter Source currency
USD

Enter Amount
-5000 

you dont have such amount

Diesmal scheinen die Benutzereingaben jedoch korrekt validiert zu werden und wir müssen einen anderen Weg finden, unser Konto aufzufüllen. Da das System beim Währungstausch einen Umrechnungsfaktor verwenden muss, liegt vielleicht eine Ungenauigkeiten beim Runden vor?
Continue reading

ForbiddenBITS CTF 2013 – X94

ForbiddenBITS CTF 2013 - X94 - task description

Bei der X94 – Challenge werden wir aufgefordert, Zugriff auf den eingeschränkten Bereich zu erlangen. Dazu wird uns eine IP-Adresse sowie Port genannt. Um einen Überblick zu erhalten, verbinden wir uns zunächst zu dem System:

rup0rt@lambda:~$ nc 95.170.83.28 3002
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 _    _  94   _________   ______   ______  _    _  _____  ______   ______
\ \  / /     | | | | | \ | |  | | | |     | |  | |  | |  | |  \ \ | |
 >|--|<      | | | | | | | |__| | | |     | |--| |  | |  | |  | | | |----
/_/  \_\     |_| |_| |_| |_|  |_| |_|____ |_|  |_| _|_|_ |_|  |_| |_|____

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Really Wanna Trade with us ? yes/no
yes

Enter Username :
1338-offbyone

Welcome 1338-offbyone

Enter your Command :

[1] balance
[2] exchange
[3] transfert
[4] restricted area
4

This Area is restrcited for accounts with 5000usd+

Wir werden hier also von der sogenannten “X94-Maschine” begrüßt, die uns zunächst fragt, ob wir wirklich Handel betreiben wollen – was wir natürlich bejahen. Anschließend wird der Benutzername angefragt, den wir beliebig wählen können. Im Hauptmenü angelangt, wird die Option “restricted area” direkt angeboten, liefert uns jedoch bei Auswahl die Mitteilung, dass der Bereich nur für Konten mit mindestens 5000 US-Dollar Verfügbar ist.

Das Ziel der Challenge ist somit erkannt: wir müssen über das System irgendwie erreichen, dass unserem Konto 5000 US-Dollar gutgeschrieben werden.

Continue reading

CodeGate 2013 Quals – Web 200

Bei dieser Challenge (web 200) wird uns eine Webseite genannt, die angegriffen werden soll um so an den Schlüssel zu gelangen. Ein erster Aufruf der URL liefert folgendes Bild:

CodeGate CTF 2013 - web 200 - website

Neben dem Quellcode der gesamten Webseite und einer Login-Möglichkeit, wird auch eine Seite zur Generierung eines One-Time-Passwords (OTP) bereit gestellt, die sich so darstellt:

CodeGate CTF 2013 - web 200 - one time password

Es wird also ein Einmal-Passwort generiert, das sich alle 20 Sekunden ändert und demnach auch nur für 20 Sekunden Gültigkeit besitzt. Darüber hinaus wird eine ID angegeben, die aus der derzeitigen IP-Adresse besteht. Aus dem Quellcode der Login-Seite (login_ok.php) lässt sich folgendes entnehmen:

if (strcmp($password, $_POST["ps"]) == 0) {
  echo "welcome, <b>".$_POST["id"]."</b><br />";
  echo "<input type='button' value='back' onclick='history.back();' />";

  if ($_POST["id"] == "127.0.0.1") {
    echo "<hr /><b>".$flag."</b><br />";
  }
}

Daraus ergibt sich das Ziel, um diese Challenge zu lösen. Der Login muss über die ID “127.0.0.1” (localhost) realisiert werden, damit der Inhalt der Flag-Datei offenbart wird. Dazu müssen wir entweder von der IP-Adresse 127.0.0.1 auf die OTP-Generierung zugreifen, was nicht möglich sein wird oder anderweitig die Passwortabfrage unter Angabe dieser ID umgehen.
Continue reading

ATAST CTF Quals 2012 –
Crack It!

Zu dieser Challenge gibt es keine weitere Aufgabenstellung, da der Name bereits selbsterklärend ist – “Crack It!”. Alles was wir erhalten, ist eine ZIP-Datei mit einem Binary.

rup0rt@lambda:~/ATAST2012$ file crackit
crackit: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x1eb85f9048b1d8dddfbc3898826aaddfe63a55ab, not stripped

… einem Linux-32bit-Programm um genau zu sein. Dieses führen wir, wie gewohnt, erst einmal aus um deren Funktionsweise überblicken zu können.

rup0rt@linux:~/ATAST2012$ ./crackit
Usage : ./crackit <password>

rup0rt@linux:~/ATAST2012$ ./crackit 12345
hahaha wrong password :p

Wie bei der vorherigen Challenge auch wird also ebenso ein Passwort benötigt um die Abfrage des Programmes passieren und somit die Lösung zur Aufgabe (Crackt It!) erhalten zu können. Erneut beginnen wir mit einer Betrachtung des Assembler-Codes durch Verwendung von “objdump”, wobei folgender Abschnitt direkt auffällt:

8048620: c7 44 24 0c 00 00 00  mov DWORD PTR [esp+0xc],0x0
8048628: c7 44 24 08 00 00 00  mov DWORD PTR [esp+0x8],0x0
8048630: c7 44 24 04 00 00 00  mov DWORD PTR [esp+0x4],0x0
8048638: c7 04 24 00 00 00 00  mov DWORD PTR [esp],0x0
804863f: e8 c4 fd ff ff        call 8048408 <ptrace@plt>
8048644: 85 c0                 test eax,eax
8048646: 79 16                 jns 804865e <main+0x6d>

Das Programm ruft die Funktion “ptrace()” auf (Zeile 5), prüft anschließend deren Rückgabewert (Zeile 6) und springt, davon abhängig, weiter in den Quellcode (Zeile 7). Mit “ptrace()” können Prozesse debuggt und gesteuert werden. Dies Funktioniert jedoch nur für einen Prozess. Sollten wir also bei Programmstart selbst einen Debugger verwenden, wird “ptrace()” fehlschlagen und das Programm beendet.

Hierbei handelt es sich hierbei also um eine Anti-Debugging-Methode, die verhindern soll, dass wir mit Programmen wie “strace” oder dem GDB das Programm bei der Ausführung beobachten. Um diesen Schutz zu umgehen verändern wir einfach den bedingten Sprung (Zeile 7) in einen unbedingten Sprung unter Verwendung eines Hex-Editors.
Continue reading

ATAST CTF Quals 2012 –
Chall2_200pts (crack1)

Wie so oft werden wir auch bei dieser Challenge (crack1) einfach nur mit den Worten

“get the password”

begrüßt. Dieses Passwort sollen wir aus einer Binärdatei extrahieren.

Sehen wir uns also als Erstes den Typ des Binarys an:

rup0rt@lambda:~$ file crack1
crack1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, BuildID[sha1]=0x4579db2a2ebe3b4e83948f7a650dc3fced1d812d, not stripped

Es handelt sich um ein einfaches Linux-32bit-Programm.

Wir führen das Programm zunächst einmal aus um uns einen Überblick über dessen Funktionsweise zu verschaffen:

creeq@linux:~/ATAST2012$ ./crack1 
Password Required : 12345 
Wrong !!!! better luck next time :D

Es wird eine Passwortabfrage durchgeführt, die uns anschließend, bei Eingabe von “12345”, mit “falsch” beantwortet wird. Unser Ziel ist es daher, den Programmcode zu untersuchen um festzustellen, wie genau das Passwort überprüft wird und so an die korrekte Lösung zu gelangen.

Dafür nutzen wir “objdump” um an den Assembler-Code des Binarys zu gelangen. Dabei fallen folgende Inhalte in der <main>-Funktion auf:

804865f:     mov    eax,DWORD PTR [esp+0x2c]
8048663:     mov    edx,DWORD PTR [esp+0x2c]
8048667:     movzx  edx,BYTE PTR [esp+edx*1+0x32]
804866c:     xor    edx,0x21

804866f:     mov    BYTE PTR [esp+eax*1+0x68],dl
8048673:     mov    eax,DWORD PTR [esp+0x2c]
8048677:     mov    DWORD PTR [esp+0x8],eax
804867b:     lea    eax,[esp+0x68]
804867f:     mov    DWORD PTR [esp+0x4],eax
8048683:     lea    eax,[esp+0x54]
8048687:     mov    DWORD PTR [esp],eax
804868a:     call   80484d0 <strncmp@plt>

804868f:     test   eax,eax
8048691:     jne    804869a <main+0x106>
8048693:     add    DWORD PTR [esp+0x2c],0x1
8048698:     jmp    80486ad <main+0x119>

In Zeile 4 wird eine XOR-Operation auf einen statischen Byte-Wert angewendet. Dies ist für gewöhnlich nur dann der Fall, wenn Daten im Programm versteckt wurden. Anschließend (Zeile 13) wird die “strcmp”-Funktion ausgeführt um den mit XOR erhaltenen Wert, mit den von uns eingegebenen Passwort-Buchstaben zu vergleichen. Zuletzt (Zeile 15) wird geprüft, ob die Zeichen überein stimmen und bei Erfolg der Buchstaben-Zähler (Zeile 17) erhöht.
Continue reading

PHDays CTF Quals 2012 –
Pwn 400

PHDays CTF 2012 - Pwn 400 - task description

Bei dieser Challenge (Pwn 400) wird ein Server mit Port genannt und der Hinweis gegeben, dass mit der Funktion “Reader()” drei Dateien ausgelesen werden könnten.

Um einen Überblick über die vor uns liegende Aufgabe zu erhalten, verbinden wir uns zunächst mit dem Server und Testen deren Funktionsmöglichkeiten aus:

rup0rt@lambda:~/PHDays2012$ nc ctf.phdays.com 1831
>>> Reader
<function Reader at 0x86a28ec>

>>> Reader("log.1")
<Some ASCII here...>

>>> Reader("flag.txt")
ValueError : You can't read that shit!

Es handelt sich also um eine Python-Schnittstelle (was die drei “>>>” andeuten). Die Funktion “Reader()” listet uns unter Angabe eines Dateinamens deren Inhalt auf. Dabei können jedoch nur die drei Dateinamen angegeben werden, die in der Aufgabenbeschreibung genannt werden. Andere Namen führen zu einer Fehlermeldung.

Um uns nun weiter voran zu arbeiten, untersuchen wir zunächst die Python-Umgebung und die uns zur Verfügung stehenden Funktionen mit der Methode “dir()”:

>>> dir()
['Reader', '__builtins__', '__doc__', '__file__', '__name__',
'__package__', 'a', 'e', 'inp']

>>> dir(__file__)
['__add__', '__class__', '__contains__', '__delattr__', '__doc__',
'__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__',
'__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__',
'__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__',
'_formatter_field_name_split', '_formatter_parser', 'capitalize',
'center', 'count', 'decode', 'encode', 'endswith', 'expandtabs',
'find', 'format', 'index', 'isalnum', 'isalpha', 'isdigit', 'islower',
'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip',
'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition',
'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip',
'swapcase', 'title', 'translate', 'upper', 'zfill']

Wir sehen, dass uns neben der Funktion “Reader()” nicht viel weiteres bereitgestellt wird und auch aus der “file”-Bibliothek die für uns interessanten Funktionen, wie beispielsweise “open()” entfernt wurden. Wir müssen also einen anderen Weg finden, um an die von uns gewünschten Methoden zu gelangen.
Continue reading

PHDays CTF Quals 2012 –
Pwn 300

PHDays CTF 2012 - Pwn 300 - task description

Neben einigen zusätzlichen Informationen wird uns bei dieser Challenge (Pwn 300) die URL eines Webservers genannt, mit dem wir angeblich die Kontrolle über die Stadt South Park erlangen können.

Der Besuch der Webseite liefert uns folgendes Ergebnis:

PHDays CTF 2012 - Pwn 300 - website

Über die Oberfläche haben wir die Möglichkeit ausgewählte Bürger von South Park zu töten, einzusperren oder in den Bankrott zu treiben. Das Ausführen der Handlung führt immer zu einer Bestätigung, dass die Aktion vollzogen wurde. Eine genauere Betrachtung des Quellcodes der Webseite offenbart uns:

PHDays CTF 2012 - Pwn 300 - source code

Wir finden also heraus, wo sich der Schlüssel und somit das Ziel der Challenge befindet, nämlich in der Datei “/etc/passwd”. Über diesen Hinweis wissen nun also auch, dass unser Weg uns irgendwie auf das lokale Dateisystem führen muss – also zum Beispiel über einen “Directory Traversal” oder das Ausnutzes der Webserver-Skripte.
Continue reading

PHDays CTF Quals 2012 –
Misc 400

Für diese interessante Aufgabe (Misc 400) gab es nicht viele Informationen:

PHDays CTF 2012 - Misc 400 - task description

Als erstes bietet es sich an, sich mit Hilfe von netcat einen Überblick über die Aufgabe zu verschaffen. Nachdem man sich mit ctf.phdays.com:1165 verbunden hat, bekommt man folgende Ausgabe:

Hi there! Stupid CAPTCHA: enter your name, user61758

Hier ist verlangt, user61758 als Antowort zurück zu geben, da sich sonst das Programm beendet. Jetzt muss man eine gewisse Zeit warten, bis sich der Server wieder meldet. Ob diese Wartezeit beabsichtigt oder der Server einfach nur ausgelastet war, weiss ich leider nicht.

Der Server antwortet mit einem Labyrinth, das aus 50 solcher Ebenen besteht:

PHDays CTF 2012 - Misc 400 - maze

Danach fordert uns der Server auf:

“Find a path between (…, …, …) and (…, …, …)”

Die Aufgabe bestand also darin, einen Pfad von Punkt A nach Punkt B zu finden. Dafür habe ich ein Skript geschrieben, welches das Labyrinth parst und dann auch löst.
Continue reading

PHDays CTF Quals 2012 –
Misc 200

PHDays CTF 2012 - Misc 200 - task description

Diese Challenge (Misc 200) hat das Ziel, das “braune Quadrat” näher zu untersuchen um darin wohlmöglich weitere Informationen zu finden. Zusätzlich zu dieser Aufgabenbeschreibung erhalten wir eine ZIP-Datei.

Als erstes entpacken wir das Archiv und stellen fest, dass ein GIF-Bild enthalten ist, das sich wie folgt darstellt:

PHDays CTF 2012 - Misc 200 - original GIF image

Zu unserer Überraschung finden wir kein “braunes Quadrat”, sondern nur ein schwarzes. Der Text aus der Aufgabenbeschreibung könnte jedoch ein Hinweis sein, dass Farben bei der Lösung dieser Challenge eine Rolle spielen.

Im Vergleich zu anderen Bildformaten unterscheiden sich GIF-Dateien unter anderem dadurch, dass nicht jeder Pixel für sich eine Farbe erhält, sondern jedem Pixel eine Farbe aus einer vorher definierten Farbtabelle (einer sogenannten colormap) zugeordnet wird.

Wir könnten nun, wie allgemein üblich, das Werkzeug Stegsolve verwenden um einige Untersuchungen an der GIF-Datei durchzuführen und dabei auch die Farbtabellen überprüfen. An dieser Stelle möchte ich jedoch zeigen, wie man auch mit dem Programm GIMP zum Ziel kommen kann.
Continue reading

PoliCTF 2012 – Bin-Pwn 100

Für die “Bin-Pwn 100” Challenge wird uns ein Archiv bereit gestellt sowie die recht simple Aufgabenbeschreibung:

Retrieve the key!

genannt.

Wir arbeiten uns also langsam vor, entpacken als erstes die Datei und sehen uns den Inhalt genauer an:

rup0rt@linux:~/PoliCTF2012$ tar xfvz umad.tar.gz 
jpeg/
jpeg/jconfig.h
jpeg/jpeglib.h
jpeg/jmorecfg.h
jpeg/jerror.h
libjpeg.a
Makefile
umad.cpp

Im Archiv befinden sich Header-Dateien der JPEG-Bibliothek, die statisch kompilierte JPEG-Bibliothek selbst (libjpeg.a) sowie eine C++-Quellcodedatei “umad.cpp” und deren Makefile. Wir kompilieren zunächst den Quellcode mit Hilfe der “Makefile” um so das Verhalten abzuschätzen.

rup0rt@linux:~/PoliCTF2012$ make
g++ -o umad umad.cpp -L. -ljpeg

rup0rt@linux:~/PoliCTF2012$ ./umad 
Done

rup0rt@linux:~/PoliCTF2012$ ls -lh
drwxr-xr-x 2 creeq creeq 4.0K May 26 00:23 jpeg
-rw-r--r-- 1 creeq creeq 1.4M Aug  8 16:11 libjpeg.a
-rw-r--r-- 1 creeq creeq   56 May 26 00:30 Makefile
-rw-r--r-- 1 creeq creeq  13K Nov 21 17:15 out.jpeg
-rwxr-xr-x 1 creeq creeq 422K Nov 21 17:15 umad
-rw-r--r-- 1 creeq creeq 3.3K May 26 10:51 umad.cpp

Anhand der Kompilierungszeile der Makefile erkennen wir, dass sowohl die JPEG-Header-Dateien (-l) als auch die statische JPEG-Library (-L) tatsächlich für die Kompilierung verwendet werden. Die Ausführung des erstellten Programmes “umad” liefert eine weitere Datei “out.jpeg”, die wir uns als nächstes ansehen.

PoliCTF 2012 - Bin-Pwn 100 - library image output

Bis auf die Frage “U MAD ?” ist an diesem Bild nichts besonderes erkennbar. Auch nach binärer Betrachtung scheint es sich um ein herkömmliches JPEG-Bild zu handeln. Das Betrachten des C++-Quellcodes sowie der Header-Dateien lässt uns ebenfalls keine besonderen Auffälligkeiten vorfinden.
Continue reading