RootInProgress

Walkthrough: HackTheBox - Jeeves

Summary

Jeeves is a medium-difficulty Windows machine on HackTheBox. Initial enumeration reveals a website on a non-default port running Jenkins. By abusing the Jenkins Script Console, we achieve remote code execution to gain initial shell access. Privilege escalation involves locating a KeePass database, cracking its master password, and performing a Pass-the-Hash attack to compromise the Administrator account.


Enumeration

Port Scan

After grabbing the open TCP ports with our usual scan,

ports=$(nmap -Pn -p- --min-rate=1000 -T4 $ip | grep ^[0-9] | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)

we execute the -sCV scan to find that port 80,135,445 and 50000 are open.

sudo nmap -sCV -p$ports $ip -oA nmap/jeeves-scv-scan  
PORT      STATE SERVICE      VERSION
80/tcp    open  http         Microsoft IIS httpd 10.0
|_http-title: Ask Jeeves
|_http-server-header: Microsoft-IIS/10.0
| http-methods: 
|_  Potentially risky methods: TRACE
135/tcp   open  msrpc        Microsoft Windows RPC
445/tcp   open  microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open  http         Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 4h59m59s, deviation: 0s, median: 4h59m58s
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-security-mode: 
|   3.1.1: 
|_    Message signing enabled but not required
| smb2-time: 
|   date: 2026-08-21T20:09:17
|_  start_date: 2026-08-21T20:00:22

Port 445

Checking SMB with nxc for null and guest authentication

nxc smb 10.129.228.112 -u '' -p ''
nxc smb 10.129.228.112 -u 'guest' -p ''

revealed nothing interesting, besides the fact that the domainname is jeeves, singing is false and the SMB Version is smbv1.

Port 135

The RPC Port also showed nothing of interest. I just quickly checked with:

impacket-rpcdump -target-ip 10.129.228.112 -p 135 10.129.228.112

Port 80

Manual Enumeration

jeeves-port-80-website When entering anything, we are presented with an error page at /error.html? jeeves-port-80-error

Fuzzing Port 80 gave us no further information to work with, so I decided to focus on the last open Port, 50000.

Port 50000

Manual Enumeration

jeevs-port-50000-website

Fuzzing fun with FFUF

I tried all kinds of fuff commands, none of them returned anything.

ffuf -u http://10.129.228.112:50000/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt
ffuf -u http://10.129.228.112:50000/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-files.txt
ffuf -u http://10.129.228.112:50000/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-medium-words.txt

What finally worked was using the large-words file instead:

└─$ ffuf -u http://10.129.228.112:50000/FUZZ -w /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt      
 :: Method           : GET
 :: URL              : http://10.129.228.112:50000/FUZZ
 :: Wordlist         : FUZZ: /usr/share/seclists/Discovery/Web-Content/raft-large-words.txt
 :: Follow redirects : false
 :: Calibration      : false
 :: Timeout          : 10
 :: Threads          : 40
 :: Matcher          : Response status: 200-299,301,302,307,401,403,405,500
________________________________________________

askjeeves               [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 30ms]
:: Progress: [119600/119600] :: Job [1/1] :: 956 req/sec :: Duration: [0:01:42] :: Errors: 0 ::

Visiting /askjeeves we are presented with a Jenkins instance jeevs-50000-jenkins

Initial Access

Taking a look around, we come across Manage Jenkins > Script Console, where we are able to execute commands using the Groovy language. With this, we can get our username, grab the user flag (which of course we can also do later on), but also execute a reverse shell: jeeves-jenkins-whoami
jeeves-jenkins-user-flag
jeeves-rev-shell


Local Enumeration

Keepass Database

The directory, C:\Users\Administrator\.jenkins, in which we landed gave us no real information, so I decided to poke around and found a Keepass Database at C:\Users\kohsuke\Documents jeeves-kdbx-file

Transferring the Kepass Database

As I was to lazy to upload any tool, I decided to base64 encode the Kepass file and decode it on my machine.

Encoding

jeevs-base64-encode-kdbx

Decoding

jeeves-base64-decode


Privilege Escalation

Cracking the Keepass Database

With the help of keepass2john we converted the kdbx file to a crackable hash format and crack it using hashcat

keepass2john CEH.kdbx 
CEH:$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b73766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48
keepass2john CEH.kdbx > hash.hash
hashcat hash.hash /usr/share/wordlist/rockyou -m 13400

jeeves-kdbx-crack

Accessing the Keepass Database

Using KeePassXC with the kdbx file and the cracked password of moonshine1. Using nxc smb and all the provided password did not help. But, besdies the passwords, there is also an interesting "Backup Stuff" hash. jeeves-kdbx-entries

Pass-The-Hash

With the previously mentioned hash, we are able to use impacket-psexec and gain access as administrator jeeves-login-as-admin

Root Flag

I was expecting a 'root.txt', but this time, it's hm.txt. We're told to Look deeper jeevs-look-deeper Looking deeper with dir /R, we come across: jeevs-dir-cmd This is not our typical file, but rather a stream, which we instead have to access for example via the more command: jeevs-stream-root-flag

#ctf #groovy #hackthebox #hash #hashcat #htb #jenkins #john #keepass #psexec #stream #walkthrough #windows