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.

Objetivo

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.

Warning

Enumeración global = ruido, lentitud y baja eficiencia.


🎯 Enfoque correcto: Enumeración dirigida

  1. Identificas un usuario bajo tu control → wley

  2. Obtienes su SID

  3. 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
Tip

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-00aa006e0529User-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
Info

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

ACE: User-Force-Change-Password

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

Tip

GenericWrite permite:


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

Info

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

GenericAll permite:

5️⃣ Usuario final: adunn

Enumerando sus permisos encontramos:

DS-Replication-Get-Changes
DS-Replication-Get-Changes-In-Filtered-Set

Warning

Esto permite ejecutar DCSync
→ Extraer todos los hashes del dominio.


🧠 Cadena completa de ataque encontrada

Resumen visual

🔥 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

  1. Recopila datos con SharpHound.

  2. Carga los datos en BloodHound.

  3. Configura el usuario wley como nodo inicial.

Tip

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)

Example

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

Tip

Esto facilita decidir cómo y cuándo explotar cada permiso sin perderse en tablas largas de PowerShell.


🔹 Transitive Object Control

Example

Ruta completa visualizada:


🔹 Visualización de rutas de ataque

Tip

Esto permite detectar grupos anidados y derechos derivados rápidamente.


🔹 Consultas predefinidas

Info

BloodHound convierte semanas de trabajo manual en visualización instantánea y rutas claras de ataque.


🔹 Resumen

BloodHound permite:

  1. Ver control directo y derivado de usuarios.

  2. Explorar cadenas de ataque ACL completas.

  3. Usar menús Help para guías de explotación y OpSec.

  4. Validar permisos críticos (ej. DCSync) de manera rápida.

Info

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

Info

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

Ejecución completa

# En la máquina Windows (ACADEMY-EA-MS01)
.\SharpHound.exe --CollectionMethods All --Domain inlanefreight.local --ZipFilename ad_data

{56090C21-FE1D-480E-95F1-6BAF0C90956F}.png
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:

  1. Click Upload Data

  2. Selecciona el ZIP

  3. Esperar 100%

  4. En la barra de búsqueda arriba escribe: forend

  5. Selecciona el usuario FOREND@INLANEFREIGHT.LOCAL

  6. {C72C1625-9A31-4846-9EF4-884FE0B6385C}.png

Info

Esto significa que forend puede: