đź§  Active Directory - ACL Abuse (GenericAll & ForceChangePassword)

What is it?

  • Concept: Every AD object carries a DACL (Discretionary Access Control List) of ACEs (Access Control Entries) describing exactly which principals can do what to it. GenericAll grants full control over the target object (owns it, in practice); ForceChangePassword grants the narrower right to reset the target’s password without knowing the current one. Both are frequently handed out — deliberately (helpdesk delegation) or by accident (over-broad group nesting) — to accounts that were never meant to be that powerful.
  • Impact: Full takeover of the target account (password reset = authenticate as them), which can then be chained: if the newly-controlled account holds its own ACEs over a third account, one foothold turns into a multi-hop path across the domain.

How it works

BloodHound models these ACEs as graph edges from principal to target. GenericAll is the broadest — it implies every specific right including password reset, group membership changes, and SPN writes. ForceChangePassword is the User-Force-Change-Password extended right specifically: it lets the holder call the equivalent of “reset password” (no old password needed), but doesn’t grant anything else on the object. Either one is enough to fully compromise a user account outright, converting “control over an AD object” directly into “valid credentials for it.”

Because control doesn’t stop propagating at the first hop — the newly-owned account can hold its own ACEs over other objects — a single leaked/reset account can be the start of a chain: reset user A, log in as A, discover A has rights over user B, reset B, and so on until landing on an account with a genuinely high-value right (DCSync, admin group membership, etc.).

Exploitation

Prerequisites

  • Valid credentials for a principal BloodHound shows holding GenericAll, GenericWrite, or ForceChangePassword on a target user

Finding the edge

bloodhound-python -u '<user>' -p '<pass>' -d <domain> -ns <dc_ip> -c all --zip

Load the resulting zip into BloodHound CE and check Outbound Object Control on the compromised principal’s node — GenericAll/ForceChangePassword edges to other users are exactly what to chase first, since they’re a guaranteed win (no cracking, no guessing).

Attack Vectors

# Reset the target's password outright — no old password required
net rpc password "<target_user>" "<new_password>" -U "<domain>/<user>%<pass>" -S <dc_ip>
# Alternative: bloodyAD (works over LDAP, useful when SMB/RPC is filtered)
bloodyAD --host <dc_ip> -d <domain> -u '<user>' -p '<pass>' set password <target_user> '<new_password>'

Authenticate as <target_user> with the new password and repeat the BloodHound check from their perspective — that’s the next hop, if one exists.

Notes

  • net rpc password needs samba-common-bin (apt install smbclient pulls it in on Kali) and talks to the domain over RPC — no special Kerberos setup required, plain NTLM auth works.
  • Overwriting a real user’s password is destructive to that account’s legitimate access — on an engagement (not a lab box), this needs explicit authorization and coordination, since the original owner is locked out until it’s reset back.
  • GenericWrite (rather than GenericAll) doesn’t include password reset, but does allow writing arbitrary attributes on the target — including servicePrincipalName, which opens up Active Directory - Targeted Kerberoasting as a non-destructive alternative when overwriting the real password isn’t acceptable.

Mitigation

  • Fix: Audit AD object ACLs regularly (BloodHound itself, or Get-ADObject/dsacls sweeps) and remove delegated rights that don’t map to an actual documented business need. Treat any account holding GenericAll/ForceChangePassword on another user as a privileged account in its own right, subject to the same monitoring and hardening as admin accounts.
FileCreated
HTB - AdministratorWednesday, July 22nd 2026, 5:00:00 am

References: