Skip to content

PowerView — Enumerating Domain ACLs

Conceptos clave

DACL (Discretionary Access Control List) define qué principals tienen acceso permitido o denegado sobre un objeto.

SACL (System Access Control List) permite a administradores registrar intentos de acceso a objetos protegidos.

Cada entrada individual dentro de una ACL se llama ACE (Access Control Entry).


Derechos abusables más importantes

ForceChangePassword     → Set-DomainUserPassword
Add Members             → Add-DomainGroupMember
GenericAll              → Set-DomainUserPassword o Add-DomainGroupMember
GenericWrite            → Set-DomainObject (asignar SPN falso, modificar atributos)
WriteOwner              → Set-DomainObjectOwner
WriteDACL               → Add-DomainObjectACL (otorgarse DCSync)
AllExtendedRights       → Set-DomainUserPassword o Add-DomainGroupMember

Enumeración con cmdlets nativos (Get-ACL)

ACLs de un usuario específico filtradas por otro usuario

c
(Get-ACL "AD:$((Get-ADUser daniel.carter).distinguishedname)").access | ? {$_.IdentityReference -eq "INLANEFREIGHT\cliff.moore"}

Buscar todos los que tienen WriteProperty o GenericAll sobre un usuario

c
(Get-ACL "AD:$((Get-ADUser daniel.carter).distinguishedname)").access | ? {$_.ActiveDirectoryRights -match "WriteProperty" -or $_.ActiveDirectoryRights -match "GenericAll"} | Select IdentityReference,ActiveDirectoryRights -Unique | ft -W

Enumeración con PowerView

ACLs de un objeto específico

c
# Usuario
Get-DomainObjectAcl -Identity harry.jones -Domain inlanefreight.local -ResolveGUIDs

# Grupo
Get-DomainObjectAcl -Identity "Domain Admins" -ResolveGUIDs

# Con resolución de GUIDs (más legible)
Get-DomainObjectAcl -Identity joe.evans -ResolveGUIDs | select ObjectDN,ActiveDirectoryRights,SecurityIdentifier

Buscar quién tiene GenericAll sobre un usuario específico

c
$sid = ConvertTo-SID joe.evans
Get-DomainObjectAcl -Identity joe.evans -ResolveGUIDs | ? {$_.ActiveDirectoryRights -match "GenericAll"} | select SecurityIdentifier,ActiveDirectoryRights

# Resolver el SID a nombre
Convert-SidToName <SID obtenido>

Encontrar ACLs interesantes en todo el dominio

c
Find-InterestingDomainAcl -Domain inlanefreight.local -ResolveGUIDs
Find-InterestingDomainAcl -ResolveGUIDs | select ObjectDN,ActiveDirectoryRights,IdentityReferenceName

Produce mucha data. Mejor guardar a archivo y revisar offline:

c
Find-InterestingDomainAcl -ResolveGUIDs | Export-Csv acls.csv -NoTypeInformation

ACLs en shares (permisos de archivos)

Ver shares disponibles en un host

c
Get-NetShare -ComputerName SQL01
Get-NetShare -ComputerName WS01

Ver ACLs de un share específico

c
Get-PathAcl "\\SQL01\DB_backups"
Get-PathAcl "\\WS01\<nombre_share>"

Si BUILTIN\Users tiene WriteData o GenericAll sobre un share, cualquier usuario del dominio puede escribir en él. Si tiene solo Read, puede leer archivos sensibles.


DCSync — Buscar quién tiene derechos de replicación

DCSync requiere tres derechos sobre el objeto del dominio:

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

Enumerar todos los SIDs con derechos de replicación o GenericAll sobre el dominio

c
Get-ObjectACL "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ObjectAceType -match 'Replication-Get')} | Select-Object SecurityIdentifier | Sort-Object -Property SecurityIdentifier -Unique

Convertir un SID a nombre legible

c
ConvertFrom-SID S-1-5-21-2974783224-3764228556-2640795941-1883

Convertir todos los SIDs de DCSync a nombres de una vez

c
$dcsync = Get-ObjectACL "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ObjectAceType -match 'Replication-Get')} | Select-Object -ExpandProperty SecurityIdentifier | Select -ExpandProperty value
Convert-SidToName $dcsync

Cualquier usuario que aparezca aquí y no sea Domain Admin, Enterprise Admin, Domain Controllers, o grupos del sistema es una cuenta que podría usarse para hacer DCSync sin ser administrador explícito. Vale la pena investigar si es intencional o una misconfiguration.


Qué hacer con cada derecho encontrado

GenericAll o GenericWrite sobre un usuario → cambiar contraseña, asignar SPN falso para Kerberoasting, o desactivar pre-auth para ASREPRoasting. Las dos últimas son menos destructivas que cambiar la contraseña.

GenericAll sobre un grupo → agregarse a ese grupo con Add-DomainGroupMember.

GenericAll o GenericWrite sobre una computadora → Resource-Based Constrained Delegation (RBCD).

WriteDACL sobre el dominio → otorgarse derechos de replicación y hacer DCSync.

WriteOwner sobre un objeto → tomar propiedad del objeto y luego modificar sus ACLs.

GPO con escritura → usar SharpGPOAbuse para agregar admin local, agregar privilegios como SeDebugPrivilege, o ejecutar scripts de inicio.

Si hiciste algo destructivo como cambiar contraseña y comprometiste el dominio, puedes recuperar la contraseña anterior via DCSync con historial y resetearla con Mimikatz: lsadump::ChangeNTLM o lsadump::SetNTLM.


Flujo recomendado al enumerar ACLs

c
# 1. Buscar ACLs interesantes en todo el dominio
Find-InterestingDomainAcl -ResolveGUIDs | select ObjectDN,ActiveDirectoryRights,IdentityReferenceName | Export-Csv acls.csv -NoTypeInformation

# 2. Buscar derechos sobre usuarios específicos de alto valor
$sid = ConvertTo-SID wley
Get-DomainObjectAcl -ResolveGUIDs -Identity * | ? {$_.SecurityIdentifier -eq $sid}

# 3. Buscar quién tiene DCSync
$dcsync = Get-ObjectACL "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ObjectAceType -match 'Replication-Get')} | Select-Object -ExpandProperty SecurityIdentifier | Select -ExpandProperty value
Convert-SidToName $dcsync

# 4. Ver shares y sus permisos
Get-NetShare -ComputerName WS01
Get-PathAcl "\\WS01\<share>"

Fuente: HTB Academy — Active Directory PowerView, Sección 6/9