kerberos简介
Kerberos协议是一种基于第三方可信主机的计算机网络协议,它允许两个实体之间在非安全网络环境(可能被窃听、被重放攻击)下以一种安全的方式证明自 己的身份。
简单说,就是A和B之间有一个秘密,A需要向B证明自己是A。
Domain Controller:域控,一台计算机实现用户、计算器的统一管理。
KeyDistribution Center:秘钥分发中心,简称KDC,默认安装在域控。
Authentication Service:身份认证服务,简称AS,用于KDC对Client认证。
Ticket Grantng Service:票据授予服务:简称TGS,用于KDC向Clinet和Server分发Session Key
Active Directory:活动目录,简称AD,存储用户、用户组、域相关的信息。
Client:客户端,指用户
Server:服务段,某台计算机或者服务
Kerberos认证流程
- Client向DC发起访问Server的请求,DC需要判断Client是否可信。怎么判断?去AD上依次查找Client,这就是AS需要完成的工作。
- 认证通过后返回TGT给Client,Client得到TGT(Ticket Granting Ticket)。
- Client拿着TGT,继续向DC发起请求访问Server,TGS通过Clinet中的TGT判断Client是否有访问权限。
- 如果Client有访问权限,TGS给Clinet访问Serve的权限ticket,叫ST,Service Ticket。
- Client得到Ticket后,再去访问Server,而且这个Ticket只针对这个Server。
- Server和Client建立通信。
Client想访问server,先要去AS认证自己的身份。认证通过后,AS会返回给Client一个TGT。Client再拿着TGT在TGS中判断是否有访问Server的权限。如果有权限,TGT交换成Ticket,给Client和Server继续进行通信、
Authentication 1
- 首先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。
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,建立通信。
证通过后,回复KRB_AP_REP,建立通信。
至此。kerberos 认证流程结束。
扩展
黄金票据
Golden Ticket 是通过伪造的TGT(TicketGranting Ticket),因为只要有了高权限的TGT,那么就可以发送给TGS换取任意服务的ST。可以说有了金票就有了域内的最高权限。
每个用户的Ticket都是由krbtgt的密码Hash来生成的,那么,我们如果拿到了krbtgt的密码Hash,其实就可以伪造任意用户的TICKET,
对于攻击者来说,实际上只要拿到了域控权限,就可以直接导出krbtgt的Hash值,再通过mimikatz即可生成任意用户任何权限的Ticket,也就是Golden Ticket。
白银票据
SilverTickets 是由Server的NTLM Hash进行加密的,如果该Hash泄露,那么就可以解密甚至伪造Ticket。伪造的Ticket(TGS)叫做白银票据。
PAC
Privilege Attribute Certificate(特权属性证书),简称PAC,为了增加了认证过程中的权限认证。PAC会被放在TGT里发送给Client,然后由Client发送给TGS。
ms14-068 漏洞,就是基于PAC认证的错误,从而导致域内普通用户可以伪造凭据,提权到管理员权限。