Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

🏠 Back to Blog

Access Control List (ACL) Abuse Primer

ACLs control who can access which AD objects and at what level. Misconfigurations leak permissions to principals that don’t need them, enabling lateral movement, privilege escalation, and persistence. ACL issues are invisible to vulnerability scanners and often go unchecked for years.

ACL Fundamentals

An Access Control List (ACL) defines which security principals (users, groups, processes) can access an object and what rights they have. The individual entries in an ACL are Access Control Entries (ACEs). Every AD object has an ACL, and each ACL can contain multiple ACEs.

Two Types of ACLs

TypePurpose
DACL (Discretionary Access Control List)Defines which principals are granted or denied access to an object. Made up of allow/deny ACEs.
SACL (System Access Control List)Logs access attempts to secured objects for auditing.

DACL behavior:

  • No DACL exists → all access granted (full rights to everyone)
  • DACL exists but has no ACEs → all access denied
  • DACLs are evaluated top-to-bottom; processing stops when an access denied ACE is matched

ACE Components

Each ACE contains four parts:

  1. SID — security identifier of the user/group with access
  2. Type flag — access denied, access allowed, or system audit
  3. Inheritance flags — whether child objects inherit this ACE
  4. Access mask — 32-bit value defining the specific rights granted

Three ACE Types

ACE TypeLocationPurpose
Access deniedDACLExplicitly denies access to a principal
Access allowedDACLExplicitly grants access to a principal
System auditSACLGenerates audit logs on access attempts

Abusable ACE Permissions

These permissions can be enumerated with BloodHound and exploited with PowerView (Windows) or Impacket/bloodyAD (Linux).

PermissionEffectAbuse Tool (PowerView)
ForceChangePasswordReset a user’s password without knowing the current oneSet-DomainUserPassword
GenericAllFull control over the target objectSet-DomainUserPassword, Add-DomainGroupMember, read LAPS password
GenericWriteWrite to any non-protected attribute on the objectSet-DomainObject (assign SPN for Kerberoasting, modify group membership)
WriteOwnerChange the owner of the objectSet-DomainObjectOwner
WriteDACLModify the DACL (grant yourself or others new permissions)Add-DomainObjectACL
AllExtendedRightsPerform all extended operations (password reset, group changes)Set-DomainUserPassword, Add-DomainGroupMember
AddSelfAdd yourself to a security groupAdd-DomainGroupMember
Add MembersAdd any principal to a groupAdd-DomainGroupMember

Key Permissions in Detail

ForceChangePassword — Reset a user’s password without knowing the current one. Use cautiously and get client approval before resetting passwords on an engagement.

GenericWrite — Write to non-protected attributes. Over a user: assign an SPN and Kerberoast them (targeted Kerberoasting). Over a group: add yourself or another principal. Over a computer: perform resource-based constrained delegation.

GenericAll — Full control. Over a user: change password or Kerberoast. Over a group: modify membership. Over a computer with LAPS: read the local admin password.

WriteDACL — Modify the DACL itself. Grant yourself GenericAll, then abuse from there. Powerful for establishing persistence.

WriteOwner — Take ownership of the object, then modify its DACL to grant yourself full control.

Attack Scenarios

ScenarioDescription
Abusing password reset permissionsHelp Desk / IT accounts often have ForceChangePassword on privileged accounts. Take over such an account and reset a higher-privilege user’s password.
Abusing group membership managementStaff with Add Members rights on privileged groups. Add a controlled account to Domain Admins or other sensitive groups.
Excessive user rightsSoftware installs (Exchange is notorious) or legacy configs grant unintended rights. Users may have GenericAll or WriteDACL on high-value objects without anyone knowing.

Enumeration

BloodHound

Import domain data via SharpHound (Windows) or bloodhound-python (Linux). BloodHound visualizes ACL attack paths and highlights edges like:

  • ForceChangePassword
  • GenericAll / GenericWrite
  • WriteDACL / WriteOwner
  • AllExtendedRights
  • AddSelf / AddMember
  • ReadGMSAPassword

PowerView

Import-Module .\PowerView.ps1

# Find interesting ACLs for a specific user
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.IdentityReferenceName -match "TARGET_USER"}

# Get ACL for a specific object
Get-DomainObjectAcl -Identity "TARGET" -ResolveGUIDs

# Find all objects where a user has GenericAll
Get-DomainObjectAcl -ResolveGUIDs | ?{$_.ActiveDirectoryRights -match "GenericAll" -and $_.SecurityIdentifier -match "USER_SID"}

Other Edges to Watch For

  • ReadGMSAPassword — read the password of a Group Managed Service Account (use GMSAPasswordReader or similar)
  • Unexpire-Password / Reanimate-Tombstones — less common extended rights; research exploitation on a case-by-case basis

Operational Notes

  • ACL attacks can be destructive (password resets, group membership changes). Get client approval before executing and document everything.
  • Always revert changes after the attack: remove group memberships, restore original owners/DACLs.
  • Include all changes in the report with clear documentation showing changes were reverted.
  • ACL abuse is especially valuable when the client has addressed all “low hanging fruit” — these paths often survive standard hardening.