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-DomainGroupMemberEnumeración con cmdlets nativos (Get-ACL)
ACLs de un usuario específico filtradas por otro usuario
(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
(Get-ACL "AD:$((Get-ADUser daniel.carter).distinguishedname)").access | ? {$_.ActiveDirectoryRights -match "WriteProperty" -or $_.ActiveDirectoryRights -match "GenericAll"} | Select IdentityReference,ActiveDirectoryRights -Unique | ft -WEnumeración con PowerView
ACLs de un objeto específico
# 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,SecurityIdentifierBuscar quién tiene GenericAll sobre un usuario específico
$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
Find-InterestingDomainAcl -Domain inlanefreight.local -ResolveGUIDs
Find-InterestingDomainAcl -ResolveGUIDs | select ObjectDN,ActiveDirectoryRights,IdentityReferenceNameProduce mucha data. Mejor guardar a archivo y revisar offline:
Find-InterestingDomainAcl -ResolveGUIDs | Export-Csv acls.csv -NoTypeInformationACLs en shares (permisos de archivos)
Ver shares disponibles en un host
Get-NetShare -ComputerName SQL01
Get-NetShare -ComputerName WS01Ver ACLs de un share específico
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-ChangesDS-Replication-Get-Changes-AllDS-Replication-Get-Changes-In-Filtered-Set
Enumerar todos los SIDs con derechos de replicación o GenericAll sobre el dominio
Get-ObjectACL "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ObjectAceType -match 'Replication-Get')} | Select-Object SecurityIdentifier | Sort-Object -Property SecurityIdentifier -UniqueConvertir un SID a nombre legible
ConvertFrom-SID S-1-5-21-2974783224-3764228556-2640795941-1883Convertir todos los SIDs de DCSync a nombres de una vez
$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 $dcsyncCualquier 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
# 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