plaidCTF 2013 – hypercomputer 1

plaidCTF 2013 - Hypercomputer 1 - Task description

Diese Challenge (hypercomputer 1) erinnert nicht nur vom Namen her an die Supercomputer-Challenge aus dem vorjährigen plaidCTF 2012. Auch die Aufgabenstellung selbst weist bereits auf diese Challenge hin und vermerkt, dass es diesmal einfacher sein soll. Neben der Beschreiben erhalten wir die IP-Adresse eines SSH-Servers von dem wir uns dieses Binary kopieren.

Eine erste Untersuchung zeigt uns…

root@linux64:~/Plaid2013# file hypercomputer 
hypercomputer: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x0b7c8d904831417f536c59b59fdecfc738136536, stripped

…, dass es sich um ein 64bit Linux-Binary handelt, das beim normalen, testweisen Ausführen diese Ausgabe liefert:

root@linux64:~/Plaid2013# ./hypercomputer 
...Welcome to Hypercomputer!...
...This could take a very long time...

Es ist jedoch nicht so, dass dieser Text sofort erscheint – vielmehr dauert es mehrere Sekunden, was darauf schließen lässt, wie lange die gesamte Berechnung und Ausgabe der Flagge dauern könnte. Im letzten Jahr musste der Assembler-Code per Hand untersucht und optimiert werden, also sehen wir uns auch diesmal das Programm im Debugger an.

root@linux64:~/Plaid2013# gdb ./hypercomputer 
GNU gdb (GDB) 7.4.1-debian
Reading symbols from /root/Plaid2013/hypercomputer...(no debugging symbols found)...done.
(gdb) run
Starting program: /root/Plaid2013/hypercomputer 
...Welcome to Hypercomputer!...
...This could take a very long time...
^C
Program received signal SIGINT, Interrupt.
0x00007ffff787cbc0 in nanosleep () from /lib/x86_64-linux-gnu/libc.so.6

Durch die Unterbrechung der Programmausführung mit CTRL+C sehen wir, dass die Ausführung in der Funktion nanosleep(), die eine bestimmte Zeit abwartet, angehalten wurde. Dies erinnert schon an das Vorjahr, in dem der Programmablauf ebenfalls durch solche Funktionen künstlich verzögert wurde.
Continue reading

plaidCTF 2013 – three eyed fish

plaidCTF 2013 - three eyed fish - task description

Diese Challenge (three eyed fish) verrät zunächst nicht viel über das eigentliche Ziel. Nur eine Binärdatei wird zum Download bereit gestellt und der legendäre “Ban Hammer” als Belohnung für dieses Quest versprochen 😉

rup0rt@linux64:~/Plaid2013# file three_eyed_fish
three_eyed_fish: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped

Eine erste Untersuchung ergibt, dass es sich um ein 64bit Linux-Binary handelt. Um das normale Verhalten des Programmes zu testen, starten wir die Datei direkt.

rup0rt@linux64:~/Plaid2013# ./three_eyed_fish

Eine Ausgabe erzeugt das Programm nach dem Starten nicht. Beendet wird es jedoch auch nicht sofort – es muss also eine andere Funktion geben. Nach weiterer Betrachtung stellt man fest, dass immer nach dem Starten die Umschalt-LED des Keyboards aufleuchtet und zu blinken beginnt.

Die LED blinkt jedoch nicht einheitlich oder nach einem festen Muster. Alles was erkennbar ist, dass regelmäßig größere Pausen zwischen den Sequenzen liegen. Es könnte sich demnach um eine Art Morse-Code handeln, wobei die Pausen die Trennung zwischen den einzelnen Buchstaben darstellt.
Continue reading

plaidCTF 2013 – charsheet

plaidCTF 2013 - charsheet - task description

Ziel dieser Challenge (charsheet) ist es, an den Charakter-Namen des Administrators einer Webseite zu gelangen. Der Aufgabenstellung zur Folge spielt dieser mit dem Auftraggeber zusammen in einer Dungeons & Dragons (D&D) – Kampange.

Zuerst sehen wir uns die angegebene Webseite im Browser etwas genauer an. Dabei finden wir ein System vor, mit dem Charakterbögen von Charakteren aus Pen-and-Paper Rollenspielen verwaltet und gepflegt werden können.

Neben der Möglichkeit sich auf der Seite zu registrieren und – nach Login – neue Charaktere anzulegen, kann auch nach bereits hinterlegten Charakteren und Kampagnen gesucht werden. Ohne zu zögern testen wir die Suchfelder direkt auf die Möglichkeit von SQL-Injections, indem ein Hochkomma ‘ übergeben wird.

plaidCTF 2013 - charsheet - sql injection check

Tatsächlich führt diese Anfrage direkt zu einem serverseitigen Fehler und wir erhalten folgende Ausgabe:

plaidCTF 2013 - charsheet - sql query error message
Continue reading

ForbiddenBITS CTF 2013 – Old

ForbiddenBITS CTF 2013 - old - task description

Wie gewohnt ist Weniger auch diesmal Mehr und wir erhalten als Aufgabe (old) nur einen Kommentar, dass es sich um einen “scheinbaren binären Auftrag” handelt. Zusätzlich wird eine Datei zum Download bereit gestellt.

Die erste Betrachtung mit dem Werkzeug “file” um festzustellen, um was für einen Typ von Datei es sich in Wirklichkeit handelt, liefert:

rup0rt@lambda:~/FB2013/old$ file bin.bin
bin.bin: x86 boot sector, code offset 0x6e

Uns liegt also ein bootbares Image vor, das durch Übergabe an einen Emulator, wie QEMU gestartet werden könnte. Da die Datei allerdings nur 512 Bytes groß ist und das simple Starten per Emulator ohnehin nicht die Flagge liefern wird, sehen wir uns direkt etwas genauer an. Zunächst prüfen wir, welche Zeichenketten enthalten sind:

rup0rt@lambda:~/FB2013/old$ strings bin.bin
Password: 
,jNice, 16bits world is nice :D. Validate using that password :)
No :(, try again.

Offensichtlich scheint eine Passwortabfrage implementiert zu sein, die abhängig von der korrekten Eingabe eine positive oder negative Rückmeldung erzeugt. Unser Ziel zur Lösung der Challenge wird es also sein, an genau dieses Passwort zu gelangen.
Continue reading

ForbiddenBITS CTF 2013 – Fantastic

ForbiddenBITS CTF 2013 - fantastic - task description

Wieder eine sehr spartanische Aufgabenbeschreibung für diese Challenge (Fantastic). Neben dem Hinweis “ein paar Jahre zurück zu gehen”, wird noch dieses Bild bereit gestellt, das mit dem Namen “wars.png” bezeichnet ist:

ForbiddenBITS CTF 2013 - fantastic - wars

Dies sieht nach irgendeiner kryptischen Sprache aus. Mein erster Gedanke ging in die Richtung, eine Schriftart zu finden, die jedem dieser Zeichen einen Buchstaben zuordnen lässt – ähnlich der bekannten Windows – Webdings – Fonts. Die Suche im Internet nach Schriftarten, die dieser ähnlich sehen, verlief auf die schnelle jedoch ohne Erfolg.

Also widmen wir uns als Nächstes die Bezeichnung der Challenge “fantastic” und des Bildes “wars”. Die Google-Bildersuche nach “wars font” liefert relativ zu Beginn einen sehr interessanten Treffer mit dem Titel “Aurebesh – the alphabet of the Star Wars universe“.

ForbiddenBITS CTF 2013 - fantastic - Star Wars aurek besh alphabet

Demnach handelt es sich bei “Aurebesh” um die galaktische Standardsprache, die im “STAR WARS”-Universum gesprochen bzw. geschrieben wird. Die Zeichen sind mit dem gegebenen Bild identisch und müssen nur noch Übersetzt werden.

ForbiddenBITS CTF 2013 - fantastic - solution

Die Lösung lautet somit “STARWARSISCOOL“.

ForbiddenBITS CTF 2013 – X95

ForbiddenBITS CTF 2013 - X95 - task description

Zum Lösen dieser Challenge (X95) muss der Aufgabenstellung nach ein Passwort angegriffen und anschließend offensichtlich auf dem Zielsystem unter Port 3002 eingegeben werden. Zusätzlich erhalten wir den Quellcode des Dienstes, der auf dem System lauscht.
Bevor wir uns überhaupt mit dem Server verbinden, sehen wir uns das mitgelieferte Perl-Script an. Folgende Funktionsweise ist darin implementiert:

#!/usr/bin/perl
use IO::Socket;
my $welcome_msg = <<"EOT";
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 _    _  95   _________   ______   ______  _    _  _____  ______   ______
\\ \\  / /     | | | | | \\ | |  | | | |     | |  | |  | |  | |  \\ \\ | |
 >|--|<      | | | | | | | |__| | | |     | |--| |  | |  | |  | | | |----
/_/  \\_\\     |_| |_| |_| |_|  |_| |_|____ |_|  |_| _|_|_ |_|  |_| |_|____

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

EOT

$|=1;
$lis = IO::Socket::INET->new (
  LocalPort =gt; 3002,
  Type =gt; SOCK_STREAM,
  Reuse=> 1,
  Listen => 1000
) or die "Error #1 $@\n";

Das Skript definiert zunächst eine Willkommens-Nachricht und öffnet einen Socket, der auf Port 3002 lauscht.

while( $c = $lis->accept() ) {
  if ($pid=fork) {
    next;
  } else {
    unless (defined $pid) { die "Threads problem $! \n"; }
    $flag="";
    print $c $welcome_msg."\n\n";

    [... siehe nächster Auszug ...]

  }
   exit;
}
close $lis;

Anschließend wird die eigentliche Hauptschleife erreicht, die für jede Verbindung einen neuen Thread erstellt, die Variable $flag defininiert – die hier, anders auf dem Zielsystem laufenden Dienst, leer ist – und die Willkommensnachricht ausgibt. Was passiert nun genau, wenn ein Client sich zum Server verbindet?
Continue reading

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