Search

Escribe para buscar.

en
HackTheBox: Jab

HackTheBox: Jab

Junior Restituyo
0xR3iko

Jab es una máquina de nivel medio que nos introduce al servicio Jabber e Ignite Openfire.

Jabber es un servicio público y gratuito de mensajería instantánea y presencia basado en XMPP. Openfire es un servidor de colaboración en tiempo real (RTC) que usa XMPP; es fácil de instalar y administrar, y ofrece buena seguridad y rendimiento.

Enumeración

Empezando con un escaneo de Nmap, vimos muchos servicios y puertos, con algunos interesantes como 88/tcp (kerberos), 445/tcp (smb), 389/636/3268 (ldap) y 5222/tcp (Ignite Realtime Openfire).

# nmap -sCV -n -Pn ... 10.129.176.229
PORT      STATE SERVICE      VERSION
53/tcp    open  domain       Simple DNS Plus
88/tcp    open  kerberos-sec Microsoft Windows Kerberos
389/tcp   open  ldap         Microsoft Windows Active Directory LDAP (Domain: jab.htb0.)
445/tcp   open  microsoft-ds?
5222/tcp  open  jabber       Ignite Realtime Openfire Jabber server 3.10.0 or later
5269/tcp  open  xmpp         Wildfire XMPP Client
7070/tcp  open  realserver?
| ssl-cert: Subject: commonName=DC01.jab.htb
Service Info: OS: Windows; CPE: cpe:/o:microsoft:windows

Antes de interactuar con el servicio Jabber, quisimos enumerar el sistema AD. Usamos kerbrute por su velocidad de enumeración.

bash
kerbrute userenum jsmith.txt --dc dc01 -d 'jab.htb' -v

Kerbrute enumerando usuarios válidos del dominio

Recolectamos muchos usuarios, y 3 eran vulnerables a AS-REP Roasting; capturamos el ticket Kerberos para crackearlo offline.

Capturando tickets vulnerables a AS-REP Roasting

Con hashcat, logramos obtener una contraseña.

bash
hashcat -a 0 -m 18200 jmontgomery.hash /usr/share/wordlists/rockyou.txt --force

[email protected]:...:##########
Status...........: Cracked
Hash.Mode........: 18200 (Kerberos 5, etype 23, AS-REP)

Ahora con un usuario, y después de listar los servicios disponibles, nos enfocamos en el servicio Jabber Openfire. Encontramos que la app pidgin sirve para interactuar con él.

El cliente XMPP Pidgin

Usamos esta app para iniciar sesión con el usuario que acabamos de encontrar.

Iniciando sesión en Openfire con Pidgin

Una vez dentro, no hay mensajes directos, así que buscamos alguna sala o conversación de grupo.

Buscando conversaciones de grupo

Encontramos una sala interesante llamada pentest2023.

La sala de chat pentest2023

Dentro de esta sala, encontramos una conversación sobre un pentest realizado en la empresa, donde encontraron un SPN de un usuario y el hashcat ejecutado contra el ticket, para demostrar una vulnerabilidad en su sistema.

Credenciales reveladas en la sala pentest2023

Ahora tenemos credenciales importantes que enumeraremos para intentar entrar al servidor.

Acceso inicial

Nos movimos a la terminal y logramos obtener un zip de BloodHound para enumerar el dominio. No encontramos derechos interesantes, pero el usuario svc_openfire es miembro de DISTRIBUTED COM USERS.

bash
bloodhound-python -u <USERNAME> -p <PASSWORD> -d <DOMAIN> -ns <TARGET-IP> --dns-tcp -dc <DC> --zip -k -v

Usamos el siguiente filtro, que encuentra el camino más corto de un usuario a cualquier cosa.

MATCH p = shortestPath((u:User{name: '[email protected]'})-[*1..]->(c)) WHERE c<>u RETURN p

BloodHound mostrando a svc_openfire en Distributed COM Users

Sabiendo que el usuario está en el grupo Distributed COM, encontramos la herramienta Impacket DCOM, que sirve para obtener ejecución de comandos en el servidor. Usándola, lanzamos una reverse shell.

bash
dcomexec.py -object MMC20 <DOMAIN>/<USERNAME>:<PASSWORD>@<TARGET-IP> '<COMMAND>' -silentcommand

Ejecución de comandos vía Impacket dcomexec

Acá obtuvimos nuestra flag user.txt.

Flag de usuario obtenida

Escalada de privilegios

De vuelta en Pidgin, logueados como svc_openfire, vamos a Accounts -> svc_openfire -> Get Admin Console Info, que muestra la interfaz IP y el puerto de la Consola de Administración de Openfire.

Obteniendo la info de la consola de Openfire en Pidgin

Enumerando nuestra sesión con netstat, vemos que el servicio Openfire corre en la IP local y el puerto 9090.

netstat mostrando Openfire en localhost:9090

Para hacer el port forwarding, usamos Metasploit: lanzamos una reverse shell meterpreter y reenviamos el puerto local del objetivo a nuestra máquina.

portfwd add -l 9090 -p 9090 -r 127.0.0.1

Configurando el port forward con meterpreter

Ahora, en nuestra máquina atacante, vamos a http://127.0.0.1:9090 y tenemos acceso a la Consola de Administración de Openfire.

La consola de Openfire alcanzada a través del túnel

Usando las credenciales encontradas en la sala de chat, iniciamos sesión.

Iniciando sesión en la consola de Openfire

Panel de administración de Openfire

Openfire es vulnerable a CVE-2023-32315, el bypass de autenticación de la consola de Openfire con RCE. La versión en uso (4.7.5) tiene el bypass corregido, pero como ya tenemos acceso admin con svc_openfire, solo necesitamos el plugin.

https://github.com/miko550/CVE-2023-32315

Para subir el plugin, vamos a Plugins.

Subiendo el plugin malicioso

Para usar el plugin, vamos a Server -> Server Settings -> Management Tool.

Abriendo el Management Tool del plugin

El plugin pide una contraseña para entrar; la contraseña es 123.

El prompt de contraseña del plugin

Finalmente, elegimos la pestaña system command y ejecutamos nuestra reverse shell de PowerShell.

Ejecutando una reverse shell de PowerShell a través del plugin

Obtuvimos acceso admin al servidor.

Shell de SYSTEM/admin obtenida

Y obtuvimos nuestra flag root.txt.

Flag de root obtenida

Gracias por leer.