之前看过好多委派攻击的原理说明还都是很迷糊不明白,最近打了几个靶场慢慢能稍微理解一下。
也来记录下网上师傅写的原理
委派
先来说一下什么是委派:域委派是指将域内用户的权限委派给服务账号,使得服务账号能以用户权限访问域内的其他服务。
为什么要域委派
这里引用别的师傅的表述:
比如现在有web服务器和文件服务器,当用户A访问web服务器去请求某个资源时,web服务器上本身并没有该资源,所以web服务器就会从文件服务器上调用这个资源,其中发生的过程若以域委派的形式进行,那么就是:用户A访问web服务器,服务器再以用户A的身份去访问文件服务器。
可以进行域委派的用户
一种是主机账户,活动目录中的computers组内的计算机,也被称为机器账号。如下图:

另一种是用setspn手动添加的服务账户。简单来说,服务账号,域内用户的一种类型,服务器运行服务时所用的账号,将服务运行起来并加入域。例如MS SQL Server在安装时,会在域内自动注册服务账号SqlServiceAccount,这类账号不能用于交互式登录,也就是说无法通过SqlServiceAccount来通过3389进行rdp登录。
看一下具体的域委派的流程,参考域渗透攻防指南

域用户 xie\test 以 Kerberos 身份验证访问 Web 服务器,请求下载文件。但是真正的文件在后台的文件服务器上。于是,Web 服务器的服务账号 websrv 模拟域用户 xie\test,以 Kerberos 协议继续认证到后台文件服务器。后台文件服务器将文件返回给 Web 服务器,Web 服务器再将文件返回给域用户 xie\test 。这样,就完成了一个委派的流程。
委派的分类
- 非约束委派(Unconstrained Delegation, UD)
- 约束委派(Constrained Delegation, CD)
- 基于资源的约束委派(Resource Based Constrained Delegation, RBCD)
非约束委派
先来看一下非约束委派的流程

具体流程:
1 | (1)用户通过发送一个 KRB_AS_REQ 消息,向 KDC 密钥分发中心 KDC 的 AS认证服务进行身份验证,请求一个可转发的 TGT1 认购权证。 |
用大佬总结的原理就是用户B想访问服务A,于是向KDC提交认证,KDC发现A是非约束性委派,会把TGT放在ST中一并给用户B。然后用户B用这个ST去访问服务A,服务A就相当于获得了用户B的TGT,把TGT放入lsass进程,然后就可以拿着用户B的TGT以用户B的身份去访问该用户权限能够访问的服务了。所以其实在我们攻击者的视角来看的话就是如果控制了一台配置了非约束委派的机器,就可以诱骗其他用户来访问这台机器来获得他们的TGT。
具体利用方式有三种参考以下文章
https://forum.butian.net/share/1591
约束委派
为了在 Kerberos 协议层面对约束性委派的支持,微软对 Kerberos 协议扩展了两个子协议 S4u2self(Service for User to Self) 和 S4u2Proxy (Service for User to Proxy )。S4u2self 可以代表任意用户请求针对自身的 ST 服务票据;S4u2Proxy 可以用上一步获得的 ST 服务票据以用户的名义请求针对其它指定服务的 ST 服务票据。
还是同样的先来看看流程

1 | (1)用户向 Service1 发出请求,用户已通过身份验证,但 Service1 没有用户的授权数据,这通常是由于用户的身份验证是通过 Kerberos 以外(基于表单的 web 认证、NTLM 认证等)的其他方式验证的。 |
还是记录下大佬的总结
由于服务用户只能获取某个用户(或主机)的服务的ST1而非TGT , 所以只能模拟用户访问特定的服务 ;但是如果能够拿到约束委派用户(或主机)的明文密码或hash,那么就可以伪造S4U的请求,伪装成服务用户以任意用户的权限申请访问指定服务的ST2。
具体利用还是参考上面的链接。
基于资源的约束性委派
看下流程图:

1 | ①:服务 A 使用自己的服务账号密码向 KDC 申请一个可转发的 TGT 认购权证。 |
原理
在windows server 2012开始加入了新功能(基于资源的约束性委派RBCD),而且不需要域管理员去设置相关属性,RBCD把设置委派的权限赋予了机器自身,机器自己可以决定谁可以被委派来控制我,也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD,简单来说就是如果我们拥有了配置某台机器msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限,那么我们就对这台机器拥有完全控制的权限,以下这些拥有配置msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限:
1 | 1.将某机器加入域的域用户 |
我们可以利用域用户添加一个机器账户作为服务1,注意是机器账户,不是普通账户,普通账户没有SPN,因为S4U2self协议会用到SPN,而且通过S4U2Self得到的ST服务票证是不可被转发的,而S4U2Proxy的作用就是将可转发的ST票据转发到其他服务进行委派认证的,但是在基于资源的约束委派过程中,不可转发的ST仍可以通过S4U2Proxy转发到其他服务进行委派认证,并且最后还会返回一张可转发的ST服务票证,如果我们可以在服务2上配置允许服务1的资源约束委派,就可以通过服务1利用S4U2self向KDC请求用于访问自身的票据,在使用S4U2Proxy转发此票据去请求访问服务2的票据,最终就可以模拟任何用户去访问服务2了
攻击条件
1.机器账户:是由某个域用户创建的主机,只要拿下这个域账户,那么就能拿下这个域用户所创建的所有机器账户的最高权限(默认每个域用户能创10个机器账户)
2.拥有一个有权修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的域用户账号密码(将机器拉进域的域用户)、或者在account operators组内的域用户
3.域控需要是server2012和2012 R2以上的(因为2008及以下没有msDS-AllowedToActOnBehalfOfOtherIdentity属性)
4.任意用户对该主机的属性具有写权限,那么这个用户就可以对该主机进行攻击,所以可以枚举域内ACL策略,查看哪些对主机有GenericAll权限,GenericWrite、WriteProperty、WriteDacl等等权限,都是可以的
来一个攻击图

具体利用方式还是参考第一个链接。
约束委派和基于资源的约束委派区别:
传统的约束性委派是“正向的”,通过修改服务账户 A 的”msDS-AllowedToDelegateTo”属性,添加服务 B 的 SPN(Service Principle Name),设置约束委派对象为服务 B,服务 A 便可以模拟任意用户向域控制器请求访问服务 B 的 ST 服务票据。
基于资源的约束性委派则是相反,通过修改服务 B 的”msDS- AllowedToActOnBehalfOfOtherIdentity”属性,添加服务 A 的 SID,达到让服务 A 模拟任意用户访问服务 B 资源的目的。
如图所示

参考文章:
https://mp.weixin.qq.com/s/LXeFNmHaAwi3fnZ3AJaFiQ
https://mp.weixin.qq.com/s/mALL2koAmEONSsrSudaAdA
https://forum.butian.net/share/1591
谢公子域渗透攻防指南