前言
内网渗透大多数为域渗透。学习域渗透kerberos协议就是绕不过的一个难点,白银票据、黄金票据、攻击域控都离不开kerberos。这里把对kerberos认证的过程进行整理,理解错误的地方也请各位指正。
kerberbos 协议
简介
Kerberos协议是一种基于第三方可信主机的计算机网络协议,它允许两个实体之间在非安全网络环境(可能被窃听、被重放攻击)下以一种安全的方式证明自己的身份。
简单说,就是A和B之间有一个秘密,A需要向B证明自己是A。
来源
直接的方式就是A用秘密做秘钥加密文字生成密文,把密文和文字一块发送给B,B再用秘密解密得到明文,把明文和文字进行对比。若一致,则证明是A。
但是网络中,密文和文字很有可能被窃取。只要时间足够,总能破解秘钥。所以不能使用这种长期有效的秘钥。
改为短期的临时秘钥。那么这个临时秘钥需要一个第三方可信任的机构来提供(KDC)。
到此,kerberbos 三个狗头就到齐了,Client、Server、KDC。
key 概念
刚刚我们说过,因为在网络中,需要使用临时秘钥来代替长期有效的秘钥。这里就有两个概念。
Long-term Key/Master Key
有些长期保持不变的秘钥(Key),比如你的密码、存储在计算机的NTLM-Hash。这样的Key被称为Long-term Key,也叫Master Key。这样的Key不应该在网络上传输,因为容易被截获、被解密。
Short-term Key/Session Key
短暂临时的Key来取代Master Key,这种Key被称为Short-term Key,也叫Session Key。用Session Key来加密需要进行网络传输的数据。因为这种Key只在一段时间内有效,即使被加密的数据包被黑客破解,等他把Key计算出来的时候,这个Key早就已经过期了。
概念
下面我们通过一张图来介绍几个概念。(自己画的比较丑)
Domain Controller (域控制器),简称DC,一台计算机,实现用户、计算机的统一管理。
KeyDistribution Center(秘钥分发中心),简称KDC,默认安装在域控。
Authentication Service(身份验证服务),简称AS,用于KDC对Client认证。
Ticket Grantng Service (票据授予服务),简称TGS,用于KDC向Client和Server分发Session Key。
Active Directory(活动目录),简称AD,用于存储用户、用户组、域相关的信息。
Client 客户端,指用户。
Server 服务端,可能是某台计算机,也可能是某个服务。
粗略理解
我们开始看图说话,先大致走一遍这个流程。从图一我们可以看到大致分为6步。
1.
首先Client向DC请求访问Server,DC判断Client是否可信。怎么判断?去AD中查找依次区分Client。这就是AS服务完成的工作。
2.
认证通过后返回TGT给Client,Client 得到TGT(Ticket Granting Ticket)。
3.
Client继续拿着TGT请求DC访问Server,TGS通过Client消息中的TGT,判断Client是否有访问权限。
4.
如果有,给了Client访问Server的权限ticket,也叫ST(Service Ticket)。
5.
Client得到ticket,再去访问Server,且该ticket只针对这个Server。
6.
Server和Client建立通信。
总结来看
Client要访问Server,先去AS认证自己的身份。认证通过后AS返回给Client一个TGT。Client再拿着TGT在TGS中判断是否有访问Server的权限。如果有权限,TGT交换成Ticket,给Client用于和Server通信。
细细解读
我们简单走了一遍kerberos认证的流程。下面我们分为三步认证(Authentication)细细解读。
Authentication 1
Client和AS的认证,我们结合下图仔细解析。
首先Client要发送自己的信息向AS请求TGT票据。
该请求称为KRB_AS_REQ
:即Client 哈希值NTLM-hash对数据(timestamp、client-info、server-info) 进行加密。
当Client发送身份信息给AS后,AS会先向AD请求,询问是否有此用户,如果有的话,就会取出它的NTLM hash,然后生成一个随机秘钥称为Session-Key as(临时秘钥Session-Key)。并使用Client NTLM-hash 加密Session-key as 作为一部分为内容。
还有一部分内容就是TGT:使用KDC一个特定账户的NTLM-hash对Session-key as、timestamp、Client-info进行的加密。这个特定账户就是krbtgt(创建域控时自动生成)。
然后将这两部分回复给Client。即KRB_AS_REP
至此,kerberos 第一步请求完成。
Authentication 2
Client和TGS的认证,我们结合下图仔细解析。
Client收到回复KRB_AS_REP
,先用自己的Client NTLM-hash 解密得到Session-Key as,并使用Session-Key as 加密数据(timestamp、Client-info、Server-info)作为一部分。
TGT是用krbtgt 账户的NTLM加密的,Client无法解密,将TGT作为另一部分继续发送给TGS。
两部分组成即为KRB_TGS_REQ
。
TGS收到该请求,用krbtgt NTLM-hash 先解密TGT得到Session-key as、timestamp、Client-info、Server-info。再用Session-key as 解密第一部分内容,得到Client-info、timestamp。
将两部分获取到时间戳timestamp进行比较,如果时间戳跟当前时间相差太久,就需要重新认证。
TGS还会将这个Client的信息与TGT中的Client信息进行比较,如果两个相等的话,还会继续判断Client有没有权限访问Server,如果都没有问题,认证成功,返回ST(也叫Ticket)给Client。
认证都通过后,TGS会生成一个随机秘钥(Session-Key tgs)。向Client回复KRB_TGS_REP
两部分内容。
一部分:Session-key as 加密的Session-key tgs
一部分ST(ticket):Server NTLM-hash加密的数据(Session-key tgs、timestamp、Client-info)
注意Session-key tgs 主要用在Client和Server的通信上。
至此,Client和KDC的通信就结束了,然后是和Server进行通信。
Authentication 3
Client和Servre的认证,我们结合下图仔细解析。
Client收到KRB_TGS_REP
,先解密出了Session tgs。再使用Session tgs加密Client-info、timestamp作为一部分内容。ST因为使用的是Server NTLM-hash 进行的加密,无法解密。原封不动发送给Server。两部分一块发送给Server即是KRB_AP_REQ
。
Server 收到请求,用自身的Server NTLM解密了ST,得到Session tgs,再解密出Client-info、timestamp。然后与ST的Client-info、timestamp进行对比。timestamp 一般时间为8小时。验证通过后,回复KRB_AP_REP
,建立通信。
至此。kerberos 认证流程结束。
扩展
黄金票据
krbtgt 的NTLM Hash如果泄露了,那么TGT就能被解密甚至伪造。伪造的TGT叫做黄金票据。
白银票据
ST(Ticket )是由Server的NTLM Hash进行加密的,如果该Hash泄露,那么就可以解密甚至伪造Ticket。伪造的Ticket 叫做白银票据。
PAC
Privilege Attribute Certificate(特权属性证书),简称PAC,为了增加了认证过程中的权限认证。PAC会被放在TGT里发送给Client,然后由Client发送给TGS。
ms14-068 漏洞,就是基于PAC认证的错误,从而导致域内普通用户可以伪造凭据,提权到管理员权限。
参考资料
深入解读MS14-068漏洞:微软精心策划的后门?
Kerberos协议探索系列之扫描与爆破篇
Windows认证 | 域认证
彻底理解windows认证