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
.