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的工具,可以在此处下载