Post

HTB Jab Writeup

HTB Jab Writeup

Muy buenas con todos, el día de hoy voy a resolver la máquina Jab de HTB, espero que el procedimiento sea de su agrado y fácil de comprender.

Reconocimiento

Primero vemos si tenemos conexión con la máquina y de paso gracias al ttl identificamos ante el tipo de máquina que estámos, en linux este suele ser de 64 y en windows de 128.

1
2
3
4
5
6
7
ping -c 1 10.10.11.4
PING 10.10.11.4 (10.10.11.4) 56(84) bytes of data.
64 bytes from 10.10.11.4: icmp_seq=1 ttl=127 time=183 ms

--- 10.10.11.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 183.400/183.400/183.400/0.000 ms

Vemos que el ttl de la máquina es de 127, el cual está próximo a 128 por ende nos encontramos ante una máquina Windows.

Ahora, con la herramienta nmap lanzamos un escaneo en donde vamos a enumerar los puertos que se encuentran abiertos en la máquina.

1
nmap -p- --open -sS --min-rate 5000 -vvv -n -Pn 10.10.11.4 -oG ports

Aquí generamos un archivo en formato grepeable y hacemos uso de la función extarctPorts de s4vitar.

1
extractPorts ports

Ahora, con el número de los puertos copiados en el portapapeles, lanzamos otro escaneo para enumerar el servicio que corren por los puertos.

1
nmap -sCV -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,49667,49673,49690,49691,49692,49699,49770,59946 10.10.11.4 -oN target

Aquí generamos un archivo en el formato normal de nmap en donde se nos muestra más información de los servicios que corren por esos puertos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2024-06-24 19:14:20Z)
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-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-06-24T19:15:47+00:00; +10s from scanner time.
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-date: 2024-06-24T19:15:46+00:00; +9s 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
3268/tcp  open  ldap          Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-06-24T19:15:47+00:00; +9s 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
3269/tcp  open  ssl/ldap      Microsoft Windows Active Directory LDAP (Domain: jab.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2024-06-24T19:15:46+00:00; +10s 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
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     unknown: 
|     errors: 
|       invalid-namespace
|       (timeout)
|     stream_id: 17pdc9qd67
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|     xmpp: 
|_      version: 1.0
|_ssl-date: TLS randomness does not represent time
| 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>
5223/tcp  open  ssl/jabber
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     errors: 
|       (timeout)
|     unknown: 
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|_    xmpp: 
| 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
5262/tcp  open  jabber        Ignite Realtime Openfire Jabber server 3.10.0 or later
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     unknown: 
|     errors: 
|       invalid-namespace
|       (timeout)
|     stream_id: 9p4dfvx4gg
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|     xmpp: 
|_      version: 1.0
5263/tcp  open  ssl/jabber
|_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>
| 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: 
|     errors: 
|       (timeout)
|     unknown: 
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|_    xmpp: 
5269/tcp  open  xmpp          Wildfire XMPP Client
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     errors: 
|       (timeout)
|     unknown: 
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|_    xmpp: 
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        Ignite Realtime Openfire Jabber server 3.10.0 or later
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     unknown: 
|     errors: 
|       invalid-namespace
|       (timeout)
|     stream_id: 4k1nk8ynne
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|     xmpp: 
|_      version: 1.0
5276/tcp  open  ssl/jabber
| xmpp-info: 
|   STARTTLS Failed
|   info: 
|     errors: 
|       (timeout)
|     unknown: 
|     capabilities: 
|     compression_methods: 
|     features: 
|     auth_mechanisms: 
|_    xmpp: 
|_ssl-date: TLS randomness does not represent time
| 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-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
7070/tcp  open  http          Jetty
|_http-title: Openfire HTTP Binding Service
7443/tcp  open  ssl/http      Jetty
|_ssl-date: TLS randomness does not represent time
| 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
|_http-title: Openfire HTTP Binding Service
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-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open  msrpc         Microsoft Windows RPC
49665/tcp open  msrpc         Microsoft Windows RPC
49666/tcp open  msrpc         Microsoft Windows RPC
49667/tcp open  msrpc         Microsoft Windows RPC
49673/tcp open  msrpc         Microsoft Windows RPC
49690/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
49691/tcp open  msrpc         Microsoft Windows RPC
49692/tcp open  msrpc         Microsoft Windows RPC
49699/tcp open  msrpc         Microsoft Windows RPC
49770/tcp open  msrpc         Microsoft Windows RPC
59946/tcp open  msrpc         Microsoft Windows RPC
4 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)==============
SF-Port5222-TCP:V=7.95%I=7%D=6/24%Time=6679C596%P=x86_64-pc-linux-gnu%r(RP
SF:CCheck,9B,"<stream:error\x20xmlns:stream=\"http://etherx\.jabber\.org/s
SF:treams\"><not-well-formed\x20xmlns=\"urn:ietf:params:xml:ns:xmpp-stream
SF:s\"/></stream:error></stream:stream>");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port5223-TCP:V=7.95%T=SSL%I=7%D=6/24%Time=6679C5AA%P=x86_64-pc-linux-gn
SF:u%r(RPCCheck,9B,"<stream:error\x20xmlns:stream=\"http://etherx\.jabber\
SF:.org/streams\"><not-well-formed\x20xmlns=\"urn:ietf:params:xml:ns:xmpp-
SF:streams\"/></stream:error></stream:stream>");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port5263-TCP:V=7.95%T=SSL%I=7%D=6/24%Time=6679C5AA%P=x86_64-pc-linux-gn
SF:u%r(RPCCheck,9B,"<stream:error\x20xmlns:stream=\"http://etherx\.jabber\
SF:.org/streams\"><not-well-formed\x20xmlns=\"urn:ietf:params:xml:ns:xmpp-
SF:streams\"/></stream:error></stream:stream>");
==============NEXT SERVICE FINGERPRINT (SUBMIT INDIVIDUALLY)==============
SF-Port5276-TCP:V=7.95%T=SSL%I=7%D=6/24%Time=6679C5AB%P=x86_64-pc-linux-gn
SF:u%r(RPCCheck,9B,"<stream:error\x20xmlns:stream=\"http://etherx\.jabber\
SF:.org/streams\"><not-well-formed\x20xmlns=\"urn:ietf:params:xml:ns:xmpp-
SF:streams\"/></stream:error></stream:stream>");
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2024-06-24T19:15:37
|_  start_date: N/A
|_clock-skew: mean: 9s, deviation: 0s, median: 9s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required

Vemos que tenemos un dominio office.htb, así que lo agregamos al /etc/hosts.

1
2
3
4
5
127.0.0.1	localhost
::1		localhost
127.0.0.1	machinename.localhost	machinename

10.10.11.4    jab.htb

Hay muchos puertos abiertos, así que vamos con calma para no abrumarnos. No vemos el puerto 80 por donde corre el servicio http, sin embargo, vemos el 7070, donde está corriendo un servicio http, pero no tiene nada de interés.

Servicio XMPP

Vemos que por el puerto 5222 corre un servicio llamado XMPP, este es un protocolo abierto y extensible basado en XML. Podemos hacer uso de Pidgin, para ver si podemos conectarnos al servidor. Una vez abierto el programa, procedemos a crear una cuenta en el servidor.

Una vez con la cuenta creada, procedemos a activar el plugin para navegar por el servicio de XMPP.

Ahora dentro de tools podemos ver el plugin, así que vamos a hacer uso del mismo para si tienen algunas conversaciones abiertas u otras cosas de interés.

Podemos ver que, si le damos a buscar, nos encuentra cosas de interés. Vemos que dentro de los nombres hay unos subdominios, así que los agregamos al /etc/hosts, vemos que en conference.jab.htb, hay dos salas de chat, pero solo podemos acceder a la test2 y allí tenemos un nombre de usuario, nada más de interés. También tenemos search.jab.htb, que nos dice que podemos buscar usuarios, así que vamos a ver qué tenemos allí.

Esto nos devuelve una larga lista de usuarios y nos puede parecer muy abrumador, así que lo que vamos a hacer es capturar los logs generados y filtrar por los nombres de usuarios. Primero abrimos pidgin desde la terminal y mandamos el tráfico a un archivo.

1
pidgin -d > xmpp.log

Luego volvemos a hacer los pasos para ver la lista de usuarios. Una vez hagamos eso, cerramos el programa y con el archivo generado, hacemos uso de la siguiente regex para filtrar por los nombres de los usuarios.

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

Solicitar (TGTs) ASREProast

Como tenemos una lista de usuarios muy extensa, podemos hacer uso de GetNPUsers, para solicitar los TGT de los usuarios que tengan habilitada la opción Do not require Kerberos preauthentication.

1
GetNPUsers.py -no-pass -usersfile users jab.htb/ > hashes

Esperamos un rato y luego podemos ver que logramos obtener unos TGTs.

Ahora podemos intentar romper esos hashes haciendo uso de hashcat o john.

1
john --wordlist=diccionario.txt hash

Vemos que para el usuario jmontgomery nos logró descifrar la contraseña, vemos que no la podemos usar para conectarnos haciendo uso de evil-winrm y por smb tampoco hay nada de interés. Pero podemos ver si la credencial es válida para XMPP, así que iniciamos sesión allí. Como es un usuario válido, no necesitamos marcar la casilla para crear un nuevo usuario.

Si nos vamos a buscar de nuevo por los servicios, logramos ver que ahora hay una nueva sala de chat.

Vemos que están hablando sobre cómo pueden obtener y romper un hash haciendo uso de hashcat, y nos muestran el ejemplo en donde logramos ver la credencial del usuario svc_openfire

Ganando acceso

Ahora ya tenemos otro usuario con su posible contraseña, este no tiene nada intersante por smb y tampoco se puede conectar usando evil-winrm, como RPC está corriendo en la máquina víctima, podemos usar dcomexec, este permite la ejecución de comandos en sistemas remotos mediante DCOM (Distributed Component Object Model) es un protocolo empleado para exponer los objetos de una aplicación a los RPC (Remote Procedure Calls) y, de esta manera, los diferentes componentes de dispositivos puedan comunicarse por red. Entonces no vamos a esta web para generar una revshell.

Y podemos ver que logramos ganar acceso a la máquina y logramos ver la primera flag.

Escalda de privilegios

Una vez dentro, nos ponemos a enumerar un poco y vemos que hay un proceso algo diferente.

Algo llamado openfire-service, vemos que esto es un sistema de mensajería instantánea, hecho en java y que utiliza el protocolo XMPP. Nos dicen que este servicio corre en el puerto 9090, vemos si está abierto de forma interna en la máquina este puerto.

1
netstat -ano | Select-String "LISTENING"

Vemos que efectivamente se está usando por el puerto anteriormente indicado, así que subimos el chisel para traernos ese puerto al equipo.

Si nos vamos a la web http://localhost:9090, tenemos un panel de inicio de sesión, así que podemos intentar ver si las credenciales de svc_openfire son válidas y vemos que sí. Tenemos la versión del servicio, así que haciendo una búsqueda nos encontramos con el siguiente CVE-2023-32315. En donde nos dicen que podemos lograr un RCE mediante, la subida de un plugin malicioso. Ellos mismos nos lo proporcionan aquí y nos indican paso a paso cómo podemos lograr la ejecución remota de comandos. Así que nos leemos el artículo para poder seguir.

Podemos usar la misma revshell generada antes y logramos ganar acceso como nt authority\system, ya que este usuario es el que esta ejecutando ese servicio y logramos ver la última flag.

This post is licensed under CC BY 4.0 by the author.