Secuinside CTF 2013 – Secure Web Revenge

SecuInside 2013 CTF - Secure Web Revenge - task description

Diese Challenge (Secure Web Revenge) deutet vom Namen schon sehr stark auf die “Secure Web” – Challenge dieses Capture the Flags hin. Zuerst sehen wir wieder die Webseite selbst an.

SecuInside 2013 CTF - Secure Web Revenge - Upload Website

Auch die Optik der Webseite erinnert an die vorherige Challenge. Doch unter dem “Submit Query” – Button ist ein zusätzliches Feld für den “privaten Schlüssel” eingefügt worden. Ebenso wird der Quellcode wieder mitgeliefert, in dem wir nun die Funktion des “Schlüssels” in Erfahrung bringen wollen:

<?php
 Continue reading 

Secuinside CTF 2013 – Secure Web

SecuInside 2013 CTF - secure web - task description

Zu dieser Challenge (secure web) erhalten wir ein binäres Apache-Modul sowie eine Webseite genannt. Zuerst rufen wir die Webseite auf um uns einen Überblick zu verschaffen und das eigentliche Ziel der Challenge zu konkretisieren.

SecuInside 2013 CTF - secure web - upload website

Wir finden eine Seite vor, auf der Mediendateien hochgeladen werden können. Die Information “keine Skriptdateien” deutet bereits darauf hin, dass wir so etwas versuchen könnten ;-). Zusätzlich erhalten wir den Quellcode der Webseite, den wir uns zunächst genauer ansehen:

<?php

$uploaddir = '/var/www/uploads/' . md5($_SERVER["REMOTE_ADDR"]) . '/';

if(is_dir($uploaddir) == false)
  mkdir($uploaddir);

$uploadfile = $uploaddir . basename($_FILES['data']['name']);

if (move_uploaded_file($_FILES['data']['tmp_name'], $uploadfile)) {
  echo "Success\n";
} else {
  print "failed\n";
}

?>

Continue reading

BaltCTF 2013 – Gallery

BaltCTF 2013 - Gallery - task description

Bei der “Gallery” – Challenge erhalten wir nur eine Webseite und müssen anschließend selbst heraus finden, wo und wie wir an die Flagge gelangen. Das direkte Aufrufen der URL liefert dieses Ergebnis:

BaltCTF 2013 - Gallery - Website

Es handelt sich um eine Seite, auf der wir Bilder hochladen und – in einer Gallerie – speichern können. Sobald wir den Link zum Hochladen eines Bildes anklicken, erscheint das entsprechende Formular:

BaltCTF 2013 - Gallery - Upload pictures form

Wir werden darauf hingewiesen, dass nur Dateien mit den Endungen “.gif” und “.png” erlaubt sind. Es drängt sich die Frage auf, ob vielleicht auch andere Dateiendungen, zum Beispiel “.php”, hochgeladen werden können. Damit wäre es möglich, eigene Skripte und damit Kommandos auf dem Server auszuführen und die Flagge zu suchen.
Continue reading

VolgaCTF 2013 – web 100

VolgaCTF 2013 - Web 100 - task description

Die Web 100 – Challenge des VolgaCTF erklärt zunächst einmal die Funktion der verlinkten Webseite auf http://10.10.0.5. Demnach handelt es sich um ein Portal um Mitteilungen zu platzieren, wobeo den VIP-Benutzern besondere Rechte zuteil werden. Ein Blick auf die Webseite selbst zeigt uns:

VolgaCTF 2013 - Web 100 - Space diary website

Die Seite “Space Diary”, die leider nur auf russisch angeboten wurde, ermöglicht es uns, sich im oberen Bereich mit Benutzername und Passwort anzumelden. Des Weiteren ist unten erkennbar, dass VIP-Benutzer bereits Nachrichten hinterlassen haben.
Continue reading

Nuit du Hack 2013 Quals – huge.js

Nuit du Hack 2013 - huge.js - task website

Beim Aufruf der Webseite der “huge.js” – Challenge erschien nach unwesentlicher aber bemerkbarer Wartezeit dieses Bild mit einer eingeblendeten Inputbox. Der Quellcode erstaunlich einfach gestrickt:

<body>
  <div id="panel">
  </div>
  <script src="huge.js" language="javascript"></script>
</body>

Klarer Fall, erstmal die Ressource huge.js runterladen … erster Schock – 25 MB komprimiertes Javascript 🙂 Na danke!

Nuit du Hack 2013 - huge.js - obfuscated javascript code

Dateianalyse via “SharpEye-Methode” ergab, dass es sich um ein paar wenige Byte JS-Code, dann 99,9999% Hexkrams und ein paar schließende Klammern am Ende der Datei handelte.
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

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

CScamp 2012 Quals – Web 300

CScamp CTF 2012 - Web 300 - puzzle image website

Bei dieser Challenge (Web 300) ist das eigentliche Ziel sehr schnell klar. Es existiert ein Bild, deren Teile verwürfelt sind, und die von uns innerhalb von zwei Sekunden in die richtige Reihenfolge gebracht werden müssen. Da es sehr schwer werden wird, das Bild innerhalb von zwei Sekunden per Hand zu sortieren und das Ergebnis einzugeben, bleibt uns nur der Weg, eine automatisierte Lösung per Skript zu entwickeln.

Dabei wird es erforderlich sein, jedes der zwölf Quadrate eindeutig zu identifizieren. Zur Umsetzung habe ich mir daher überlegt, aus jedem Quadrat die Farben (Rot – Grün – Blau) von vier Pixeln aus den Eckbereichen zu entnehmen und darüber eine Art “Fingerabdruck” jedes Quadrates zu erhalten – hier vereinfacht dargestellt ;-).

CScamp CTF 2012 - Web 300 - identifying puzzle pieces by pixel

Bei der Umsetzung hat sich jedoch das Problem ergeben, dass – wohlmöglich durch die jeweils erneute JPEG-Umwandlung – die Farben der Pixel sich immer (minimal) unterscheiden. Als Umweg werden wir daher nur festhalten, ob sich viel oder wenig Rot-/Grün-/Blau-Töne in den Pixeln befinden und so eine eindeute Zuordnung der Quadrate realisieren.

Um den Server nicht unnötig mit Anfragen zu beschäftigen, nutzen wir hier zwei Skripte. Ein Bash-Skript zur Kommunikation mit dem Server sowie ein Python-Skript zur Sortierung des Bildes. Somit kann die Sortierung an ein- und demselben Bild wiederholt durchgeführt werden um die korrekte Funktion des Sortieralgorithmus zu testen.
Continue reading

Hack.Lu CTF 2012 – Spambot

Hack.Lu CTF 2012 - Spambot - task description

Die Spambot – Challenge berichtet von einer Kontroll-Oberfläche, die verwendet wird um automatisiert (SPAM-)Nachrichten in Gästebücher oder andere Online-Plattformen einzubringen. Ziel soll es daher sein, die Spambots “aufzuhalten”.

Zuerst verschaffen wir uns wie gewohnt einen Überblick, indem wir die bereit gestellte Oberfläche ausgiebig erkunden und damit experimentieren. Sie stellt sich folgendermaßen dar:

Hack.Lu CTF 2012 - Spambot - bot control website

Es handelt sich um ein einziges Formular, dem eine URL übergeben werden kann. Zusätzlich wird die Webseite “/guestbook/” genannt, die verwendet werden kann, um das Senden der SPAM-Nachrichten zu testen. Diese Webseite sehen wir uns auch einmal kurz an.
Continue reading

Hack.Lu CTF 2012 –
Zombie AV Part 2

Im weiteren Verlauf des Capture the Flags wurde die Challenge “Zombie AV” abgeändert, wohlmöglich um sie schwerer oder leichter zu machen. Die vorher vorgestelte Lösung funktioniert ab diesem Zeitpunkt nicht mehr.

Grund dafür ist eine Änderung im Quellcode der Datei “elfparsing.php”, die sich folgerndermaßen darstellt:

function getEntryPoint($contents) { 
  global $readelfpath; 
  global $objdumppath;     

  $output=shell_exec($readelfpath.' -h '.$contents);  

  $data = preg_match( '/0x[a-fA-F0-9]{5,8}/', $output,$matches); 
  //$retValue=(hexdec($matches[0]) & 4294967288); 
  $retValue=hexdec($matches[0]); 
  return ($retValue ); 
}

Zeile 8 wurde auskommentiert(!!), was dazu führt, dass der Entry point und der Beginn der “Zombie-Opcodes” vom Scanner nun einheitlich betrachtet werden. Wir müssen also eine andere Lösung finden.

Die Schwachstelle ist jedoch immernoch die obige “getEntryPoint”-Funktion, da weiterhin einfach nur die erstbeste hexadezimale Speicheradresse der Ausgabe des Tools “readelf -h” per regulärem Ausdruck zur Überprüfung der Opcodes herangezogen wird (Zeile 7).

Wenn wir es also schaffen, eine weitere Speicheradresse vor den Entry Point in die Ausgabe von “readelf” zu schleusen, wird der “Zombie-Opcode” an dieser Adresse vom Scanner gesucht werden. Wir sehen uns dazu die Ausgabe von “readelf -h” etwas genauer an:

rup0rt@lambda:~$ readelf -h virus2
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           Intel 80386
  Version:                           0x1
  Entry point address:               0x8048062
  Start of program headers:          52 (bytes into file)
  Start of section headers:          144 (bytes into file)
  Flags:                             0x0
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         1
  Size of section headers:           40 (bytes)
  Number of section headers:         5
  Section header string table index: 2

Da die Adresse oberhalb des eigentlichen Entry Points liegen muss, scheint auf den ersten Blick nur das Feld “Version” zur Manipulation geeignet, da die anderen Felder Einfluss auf die Interpretation als 32bit ELF-Binary, und so wohlmöglich auf deren Ausführung, zu haben scheinen.
Continue reading