抓包分析kerberos协议中的每个字段
环境:
域:love.com
使用用户 tom123 登录win2012机器
先大概看下 kerberos认证流程,如下两张图:
解释一下一些名词:
KDC(key distributed center)
作用:整个安全认证过程的票据生成管理服务,其中包含两个服务和kerberos数据库,AS和TGS,默认安装在域控中
AS(authentication service)
作用:为client生成TGT的服务
TGS(ticket granting service)
作用:为client生成某个服务的ticket
AD(account database) 这里不是Active Directory
作用:存储所有client的白名单,只有存在于白名单的client才能顺利申请到TGT
TGT(ticket-granting ticket)
作用:用于获取服务ticket的票据
看下抓到的数据包
AS-REQ
客户端首先向 AS发送请求,主要内容包括客户信息、加密方式等,其中还有一个使用自身hash作为密钥加密的时间戳
展开数据包:(多张截图)
解释字段含义:
pvno
表示kerberos的版本,这里为v5
msg-type
表示消息类型,这里为as-req
padata
-
PA_ENC_TIMESTAMP 认证数据,使用用户hash作为密钥加密的时间戳 -
PA_PAC_REQUEST 是否启用PAC,KDC会判断票据是否携带PAC
req-body
里面包含很多字段
kdc-option
一些选项,用于设置票据,以及修改KDC的行为
cname & realm
realm表示所在域,cname包含客户端信息,如用户名tom123。name-type 表示用户类型,具体如下:
sname
表示被请求服务信息,所在域名,till为到期时间,rtime绝对到期时间(若请求为可更新票据),nonce为生成的随机数
etype
加密类型,定义解密用户hash的加密方式
addresses
客户端相关信息
AS-REP
AS收到请求后,会根据用户名查找hash,找到hash后,会尝试进行解密,解密成功则会创建TGT 票据,并且向本地 LAS请求生成一个特殊的数据 PAC(用于验证用户身份)。 AS会向客户端返回两部分内容:
-
短期会话密钥SessionKey:
使用用户hash进行加密 -
TGT:
包含有关用户名、时间,域、PAC等信息,使用 krbtgt的hash加密
数据包如下
其中很多字段和 AS-REQ一样,我们就看不一样的
ticket
TGT票据,使用krbtgt用户的hash加密
enc-pacrt
SessionKey 短期会话密钥,是一串随机字符串,然后使用用户hash进行加密
AS-REQ | AS-REP的主要目的就是获取 TGT 票据和短期会话密钥,客户端得到两个东西后会将其缓存到本地,并尝试使用自身 hash 进行解密得到原本的密钥 SessionKey,如果中途被篡改则无法解密成功
TGS-REQ
接下来客户端需要获取 ST 。客户端使用自身的 Hash解密即可得到 Sessionkey,再使用 SessionKey 对客户端信息和时间戳加密得到新的密钥,再把新密钥同TGT及访问的服务名(SPN)等一起发送给 TGS(黄金票据就是利用这步)
查看数据包:
padata
有许多地方不一样。看ticket。里面的enc-part就是TGT,原封不动。authenticator即用SessionKey对客户端信息和时间戳加密,得到的新密钥,是下一步认证所需密钥。 ap-option则为影响请求处理的一些选项,具体如下:
pa-pac-options则为规定PAC中的一些选项,比如说委派
sname
请求的服务名称,这里为登录的机器win2012
TGS-REP
TGS收到请求后,会先验证请求的服务是否存在,存在则使用krbtgt的hash解密TGT,得到SessionKey,用户信息,时间戳等等,再用SessionKey解密AS-REQ发过来的请求中的authenticator,得到客户信息和时间戳。此时得到了两份时间戳,一个来自TGT,一个来自authenticator。对比两个时间戳,相差太远需要重新认证。还会验证用户信息,判断是否有权限访问此服务。验证通过后,会生成一个新的随机数(Server Session Key),TGT也会向客户端返回两部分内容:
-
远程服务端部分:
也就是ST, 包含Server Session Key,用户信息,时间戳,使用服务对应的hash加密 -
客户端部分:
包含Server Session Key,使用AS-REP 返回的短期密钥加密
数据包如图:
ticket
此票据就是ST,使用服务对应的hash加密
enc-part
使用短期会话密钥SessionKey加密的Server Session Key
AP-REQ
此步骤在本地完成,抓取不到包了。客户使用缓存的短期会话密钥 Sessionkey 解密上述提到的客户端部分,得到Server Session Key,由于ST是用服务对应密钥加密的,客户端不知道此密钥,无法解密。客户端会使用ServerSessionKey加密客户端信息,时间戳得到新的密钥,并把它和ST一起发送给服务。
AP-REP
服务端用自己的hash解密收到的ST,得到客户端信息,时间戳,ServerSessionKey,再用此ServerSessionKey解密新密钥,再次得到客户端信息,时间戳。对比时间戳,间隔过长则认证失败(一般为8小时)。如认证通过,服务端会再次先KDC发送PAC,KDC收到PAC会使用krbtgt的hash进行解密,KDC通过SID判断用户权限等,并将信息返回给服务端。服务端将此信息和用户请求资源的ACL进行对比,判断是否提供服务。
注意: 并不是所有服务PAC都开启,没有验证PAC可能会导致白银票据攻击