Kerberos协议
0x00:简介
kerberos 是一种由MIT(麻省理工大学)提出的一种网络身份验证协议,它旨在通过使用加密技术为客户端/服务端应用程序提供强大的认证服务。
Kerberos是西方神话中守卫地狱之门的三头犬的名字。只所以使用这个名字是因为Kerberos需要三方的共同参与,才能完成一次事务处理。
0x01:名词解释
- Domain Controller (域控制器),简称DC,一台计算机,实现用户、计算机的统一管理。
- Key Distribution Center(秘钥分发中心),简称KDC,默认安装在域控里,包括AS和TGS。
- Authentication Service(身份验证服务),简称AS,用于KDC对Client认证。
- Ticket Grantng Service (票据授予服务),简称TGS,用于KDC向Client和Server分发Session Key(临时key)。
- Ticket-Granting Ticket(票据授予票据),简称TGT,用于获取ticket的票据
- Active Directory(活动目录),简称AD,用于存储用户、用户组、域相关的信息。
- Client 客户端,指用户。
- Server 服务端,可能是某台计算机,也可能是某个服务。
- Session Key(临时key) ,也称short-term key,短暂临时的Key来取代Master Key,这种Key被称为Short-term Key,也叫Session Key。用Session Key来加密需要进行网络传输的数据。因为这种Key只在一段时间内有效,即使被加密的数据包被黑客破解,等他把Key计算出来的时候,这个Key早就已经过期了。
0x02:认证过程
如下图
我们开始看图说话,先大致走一遍这个流程。从图一我们可以看到大致分为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建立通信。
详细认证流程
我们简单走了一遍kerberos认证的流程。下面我们分为三步认证(Authentication)细细解读。
Authentication 1
client和AS的认证,我们结合下图分析
首先client要发送自己的信息向AS请求TGT票据
该请求成为KRB_AS_REQ:即Client 哈希值NTLM-hash对数据(timestamp、client-info、server-info) 进行加密。
当Client发送身份信息给AS后,AS会先向AD请求,询问是否有此用户,如果有的话,会向client发送信息,这个信息分为两部分,首先AD会取出这个Client的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_REQ
至此,kerberos 第一步请求完成。这里提一个问题 此时KDC上的Session-key as 还在KDC上吗,能否回答这个问题,意味着能否理解黄金票据的产生及原理。
Authentication 2
Client和TGS的认证,我们结合下图仔细解析。
Client收到KDC的信息后需要回复KRB_AS_REP,先用自己的Client NTLM-hash 解密得到Session-Key as(因为加密密钥是他自己的NTLM-hash),并使用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。为什么KDC不直接使用Session-key as解密client发过来的第一部分数据呢,Session-key as 不是KDC给client发的吗?因为此时的KDC已经把Authentication 1中产生的Session-key as给删了。这也就给了我们伪造Authentication 2的完整条件 Session-key as 和 TGT。
将两部分获取到时间戳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-key as,client在Authentication 1的认证中就已经得到了)。再使用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 认证流程结束。
0x03:扩展
黄金票据:在域认证过程中,经过client与AS的通信会得到TGT,带着TGT向TGS请求,就可以得到票据ticket,用这个ticket可以来访问应用服务器。如果TGT被伪造,即跳过了AS认证,直接进行第二次认证,就可以和任意的Server进行通信。而伪造的TGT叫做黄金票据,也被称为认证票据。
白银票据:如果说黄金票据是伪造的TGT,那么白银票据就是伪造的ST。
在Kerberos认证的第三步,Client带着ST和使用Session tgs加密后的Client-info和timestamp向Server上的某个服务进行请求,Server接收到Client的请求之后,通过自己的NTLM-hash 解密ST,从而获得 Session tgs。通过 Session tgs 解密 加密后的Client-info和timestamp,进而验证对方的身份,验证成功就让 Client 访问server上的指定服务了。
所以我们只需要知道Server用户的Hash就可以伪造出一个ST,且不会经过KDC,但是伪造的门票只对部分服务起作用。
PAC:Privilege Attribute Certificate(特权属性证书),简称PAC,为了增加了认证过程中的权限认证。PAC会被放在TGT里发送给Client,然后由Client发送给TGS。
ms14-068 漏洞,就是基于PAC认证的错误,从而导致域内普通用户可以伪造凭据,提权到管理员权限。