ACL Enumeration en Active Directory
🧭 Introducción
La enumeración de ACLs permite descubrir qué objetos controla un usuario, qué permisos peligrosos existen y qué posibles rutas de escalada o movimiento lateral hay en el dominio.
Identificar ACEs abusables que permitan gain access → reset passwords, añadir usuarios a grupos, delegaciones peligrosas, etc.
🛠️ Enumeración con PowerView
🎯 Problema del enfoque general
Comandos como Find-InterestingDomainAcl generan toneladas de datos difíciles de analizar durante un pentest.
Enumeración global = ruido, lentitud y baja eficiencia.
🎯 Enfoque correcto: Enumeración dirigida
-
Identificas un usuario bajo tu control → wley
-
Obtienes su SID
-
Buscas ACLs donde aparezca como SecurityIdentifier
🔹 Obtener SID
Import-Module .\PowerView.ps1
$sid = Convert-NameToSid wley
🔹 Buscar ACLs donde el SID aparezca
Get-DomainObjectACL -Identity * | ? {$_.SecurityIdentifier -eq $sid}
PS C:\htb> Get-DomainObjectACL -Identity * | ? {$_.SecurityIdentifier -eq $sid}
ObjectDN : CN=Dana Amundsen,OU=DevOps,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
ObjectSID : S-1-5-21-3842939050-3880317879-2865463114-1176
ActiveDirectoryRights : ExtendedRight
ObjectAceFlags : ObjectAceTypePresent
ObjectAceType : 00299570-246d-11d0-a768-00aa006e0529
InheritedObjectAceType : 00000000-0000-0000-0000-000000000000
BinaryLength : 56
AceQualifier : AccessAllowed
IsCallback : False
OpaqueLength : 0
AccessMask : 256
SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-1181
AceType : AccessAllowedObject
AceFlags : ContainerInherit
IsInherited : False
InheritanceFlags : ContainerInherit
PropagationFlags : None
AuditFlags : None
Si no usas -ResolveGUIDs, verás GUIDs ilegibles.
Siempre que puedas → usa -ResolveGUIDs.
🧠 GUID → Nombre de privilegio
Sin ResolveGUIDs, ObjectAceType muestra GUID.
Puedes convertirlo:
Ejemplo:
GUID: 00299570-246d-11d0-a768-00aa006e0529 → User-Force-Change-Password
PS C:\htb> $guid= "00299570-246d-11d0-a768-00aa006e0529"
PS C:\htb> Get-ADObject -SearchBase "CN=Extended-Rights,$((Get-ADRootDSE).ConfigurationNamingContext)" -Filter {ObjectClass -like 'ControlAccessRight'} -Properties * |Select Name,DisplayName,DistinguishedName,rightsGuid| ?{$_.rightsGuid -eq $guid} | fl
Name : User-Force-Change-Password
DisplayName : Reset Password
DistinguishedName : CN=User-Force-Change-Password,CN=Extended-Rights,CN=Configuration,DC=INLANEFREIGHT,DC=LOCAL
rightsGuid : 00299570-246d-11d0-a768-00aa006e0529
⭐ Resolviendo GUIDs automáticamente
PS C:\htb> Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}
AceQualifier : AccessAllowed
ObjectDN : CN=Dana Amundsen,OU=DevOps,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
ObjectAceType : User-Force-Change-Password
ObjectSID : S-1-5-21-3842939050-3880317879-2865463114-1176
InheritanceFlags : ContainerInherit
BinaryLength : 56
AceType : AccessAllowedObject
ObjectAceFlags : ObjectAceTypePresent
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-1181
AccessMask : 256
AuditFlags : None
IsInherited : False
AceFlags : ContainerInherit
InheritedObjectAceType : All
OpaqueLength : 0
Esto te muestra directamente:
ObjectAceType: User-Force-Change-Password
→ Más rápido y legible.
🧪 Ejemplo real del flujo de enumeración
1️⃣ Usuario inicial: wley
- Encontramos que tiene el derecho ForceChangePassword sobre damundsen
Permite resetear la contraseña sin saber la actual.
2️⃣ Usuario comprometido: damundsen
Al enumerar sus permisos:
✔ Tiene GenericWrite sobre el grupo Help Desk Level 1
GenericWrite permite:
-
Añadir usuarios al grupo
-
Modificar atributos
-
Crear rutas de escalada
3️⃣ Grupo “Help Desk Level 1”
PS C:\htb> Get-DomainGroup -Identity "Help Desk Level 1" | select memberof
memberof
--------
CN=Information Technology,OU=Security Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
➡ El grupo está anidado dentro de Information Technology
La herencia de membership significa que
Help Desk L1 → obtiene TODOS los permisos del grupo IT.
4️⃣ Grupo “Information Technology”
PS C:\htb> $itgroupsid = Convert-NameToSid "Information Technology"
PS C:\htb> Get-DomainObjectACL -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $itgroupsid} -Verbose
AceType : AccessAllowed
ObjectDN : CN=Angela Dunn,OU=Server Admin,OU=IT,OU=HQ-NYC,OU=Employees,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : GenericAll
OpaqueLength : 0
ObjectSID : S-1-5-21-3842939050-3880317879-2865463114-1164
InheritanceFlags : ContainerInherit
BinaryLength : 36
IsInherited : False
IsCallback : False
PropagationFlags : None
SecurityIdentifier : S-1-5-21-3842939050-3880317879-2865463114-4016
AccessMask : 983551
AuditFlags : None
AceFlags : ContainerInherit
AceQualifier : AccessAllowed
Al enumerarlo:
✔ Tiene GenericAll sobre el usuario adunn
-
Resetear password
-
Kerberoasting dirigido
-
Modificar atributos
-
Añadir/quitar grupos
-
Leer LAPS (si aplica)
5️⃣ Usuario final: adunn
Enumerando sus permisos encontramos:
✔ DS-Replication-Get-Changes
✔ DS-Replication-Get-Changes-In-Filtered-Set
Esto permite ejecutar DCSync
→ Extraer todos los hashes del dominio.
🧠 Cadena completa de ataque encontrada
-
wley → (ForceChangePassword) → damundsen
-
damundsen → (GenericWrite) → Help Desk Level 1
-
Help Desk L1 → (nested) → Information Technology
-
Information Technology → (GenericAll) → adunn
-
adunn → (Replication rights) → DCSync → Domain Compromise
🔥 Escalada completa desde usuario básico → comprometer todo el dominio.
🧩 Enumeración de ACL con BloodHound
Ahora que hemos enumerado la ruta de ataque utilizando métodos manuales como PowerView y cmdlets de PowerShell, veamos cómo BloodHound simplifica y visualiza este proceso.
🔹 Carga de datos
-
Recopila datos con SharpHound.
-
Carga los datos en BloodHound.
-
Configura el usuario wley como nodo inicial.
BloodHound permite explorar control directo, control vía grupos y Transitive Object Control, mostrando qué objetos podrían ser controlables a través de ACEs.
🔹 Información de nodo (Node Info)
-
Ve a la pestaña Node Info.
-
Desplázate a Outbound Control Rights.
-
Muestra objetos que el usuario controla directamente.
-
Incluye control derivado por membresía de grupos.
-
Muestra rutas de control transitorias (Transitive Object Control).

-
Al hacer clic en el número junto a First Degree Object Control, vemos los derechos de primer nivel, por ejemplo:
ForceChangePassword sobre el usuario damundsen.
🔹 Inspección de edges
-
Haz clic derecho sobre la línea entre dos nodos → Help
-
Información que proporciona:
-
Descripción del derecho específico (ACE)
-
Herramientas y comandos para explotarlo
-
Consideraciones de OpSec
-
Referencias externas

-
Esto facilita decidir cómo y cuándo explotar cada permiso sin perderse en tablas largas de PowerShell.
🔹 Transitive Object Control
-
Haz clic en el número junto a Transitive Object Control
-
BloodHound muestra toda la cadena de control, desde wley hasta los usuarios/objetos finales.
-
Permite identificar rutas completas de escalada o movimiento lateral.
Ruta completa visualizada:
- wley → damundsen → Help Desk L1 → Information Technology → adunn
🔹 Visualización de rutas de ataque
-
BloodHound representa conexiones con nodos y edges:
-
Relaciones: MemberOf, ForceChangePassword, GenericWrite, etc.
-
Agrupaciones: usuarios, grupos, máquinas, recursos.
-
Esto permite detectar grupos anidados y derechos derivados rápidamente.
🔹 Consultas predefinidas
-
Usa queries preconstruidas para encontrar derechos críticos:
- Ejemplo: DCSync Rights
-
Verifica que adunn tiene permisos DS-Replication-Get-Changes → DCSync.
BloodHound convierte semanas de trabajo manual en visualización instantánea y rutas claras de ataque.
🔹 Resumen
BloodHound permite:
-
Ver control directo y derivado de usuarios.
-
Explorar cadenas de ataque ACL completas.
-
Usar menús Help para guías de explotación y OpSec.
-
Validar permisos críticos (ej. DCSync) de manera rápida.
Después de la enumeración visual con BloodHound, el siguiente paso es ejecutar la cadena de ataques de principio a fin de manera controlada y planificada.
🏁 Conclusión
PowerView = precisión y control manual
BloodHound = velocidad, visualización y automatización
Ambas herramientas juntas permiten construir cadenas completas de ataque de ACLs en AD.
📝 Ejercicio
-
Enumerar los ActiveDirectoryRights que el usuario forend tiene sobre dpayne.
-
Ejecutar SharpHound:
Ejecución completa
# En la máquina Windows (ACADEMY-EA-MS01)
.\SharpHound.exe --CollectionMethods All --Domain inlanefreight.local --ZipFilename ad_data

Esto genera un .zip con toda la info del dominio.
📤 Importar datos a BloodHound
En MS01:
bloodhound
Si pide creds:
neo4j : HTB_@cademy_stdnt!
Luego:
-
Click Upload Data
-
Selecciona el ZIP
-
Esperar 100%
-
En la barra de búsqueda arriba escribe:
forend -
Selecciona el usuario
FOREND@INLANEFREIGHT.LOCAL -

-
"First Degree Object Control" - muestra objetos que
forendcontrola directamente -
Busca si
DPAYNE@INLANEFREIGHT.LOCALaparece en la lista
Vemos que foren tiene GenericAll

Esto significa que forend puede:
-
Cambiar la contraseña
-
Modificar atributos
-
Agregar/quitar grupos
-
Realizar Kerberoasting
-
Cualquier otra modificación