windows认证-白银票据、黄金票据分析及利用

作者: H0r2yC 分类: 内网渗透,漏洞利用 发布时间: 2019-08-17 01:57

0x01 前言

虽然windows域在平时遇到的不多,但总要了解一下相关的知识熟悉一下。最近研究windows认证和白银黄金票据,花费了大把精力和时间,踩坑无数,做一个总结希望可以给大家带来一些帮助。

0x02 windows认证

在分析白银票据和黄金票据之前,有必要提一下windows认证过程,这样才能从根本理解漏洞利用。windows域目前仍使用kerberos认证,与本地认证以及网络认证一样,都属于windows认证方式。这里我们假设访问server机器的共享文件夹为场景来说明认证的过程,客户端登录的用户为user1,server登录用户为user2。

1.客户端向AS请求

首先客户端会先向AS发送请求,但是为了保证传输安全,客户端会使用已登录用户(user1)的Hash加密请求包中的timestamp(时间戳)部分,而域中所有用户的信息(包括hash)都保存在AD中,这样就只有DC和客户端可以对请求包进行解密,请求包中需要包含的内容有:

Pre-authentication data:被客户端加密的timestamp内容

Client name & realm:客户端用户名,如user1/h0r2yc.cn

Server Name:KDC、TGS 的 Server Name。

2.AS认证通过后发送TGT给客户端

AS接收到客户端发来的请求包后,会根据请求包中的用户名(user1)向AD请求user1对应的hash,然后用hash解密出timestamp,如果解密出的timestamp和当前时间未超过5min,验证通过,KDC会生成一个使用user1的hash加密的logon session key,以及一个用krbtgt(用于 Kerberos 身份验证的账户) hash加密的TGT,然后发送给客户端,TGT的有效期为8个小时,TGT中包含的内容大体有:

Logon Session Key:会话凭证

Client name & realm:客户端用户,如user1

End time: TGT到期的时间

客户端接收到数据,使用user1 hash解密出logon session key,但是TGT使用krbtgt hash加密,客户端没有对应的hash所以没办法解密。有了logon session key就可以进行第三步。

3.客户端向TGS发送TGS请求包

​客户端接收到AS发送回来的数据后,向TGS发送请求包,请求包大体上包含以下内容 :

TGT:通过向AS请求获得的TGT

Authenticator:客户端使用logon session key加密的联络暗号

Client name & realm:客户端用户,如user1

Server name & realm:客户端要访问的服务端的用户名

Pre-authentication data:被客户端加密的timestamp内容

4.TGS认证通过后发送Ticket以及session key

TGS接收到客户端发来的请求后,使用krbtgt hash解密TGT得到logon session key,在使用logon session key解密Authenticator得到联络暗号,认证通过。认证通过后TGS生成使用logon session key加密的session key(session key用于客户端和server进行通讯),再生成一个使用user2 hash加密的ticket,然后发送给客户端。Ticket大体包含以下内容:

Session Key:用于客户端和server通讯的key。

Client name & realm: 客户端用户,如user1

End time: Ticket的到期时间

5.客户端向server发送请求

客户端接收到数据后,使用logon session key解密出session key,有了session key和Ticket后,就可以直接与server进行交互,无需再通过KDC认证。这时候客户端创建一个使用session key加密的Authenticator和timestamp(时间戳),然后客户端将加密过的timestamp、Authenticator以及ticket,还有一个询问是否需要双向验证的flag发送给server。

6.server验证通过允许访问

server接收到请求包后,使用user2 hash解密Ticket得到session key,再使用session key解密Authenticator和timestamp,如果timestamp和当前时间不超过5min,验证通过,允许访问。

举一个简单的例子:你想坐飞机,但是机场告诉你必须有机票(TGT)才可以登机,接着你去购票处(AS)出示身份证(Client name)购买了一张机票(TGT),你拿着机票登机,在检票处(TGS)出示机票,服务人员告诉了你的座位号(Ticket),然后就可以坐到自己的位置上。

0x03 白银票据分析及利用

白银票据不与KDC交互,伪造Ticket直接与server进行交互。我们来看一下windows认证的第六步,server接收到客户端的数据包后,使用自己的密码hash解密ticket得出session key,在使用session key解密Authenticator和timestamp即通过验证,所以我们只需要知道server用户的hash就可以伪造出一个ticket,这就是白银票据。
首先,我们访问一个目标机器的C$文件夹

我们来伪造白银票据,获取目标server用户名

获取NTLM Hash

创建票据命令为:

kerberos::golden /domain:<域名> /sid:<域 SID> /target:<目标服务器主机名> /service:<服务类型> /rc4:<NTLM Hash> /user:<用户名> /ptt

白银票据根据用户hash生成,而且只能根据某些服务创建,可利用的服务如下

服务注释服务名
WMIHOST、RPCSS
Powershell RemoteingHOST、HTTP
WinRMHOST、HTTP
Scheduled TasksHOST
LDAP 、DCSyncLDAP
Windows File Share (CIFS)CIFS
Windows Remote ServerAdministration ToolsRPCSS、LDAP、CIFS

生成票据

这时候再访问c$,不需要输入密码

0x04 黄金票据分析及利用

第二步中我们收到了AS发送的TGT,由于TGT是使用krbtgt密码hash加密,客户端无法解密,但是如果我们知道了krbtgt的hash,那么就可以直接生成任意用户的TGT,跳过了第一步的认证并可以访问相应的资源,这就是伪造黄金票据。

域控导出krbtgt NTLM Hash

生成黄金票据

kerberos::golden /user:Administrator /domain:domain-name /sid:user-sid/krbtgt:ntlmhash-value /ticket:golden.ti

在目录下生成了golden.ti票据文件,使用票据

kerberos::ptt golden.ti

这时候生成了一个域管理用户票据,尝试访问其他用户资源,成功,无需验证

0x05 小结

白银票据测试了两天一直没成功,试过好多种方法,最后总结一下,我用自己搭建的简易域老是不成功,最后在朋友环境成功复现攻击,域环境是失败的一方面因素,另一方面是对一些参数有误解导致失败。命令中的sid为域ID,即去掉最后一个-及之后的数字的剩余部分;target顾名思义是目标机器名,使用hostname可以查看,再加上域地址;user可以为任意用户,甚至是不存在的用户,因为我们伪造了TGT或者Ticket都是跳过了第一步AS请求,所以哪怕用户不存在票据也是有效的,隐蔽性较高。

感兴趣的同学欢迎关注我的公众号,原创不易,希望大家可以提出改进意见。

本文参考资料:

https://payloads.online/archivers/2018-11-30/1

https://blog.csdn.net/wy_97/article/details/87649262

https://www.varonis.com/blog/kerberos-attack-silver-ticket/

https://adsecurity.org/?p=2011

https://blog.csdn.net/wy_97/article/details/87649262

https://www.varonis.com/blog/kerberos-attack-silver-ticket/

https://adsecurity.org/?p=2011

     

公众号:网安成长笔记

一条评论

发表评论