references:
- https://www.harmj0y.net/blog/redteaming/abusing-active-directory-permissions-with-powerview/
- https://cbtgeeks.com/2016/06/02/what-is-rootdse/
- https://adsecurity.org/?p=1906
- https://technet.microsoft.com/en-us/magazine/2009.09.sdadminholder.aspx
- https://docs.microsoft.com/en-us/previous-versions/technet-magazine/ee361593(v=msdn.10)?redirectedfrom=MSDN
- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/f9dbd527-5594-4d27-be4b-ec16d23136e6
- https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-adts/ddc8da4a-6ac8-4193-b51c-205cebbf483b
- https://itfordummies.net/2017/10/02/invoke-active-directory-sdprop-powershell/
前言
本文介绍一种Windows Active Directory持久化方式,这个手法很早以前就有了,在此记录一下
AdminSDHolder
AdminSDHolder
是AD中的一个对象,它位于cn=AdminSDHolder,cn=System,DC=domain,dc=name
该对象的作用是保证受保护对象的ACL不会被篡改
这个所谓受保护的对象,是硬编码到二进制文件中的,也就是说,当你的AD域创建完成后,受保护的对象就确定下来了
下面有一张表格描述了微软的各个版本的Server中默认的受保护对象(用户组和账户)
那么它是如何保护这些对象的ACL不被篡改呢?
SD Propagation(安全描述符传播)
持有PDC FSMO角色的DC默认情况下每隔1小时会执行一次SD Propagation
任务,此任务的大致行为就是将所有受保护对象的ACL和AdminSDHolder的ACL进行对比,如果两者有差异,就是用AdminSDHolder的ACL覆盖掉受保护对象的ACL
下图为AdminSDHolder默认的ACL:
Domain Admins组作为受保护的对象,其ACL应该和AdminSDHolder保持一致
我们对AdminSDHolder的ACL稍微作一下修改以便更直观地理解AdminSDHolder的工作机制
我们向AdminSDHolder的ACL中添加一个用户,并赋予它特殊权限
等待PDC的下一次SD Propagation
任务完成之后,我们再观察一下Domain Admins
用户组的ACL是否发生了改变
可以看到,sdtest
用户此时已经拥有了对Domain Admins
的特殊权限
利用
通过上面的解释,我们可以通过修改AdminSDHolder
的ACL来达到控制Domain Admins
用户组的目的
上面我们只赋予了sdtest
用户特殊权限
,如果我们给该用户赋予写入
权限,那么等下一次SD Propagation
完成之后,sdtest
用户将拥有修改Domain Admins
组成员的权限
但是默认一个小时才进行ACL
的检查与覆盖,貌似有点太久了,有没有方法可以强制进行SD Propagation
呢?
答案是肯定的
根据微软的官方文档,使用LDAP(rootDSE,DN为空)连接到持有PDC FSMO角色的DC上,然后修改runProtectAdminGroupsTask
属性的值为1,即可触发SD propagation
对于Windows 2008 R2及以上的版本,使用上图所示方法即可
根据文档,早于Windows 2008 R2的版本需要通过修改fixupInheritance
属性来触发SD propagation
,参考下图所示方法
后记
上面提到的操作都是基于GUI的,最后肯定要武器化为命令行工具,这一部分的实现不方便放出来,XDM自行摸索吧,也不难
上面触发SD Propagation
的工具,可以在此处下载