简介
Kerberos协议通过密钥系统为客户端与服务提供认证服务,为了解决当客户端去访问一个服务器的某服务时,服务器如何判断该对象是否有相关权限来访问自己的服务,同时数据在传输过程中即便被篡改也不会影响整个通讯的安全
概念
DC(Domain Controller)域控
KDC(Key Distribution Center )密钥分发中心
AD(Account Database)账户数据库:存储客户端白名单,只有白名单中的对象才可申请TGt
TICKET票据:域内访问凭证
TGT(Ticket granting ticket)票据中心授予的票据:包含用户id、地址、票据有效期,用于向KDC获取服务票据
AS(Authetication Service)身份验证服务:认证客户端身份,为客户端生成TGT的服务
TGS(Ticket Grantins Service)票据中心授予的服务:为客户端生成的某个服务的ticket
ST(Server Ticket)服务票据:由TGS进行发布
本地环境
域控:
192.168.3.142 OWA2010SP3@0day.org
域成员:
192.168.3.68 SRV-DV-0DAY@0day.org
域成员机器使用域账户登录,wireshark抓包如下:
数据包分析
主要步骤如下
AS-REQ与AS-REP(AS验证客户端身份)、TGS-REQ与TGS-REP(客户端获得ST)、AP-REQ、AP-REP(客户端请求服务)
AS-REQ数据包
此处域用户登录域成员终端将输入相关账户密码,也就向AS发送了一个AS-REQ的请求,主要包含用户名、主机名、加密类型、Autherticator等:
pvno
代表Kerberos版本,这里代表kerbev5
msg-type
此处为此阶段的krb-as-req
patata
ENC-TIMESTAMP,预认证数据,用户密码hash作为密钥加密时间戳,加密后发送至AS,AS使用用户密码hash进行解密,若解密成功且时间戳在范围内则认证成功
PA_PAC_REQUEST,启用PAC支持的扩展,KDC通过对应的include判断票据是否携带PAC
req-body
kdc-options
可理解为标志位字段
cname
主要包含登录用户及所在域,此处为jack与0DAY
使用krbtgt账户登录区别如下
使用账户名@域名登录区别如下
以下为认证失败的情况,查看AS-REP不同结果以此可对域用户账户进行枚举
使用不存在的域用户进行登录:
返回信息如下:
使用存在的域用户错误的密码进行登录:
返回信息如下:
sname
被请求的服务信息,所在域名,till为到期时间,rtime绝对到期时间(若请求为可更新票据),nonce为生成的随机数
etype
加密类型,通过该字段的加密类型来选择用户hash进行解密
addresses
客户端相关信息
AS-REP数据包
客户端发送AS-REQ请求凭证是用户hash加密的时间戳,凭证在padata内,当AS收到后,AS通过用户hash进行解密,获得时间戳,若解密成功则代表预认证成功,接着将发送响应包,主要包含krbtgt用户hash加密后的TGT票据及用户hash加密的 login session key,如下数据包很多一部分与先前的AS-REQ同理,不再重复赘述:
ticket
krbtgt用户hash进行加密的TGT票据,因为域内ticket都由krbtgt hash进行加密,假设可获得krbtgt的hash、sid可进行伪造黄金票据;tkt-vno为票据的版本号、realm为颁发票据的域名称、sname为票据对应的服务端、enc-part为KDCkrbtgt密钥加密的票据
确认sname与先前的AS-REQ内一致:
enc-part
这里加密使用的是用户的hash与ticket中的enc-part不同,包含login session key,属于下一步客户端与KDC认证的密钥:
当前流程阶段为客户端与AS之间的交互,主要为了获得TGT及login session key并缓存于本地,客户端将使用自身hash解密login session key获得原始的login session key
TGS-REQ数据包
此处用户已通过AS-REP获得TGT票据、login session key后,下一步需获取ST,因用户访问相关服务时需要ST进行校验,数据包着重关注先前不同点
patata
主要包含TGT与authenticator:
其中ticket部分中enc-part同AS-REQ得到的TGT票据一致,为先前得到的TGT,用此TGT票据请求TGS获得ST::
ticket部分中authenticator,通过先前AS-REQ的login session key作为密钥加密的时间戳,属于下一步认证使用的会话密钥:
sname
请求的服务名称,这里是要登录的主机:
TGS-REP数据包
当TGS收到请求后将检查是否拥有用户请求的服务,若服务存在,通过krbtgt hash解密TGT获得login session key,再用login session key解密authenticator,将校验对方身份、时间戳是否过期,校验通过后将发送ST票据
ticket
这里返回的其实是ST,enc-part使用服务对应的密钥进行加密
enc-aprt
经过login session key(AS-REP)加密的service session key,包含服务身份信息等,用于请求服务时的会话密钥
当前阶段流程完成认证将发送给客户端两项内容,TGS生产的ST,以及AS-REP返回的login session key加密的service session key
任意用户只要hash正确都可以请求域内任何一个服务票据
AP-REQ
这里其实都是本地服务了,wireshark也抓不到包,客户端收到服务端返回的ST与enc-part,使用缓存的login session key解密enc-part获得service session key,本地缓存server session key与ST,请求服务时将ST和service session key加密后的时间戳信息发送给server
AP-REP
server收到相关数据,使用service key解密TGS的ticket的enc-part,获得service session key,使用service session key解密authentication后对authenticator进行验证,通过后返回新的时间戳,客户端通过service session key解密返回的时间戳,进行验证,通过则证明客户端可信赖服务器,并发送服务请求,服务器对客户端提供相应服务
参考
https://xz.aliyun.com/t/8187
https://www.t00ls.net/viewthread.php?tid=54843