目录
Kerberos
Kerberos 是一种网络认证协议,其设计目标是通过密钥系统为客户机/服务器应用程序提供强大的认证服务。 该认证过程的实现不依赖于主机操作系统的认证,无需基于主机地址的信任,不要求网络上所有主机的物理安全,并假定网络上传送的数据包可以被任意地读取、修改和插入数据。 在以上情况下,Kerberos 作为一种可信任的第三方认证服务,是通过传统的密码技术(如:共享密钥)执行认证服务的。
参与角色
Client Server KDC (Key Distribution Center):
AS (Authentication Service)TGS (Ticket Granting Service)
粗略认证流程
client 向kerberos 服务请求,希望获取访问server 的权限。 kerberos 得到了这个消息,首先得判断client 是否是可信赖的,也就是白名单黑名单的说法。 这就是AS 服务完成的工作,通过在AD 中存储黑名单和白名单来区分client。 成功后,返回AS
与TGT
给 client。 client 得到了TGT
后,继续向kerberos 请求,希望获取访问server 的权限。kerberos 又得到了这个消息,这时候通过client 消息中的TGT,判断出了client 拥有了这个权限,给了client 访问server 的权限ticket
。 client 得到ticket
后,终于可以成功访问server。 这个ticket 只是针对这个server,其他server 需要向TGS 申请。
详细过程
1. Client发送认证请求
首先Client 向KDC 的AS 发送KRB_AS_REQ
:
Pre-authentication data(Client Hash(Timstamp
) Client Info
Server Info
2. AS 返回响应信息
KDC 的AS
(Authentication Service) 收到KRB_AS_REQ
后:
首先生成一个随机的Session Key
; 然后根据Client Info
在AD
(Account Database)中查找到Client 对应的Client Hash
(NTLM Hash)用于加密这个Session Key
,得到Client Hash(Session Key)
; 接着使用KDC的一个特殊用户(krbtgt用户
)的NTML Hash即KDC Hash
加密TGT
,得到KDC Pass Hash(TGT)
;
TGT
(Ticket Gtranting Ticket) = Session Key
+Client Info
最后向Client 发送KRB_AS_REP
:
Client Pass Hash(Session Key)
KDC Pass Hash(TGT)
3. Client 向AS发送身份验证信息
Client 收到KRB_AS_REP
后:
首先使用本地的NTLM Hash解密Client Hash(Session Key)
,得到Session Key
; 然后使用这个Session key
加密Client Info+Timestamp
,得到Session Key(Client Info+Timestamp)
; 最后向AS
发送:
Session Key(Client Info+Timestamp)
Client Info+Server Info
KDC Hash(TGT)
4. AS 验证身份
AS
收到后:
首先解密KDC Hash(TGT)
得到TGT
,并从TGT
中得到Session Key
; 然后使用Session key
解密Session Key(Client Info+Timestamp)
得到Client Info+Timestamp
; 最后比较解密出的Client Info+Timestamp
与第一步收到的Client Info+Timestamp
,如果一致则认证通过。
5. TGS 发送被加密的Ticket
AS
认证通过后,TGS
开始工作:
首先随机生成Server Session Key
,并使用Session Key
加密,得到Session Key(Server Session Key)
; 然后生成一个Ticket
,并使用Server Info
所对应的Server Hash加密,得到Server Hash(Ticket)
;
Ticket
中包含Server Session Key
、ClientInfo
、End Time
;Ticket
与TGT
的区别:将Session Key
变为了Server Session Key
; 最后向Client 发送:
Session Key(Server Session Key)
Server Hash(Ticket)
6. Client 使用被加密的Ticket 向Server 发起请求
Client 收到Session Key(Server Session Key)
和Server Hash(Ticket)
后:
首先使用Session Key
解密Session Key(Server Session Key)
,得到Server Session Key
; 然后使用Server Session Key
加密Client Info
+Timestamp
,得到Server Session Key(Client Info+Timestamp
; 最后向Server 发送Server Hash(Ticket)
和Server Session Key(Client Info+Timestamp)
;
7. Server 收到请求后做验证
Server 收到后:
首先使用本地Server Hash
解密Server Hash(Ticket)
,得到Ticket
; 然后从Ticket
中得到Server Session Key
、Client Info+Timestamp
; 接着使用Server Session Key
解密Server Session Key(Client Info+Timestamp
,得到Client Info+Timestamp
; 最后将解密出来的Client Info+Timestamp
与Ticket
中获取的Client Info+Timestamp
对比,一致则认证通过;
黄金白银票据
白银票据
原理(伪造Server Hash被加密的Ticket)
第6步Client 向Server 发起请求的时候,票据为Server Hash(Ticket)
和Server Session Key(Client Info+Timestamp)
而Server 除了Server Hash
以外,其他都是不知道的; 从而,一旦知道了Server Hash
后,就可以伪造Server Session Key
并生成伪造的Ticket
和伪造的Server Session Key(Client Info+Timestamp)
; 将伪造的Ticket
使用Server Hash
加密,就得到了伪造的Server Hash(Ticket)
; 最后将伪造的Server Hash(Ticket)
和Server Session Key(Client Info+Timestamp)
发送给Srever 即可以验证通过。 特点
需要目标服务的NTML Hash,即Server Hash
; 不需要与KDC 交互; 只能访问指定
服务器;
黄金票据
原理(伪造被krbtgt Hash加密的TGT)
在第三步向AS 发送验证信息的时候,验证消息为:
Session Key(Client Info+Timestamp)
Client Info+Server Info
KDC Hash(TGT)
而AS
又是使用KDC Hash
(krbtgt Hash)解密KDC Hash(TGT)
得到TGT
,并从TGT
中获得session Key
; 最后再利用Session Key
去解密Session Key(Client Info+Timestamp)
获得Client Info+Server Info
,去对比未加密的Client Info+Server Info
是否一致从而验证客户端身份; 所以,如果知道了KDC Hash
(krbtgt Hash)就可以伪造session Key
,从而伪造KDC Hash(TGT)
,进而发送伪造的:
Session Key(Client Info+Timestamp)
Client Info+Server Info
KDC Hash(TGT)
最终达到身份验证的目的; 特点
需要KDC Hash(krbtgt Hash)
; AS
直接验证通过;可以访问任意
服务器;
参考:https://www.bilibili.com/video/BV1S4411q7Cw