Kerberos协议理解

一、kerberos简介

  Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为主机 / 服务器应用程序提供强大的认证服务。Kerberos协议作为可信任的第三方认证服务并不依赖主机认证,在设计时就假设数据在传输过程中被任意读取、修改也不影响通讯的安全性。

二、Kerberos认证角色

Client 访问服务的客户机

Server 提供服务的服务器

KDC(Key Distribution Center)密钥分发中心

三、相关概念

KDC不是一个独立的服务,由两部分构成:

Authentication Service(AS): 身份认证服务

Ticket Grant Service(TGS): 票据分发服务

Account Database(AD):类似于主机SAM机制的数据库,用于储存client的白名单。

  其中Authentication Service(AS)对client进行验证,看其是否在AD白名单里,验证通过后,AS生成Ticket Granting Ticket(TGT)票据给client。

Ticket Grant Service(TGS):当client携带之前AS颁发的TGT进行请求服务时,TGS会生成server端的票据ST(Server Ticket)给client。

Server Ticket(ST):TGS生成的票据,client将携带ST请求server。

四、Kerberos认证流程

1. AS-REQ:

  Client访问域中的服务时,输入账号密码,本机的Kerberos服务向KDC的AS发起请求,请求的内容包括:用户名、主机名、client密码的NTLM hash加密的时间戳、加密类型等内容。

用户是否存在根据error-code判断

error-code: eRR-PREAUTH-REQUIRED (25) 表示用户存在

error-code: eRR-C-PRINCIPAL-UNKNOWN (6) 表示用户不存在

AS-REQ数据包

字段分析:

pvno: 5 表示Kerberos协议版本,Kerberos V5

msg-type: krb-as-req (10) 表示消息类型

pa-data: pre-authentication data 预认证信息数据,每个认证信息包含type和value

在AS-REQ认证过程中用到了PA-DATA PA-ENC-TIMESTAMP和PA-DATA PA-PAC-REQUEST两个部分。

1. PA-DATA PA-ENC-TIMESTAMP

  这个是使用户的NTLM HASH进行加密的时间戳,作为value发送给KDC的AS,AS通过数据库中对应用户的NTLM HASH进行解密得到时间戳,如果时间戳在指定范围内,则认证通过。

2. PA-DATA PA-PAC-REQUEST

  PAC(Privilege Attribute Certificate)是微软后期引进的拓展,KDC根据value的值来判断票据是否携带PAC,PAC包含用户的sid、用户所在的组,仅KDC能制作和查看,后期server可根据票据中的PAC向KDC进行求证用户是否有权限访问,从而有效防止白银票据攻击。

Req-body

kerberos.kdc_options:一组十六进制的标识,用于表示票据状态、是否过期等

https://docs.microsoft.com/en-us/windows/security/threat-protection/auditing/event-4768

cname:主要包含请求的用户名和所在的域

sname:主要包含的是krbtgt(KDC中一个特殊用户),域名。

till:到期时间

nonce:随机数

entype:加密类型,KDC根据加密类型选择用户的NTLM HASH对数据进行加解密

2. AS-REP:

  Client发送AS-REQ,KDC的AS收到后,通过所储存对应用户的的NTLM HASH进行解密得到时间戳,如果时间戳在规定范围内,则预认证通过。AS向Client 发送响应包,响应包中含有使用krbtgt用户NTLM HASH加密的TGT票据;使用用户NTLM HASH进行加密的16位随机生成的字符串即Login Session key(用于后续通讯)

AS-REP 数据包

字段分析

Ticket:这是使用krbtgt用户NTLM HASH加密的TGT票据,client是无法进行解密的

tkt-vno:票据格式的版本号

realm: 派发该票据域的名称

sname:该票据所属的服务端的身份

enc-part:用krbtgt用户NTLM HASH加密的票据部分

enc-part:这个不同于ticket里面的,这个是使用用户NTLM HASH进行加密的16位字符串,Client解密后使用Login Session key用于后续通讯加密。

3. TGS-REQ:

  Client收到AS-REQ对其进行解密得到了Login Session key,以及加密的TGT票据,再向KDC发起请求,请求时使用Login Session key进行加密,并携带TGT票据以及请求的服务等,从而换取ST(server ticket)。

TGS-REQ数据包:

主要由padata和req-body两部分构成。

Padata:

在padata->ap-req携带者着ticket,这个就是AS-REP中的TGT票据,我们可将enc-part中cipher值与AS-REP中ticket里面的值进行对比。

Padata->req-> authenticator 这个用Login Session key加密的,用于后续通讯。

Req-body:
realm:域名

sname:请求的服务,这里抓取得数据包是域主机登录认证,故为host

其余字段已在之前叙述过。

4. TGS-REP:

  KDC收到请求后,通过krbtgt的NTLM HASH进行解密TGT,并用解密出的Login Session key解密authenticator字段。之后检查时间戳是否在规定时间内、票据是否过期、TGT中信息与authenticator中信息是否一致,验证通过后TGS生成ST(server ticket)并用请求服务的NTLM HASH进行加密,再使用Login Session key加密server session key一并发给Client。

TGS-REP数据包:

Tgs-rep->ticket 这个就是ST(server ticket)

Tgs-rep->ticket->enc-part 使用请求服务的NTLM HASH进行加密的内容

Tgs-rep->enc-part 使用Login Session key加密的内容

  由于抓取的数据包时域用户登录时的,之前请求的服务是pc-jerry-kit的host,之后还会请求LDAP认证所以后续还会通过TGS-REQ、TGS-REP,只是请求认证的内容有所不同,但是会携带TGT去请求。

pc-jerry-kit的host请求:

OWA2013的LDAP认证服务请求:

  请求时会携带TGT票据,对比host请求时kdc-options:发生了变化canonicalize的值变成了False,即规范化变成了false。当然TGS-REP返回的是LDAP的ST,client再次访问LDAP服务。

5. ST通过认证服务

  Cilent收到TGS-REP,通过Login Session key解密得到ST、Session Key,并用ST和authenticatior(Session Key和时间戳)加密后发给server。若开启了PAC认证服务,server解密ST得到PAC并向KDC求证client是否有权限访问,KDC会根据SID判断用户的信息和用户的权限,并将结果返回给server,server再与用户所索取的资源的 ACL 进行比较决定是否提供服务。

  同时client也会验证server,server发送使用server session key加密的时间戳给client,client解密后双向验证通过,client访问服务。

AP-REQ:

AP-REP:

  Cilent向服务发起请求时,server向Kerberos核实ticket是否有效,因为请求的服务为LDAP,所以请求和响应都在LDAP报文中。

  如果未开启PAC认证,且知道了服务的NTLM HASH。便可以伪造一个不经KDC认证的ST然后进行白银票据攻击。因为server 不知道server session key是什么,用自身的NTLM HASH解密后的ticket得到的server session key与携带的相同,且时间戳在范围内便提供服务。