HTB – Nest
- Scan
- SMB TempUser
- Config Hash und VB Project
- C.Smith & Streams
- Reporting Service
- DEBUG MODE & Reverse .NET EXE
- Root
Nest ist eine als „einfach“ gekennzeichnete Windows Hack the Box, hat jedoch ein paar Besonderheiten und es sind doch ein paar mehr Dinge zu tun bis zum Ziel, daher würde ich sie eher als „medium“ einstufen. Es geht darum, dass man über SMB Shares, zuerst Zugangsdaten eines Users findet und anschließend anhand einer Config, ein Hash und ein weiteres Verzeichnis enteckt. In diesem liegt ein .NET Projekt, welches man so umschreiben kann, dass es einem das Passwort im Klartext ausgibt. Mit dem neuen Kennwort kommt man nun an einen weiteren SMB Share und findet dort eine Textdatei, welche auf den ersten Blick leer erscheint. Man findet aber dennoch ein dort verstecktes Kennwort mit welchem man sich an einem speziellen Service erweiterte Rechte beschaffen kann. Dort findet man eine weitere Config mit einem Hash sowie eine EXE welche man mittels reverse Engineering dazu bringt, einem das korrekte Passwort auszugeben.
Scan
Ich fange mit dem Scan nach offenen Ports an, nmap findet zwei offene Ports
Nmap 7.80 scan initiated Sun Apr 5 01:29:29 2020 as: nmap -Pn -p- -oA allPorts.nmap 10.10.10.178 Nmap scan report for 10.10.10.178 Host is up (0.028s latency). Not shown: 65533 filtered ports PORT STATE SERVICE 445/tcp open microsoft-ds 4386/tcp open unknown Nmap done at Sun Apr 5 01:31:13 2020 -- 1 IP address (1 host up) scanned in 104.66 seconds
gegen welche ich -sV und – sC laufen lasse
nmap -Pn -p-445,4386 -sV -sC -oA targetPorts.nmap 10.10.10.178
Ergebnis, zu 445 findet NMAP keine weiteren Infos, zu 4386 ein paar Verfügbare Befehle (dazu später mehr)
Nmap 7.80 scan initiated Sun Apr 5 01:31:47 2020 as: nmap -Pn -p-445,4386 -sV -sC -oA targetPorts.nmap 10.10.10.178 Nmap scan report for 10.10.10.178 Host is up (0.026s latency). Not shown: 444 filtered ports PORT STATE SERVICE VERSION 445/tcp open microsoft-ds? 4386/tcp open unknown | fingerprint-strings: | DNSStatusRequestTCP, DNSVersionBindReqTCP, Kerberos, LANDesk-RC, LDAPBindReq, LDAPSearchReq, LPDString, NULL, RPCCheck, SMBProgNeg, SSLSessionReq, TLSSessionReq, TerminalServer, TerminalServerCookie, X11Probe: | Reporting Service V1.2 | FourOhFourRequest, GenericLines, GetRequest, HTTPOptions, RTSPRequest, SIPOptions: | Reporting Service V1.2 | Unrecognised command | Help: | Reporting Service V1.2 | This service allows users to run queries against databases using the legacy HQK format | AVAILABLE COMMANDS --- | LIST | SETDIR | RUNQUERY | DEBUG |_ HELP
Ich beginne mit der Prüfung des SMB Shares
smbclient -L 10.10.10.178 -N
Eine Anmeldung ohne Benutzer (anonym) scheint zu funktionieren
Ich prüfe ob ich auf ein Verzeichnis Schreibrechte habe
smbmap -H 10.10.10.178 -u ' '
Bekomme aber nur ReadOnly Verzeichnisse
Ich fange mit dem Data Verzeichnis an und Verbinde mich per
smbclient \\\\10.10.10.178\\Data -N
Mit den Befehlen
recures on prombt off mget*
lade ich mir alles worauf ich Zugriff habe runter
das Gleiche mache ich mit dem User Verzeichnis
Ich hab keinen Zugriff auf die Ordner aber die Usernamen sind schon mal interessant, daher hole ich mir diese uns speichere sie in einer Textdatei ab
smbclient \\\\10.10.10.178\\Users -N -c 'dir' > users.txt
Ich lösche die ersten beiden Zeilen aus der Textdatei und lass mir nur die ersten Spalte ausgeben
cat users.txt | sed 's/|/ /' | awk '{print $1}'
Damit hab ich schon mal eine Liste von Usernamen.
TempUser
Ich schau mir die aus dem Data Verzeichnis heruntergeladenen Dateien an und finde in dem Verzeichnis
data\Shared\Templates\HR
eine Welcome Email.txt, welche einen Usernamen und Passwort enthält.
We would like to extend a warm welcome to our newest member of staff, You will find your home folder in the following location: \HTB-NEST\Users\ If you have any issues accessing specific services or workstations, please inform the IT department and use the credentials below until all systems have been set up for you. Username: TempUser Password: <unkenntlich> Thank you HR
Mit dem Usernamen und Passwort schaue ich über SMB ob ich nun mehr machen kann
smbmap -H 10.10.10.178 -u TempUser -p unkenntlich
Tatsächlich sehen ich nun die Freigabe „Secure$“, welche ich zuvor noch nicht gesehen hab.
Im Verzeichnis „Users\TempUsers“ findet man übrigens nur eine leere Textdatei.
Ich verbinde mich also nach Secure$ und schaue worauf ich Zugriff habe, was tatsächlich nicht viel ist (um genau zu sein, gar nix)
Hier kommen wir also nicht weiter, ich verbinde mich mit dem TempUser auf das Verzeichnis „data“ und lasse mir hier alle Verzeichnisse und Dateien in eine Datei ausgeben
smbclient \\10.10.10.178\data\ -U TempUser geheim -c "recurs on; dir" > dir.txt
Anschließend bereinige ich das Ergebnis noch (lösche alle Zeilen welche mit einem Punkt oder zwei Punkten anfangen und alle Leerzeilen) in vim
:g/^\ \.\| \.\./d :g/^$/d
Im Ergebnis kann man sehen, dass uns nun weitere Verzeichnisse und Dateien zur Verfügung stehen
Config Hash und VB Project
Ich lade mir alle Dateien wieder mittels SMB runter und durchsuche diese nach einem Passwort
grep -rniw '.' -e 'password'
Neben der Welcome EMail finde ich ein neues Kennwort (hash) für den User c.smith in der RU_config.xml
Der Hash lässt sich jedoch nicht ohne weiteres von JohnTheRipper knacken, beim manuellen durchschauen der restlichen Dateien finde ich einen interessanten Eintrag in der config von notepad++
Ich verbinde mich erneut auf den Secure$ Share und finde heraus das ich in das Verzeichnis IT/Carl wechsel kann.
Dort finden wir weitere Ordner und ein VB Projekt, welches ich runterlade, auf meine Windows Maschine kopiere und mit Visual Studio öffne.
Dazu kopiere ich mir noch die RU_config.xml in das Debug Verzeichnis des Projekts
In das Projekt füge ich folgen zwei Zeilen Code ein, damit mir das Kennwort in der Console ausgegeben wird
Console.WriteLine(test.Password) Console.ReadKey()
Somit haben wir das Kennwort vom user c.smith als Klartext.
C.Smith & Streams
Das SMB spiel geht von neuem los mit dem User c.smith, Schreibrechte haben ich immer noch auf kein Verzeichnis, jedoch finde unter der Freigabe „Users\c.smith“ ein paar interessante Dateien.
Die user.txt gibt uns die erste Flag.
Im Ordner „HQK Reporting“ finde ich eine Textdatei welche vielversprechend klingt. Den Ordner und Inhalt „AD Integration Module“ lade ich mir auch schon mal runter (brauchen wir noch für später).
Die Datei scheint aber mit 0Kb leer zu sein, ich lass mir die Attribute ausgeben und finde eine Besonderheit
Die Datei enthält einen NTFS Stream mit dem Namen „Password“.
Mit
get "Debug Mode Password.txt:Password"
Kann ich mir den Stream aus der Datei herunterladen und ansehen
Wir haben nun ein Debug Password.
Unter Windows gibt es hierfür übrigens das Tool „streams.exe“ von Sysinternals. Mithilfe von „more“ kann man den Stream dann auch auslesen.
Reporting Service
Ganz am Anfang hat NMAP neben dem Port 445 auch noch den Port 4386 gefunden. Ich versuche mich per NC darauf zu verbinden und bekomme eine Shell. Vorab: Es handelt sich hier um eine eingeschränkte Shell mit welcher nur eine Handvoll Befehle ausgeführt werden können, man sich jedoch frei auf der Maschine bewegen kann (solange man die benötigten Rechte hat).
Ich verbinde mich also auf die Shell per Netcat.
Leider bekomme ich für keinen Befehl ein Feedback. nmap hat aber ein Feedback bekommen.
| Reporting Service V1.2
| This service allows users to run queries against databases using the legacy HQK format
| AVAILABLE COMMANDS ---
| LIST
| SETDIR
| RUNQUERY
| DEBUG
|_ HELP
Also schau ich mir per Wireshark an was NMAP anders macht als netcat.
nmap -p 4386 -Pn -sV -sC 10.10.10.178
Ich suche nach der Zeichenkette HELP
und finde folgendes TCP Packet
Mit folgendem Befehl, kann ich mir einen String in HEX umwandel.
echo -n "HELP" | od -A n -t x1
Ich sehe also, dass Wireshark „HELP“ als HEX sendet. Soweit so gut.
Was sendet nun also Netcat wenn ich HELP eingebe?
Ich sehe die gleiche HEX abfolge, einen relevanten Unterschied gibt es jedoch zwischen dem HEX von Netcat und NMAP und das sind die Zeichen, welche danach gesendet werden. Zum Vergleich
NMAP
Netcat
Wir sehen also das NMAP vor dem 0a
noch ein 0d
sendet. Auf der Seite: http://man7.org/linux/man-pages/man7/ascii.7.html
kann man das entsprechende Zeichen hierfür rausfinden und wir sehen das 0D für einen CR (Carriage return) steht.
Das heißt NMAP senden einen CR
nach dem HELP
Befehl und zwar noch vor dem 0a
(new line). Mit dem Befehl
echo -e '\x48''\x45''\x4c''\x50''\x0d' | nc -C 10.10.10.178 4386
Können wir eine HEX Zeichenkette in einen String umwandeln und nach NC Pipen. Die Ausgabe sagt, dass es klappt und wir bekommen ein Feedback
Auch in Wireshark sehen wir nun, dass ein 0d
gesendet wird
Das gleiche Ergebnis erreicht man übrigens auch über
echo -e "HELP\r" | nc 10.10.10.178 4386
Denn -e
erlaubt die Interpretation von Backslahes
https://www.computerhope.com/unix/uecho.htm
Enable interpretation of backslash escape sequences (see below for a list of these).
Mit Hilfe eines kleine Bash Scriptes kann man so, einfach die Eingabe ergänzen und nach NC schicken
input=$1;
echo "Input: $input";
myString=echo -e "$input\r"
echo "Output: $myString"
echo "$myString" | nc -q 1 10.10.10.178 4386;
Nachdem wir aber eine interaktive Shell benötigen bringt uns das einmale Pipen nach NC nichts, da wir somit keine Möglichkeit haben in der selben TCP Sitzung weitere Befehle eingeben zu können und uns somit durch Verzeichnisse zu bewegen.
Zum Glück stellt NC eine Option zur Verfügung, welche genau das macht was wir brauchen
Somit können wir uns nun frei innerhalb der Shell bewegen, ohne den DEBUG Mode können wir jedoch keine Dateien lesen oder kopieren, daher kommen wir ohne DEBUG nicht weiter.
Mittlerweile haben wir auch schon das DEBUG Kennwort um uns somit weitere Befehle freizuschalten. Als ich die Box gemacht habe, hatte ich dieses Kennwort aber noch nicht gefunden hab mir kurzerhand einen kleinen Bruteforcer in python geschrieben, welcher anhand einer Wordliste versucht das Kennwort zu eraten.
Braucht man zwar nicht für die Box, war aber trotzdem recht interessant zum umsetzten. Damit das Script läuft muss man sich die pwn tools über
pip install pwn
installieren. Das Script versucht jeweils 11 Passwörter und baut dann eine neue Verbindung auf (da sonst die Passworteingabe verweigert wird). Ich hab da gefundene Passwort aus der Textdatei mit in die Wordliste gepackt. Der Bruteforcer hört auf sobald er das Kennwort gefunden hat
DEBUG MODE & Reverse .NET EXE
Mithilfe des DEBUG Kennworts können wir uns anmelden und bekommen weitere Befehle zur Auswahl.
Im übergeordneten Verzeichnis und dort unter LDAP finden wir eine Config mit dem nächsten HASH für den Benutzer Administrator
Das dazugehörige Tool HqkLdap.exe haben wir zuvor schon in der Freigabe von s.smith gesehen und uns geladen (c.smith\HQK Reporting\AD Integration Module).
Leider gibt es dazu kein VB Projekt, welches wir neu kompilieren können um uns den HASH zu entschlüsseln. Das Tool selbst, lässt sich selbst mit Parametern nicht sinnvoll starten.
Ich kopiere mir also die .exe auf meine Windows Maschine und öffne sie mit dem Tool dnspy.
Dort editiere ich mir das Main Modul so, dass direkt der Hash umgewandelt wird und mir auf der Console ausgegeben wird
Die Assembly gespeichert und ausgeführt gibt mir das Passwort im Klartext zurück.
Root
Mithilfe des Admin-Kennwortes prüfe ich nochmals die SMB Shares und habe Schreibzugriff
Mit PSExec kann ich mir eine Shell spawnen und wir haben Vollzugriff.
Auf dem Desktop finden wir dann auch die root.txt
Noch eine Ergänzung zum Ende, die Box ist von VBScrups und es scheint als hätte dieser den Service HQK Reporting, selber geschrieben. Ich hab mir die EXE geladen und mit dnspy angesehen und ein kleines EasterEgg gefunden 🙂