HTB – Nest

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 🙂

Schreibe einen Kommentar