「Active-Directory-Sec」Kerberos认证原理
in PENETRATIONDomain-Sec with 0 comment

「Active-Directory-Sec」Kerberos认证原理

in PENETRATIONDomain-Sec with 0 comment

Kerberos


santouquan.jpeg

Kerberos这一名词来源于希腊神话"三头犬--地狱之门守护者"
由于Kerberos协议出现三个角色,也正对应了这个名字。

Kerberos利用DES和受信任的第三方KDC(key distribution center)来鉴别要求使用网络服务的用户身份。所有的KDC和secondary KDC管理的主机构成了一个域(realm).
当一个用户的身份通过KDC的验证后,KDC会向该用户发送一个证书/票据,其他主机会在该用户的主机上搜索该票据,而不是要求使用密码来验证它的身份。如此便支持了SSO(Single Sign On),即用户输入一次身份认证访问多个服务。

Kerberos与活动目录的关系

微软的活动目录默认使用Kerberos处理认证请求。

Kerberos认证过程


kerberos1.jpeg

基本属性

在了解认证原理前先清楚以下概念
协议三个角色:

其中KDC有两个服务:

协议有三个长期秘钥:

注:共享秘要在协议工作之前就已经配置好。

长期秘钥与短期秘钥:

详细认证过程


Kerberos的认证过程可以归结为: 三个过程,六个步骤

三个过程:

  1. Authentication Service Exchange Client向KDC申请TGT
  2. Ticket Granting Service Exchange Client 通过获取的TGT向KDC申请用于访问Server的Ticket
  3. Client/Server Exchange Client向Server提供自己的Ticket进行认证并访问

六个步骤:

kerberos.gif

kerberos-en.jpg

(一)、Authentication Service Exchange

1.客户端对用户口令进行哈希。此哈希值即为用户秘钥,其作为客户端和KDC共享的长期秘钥(Long-term Key) Master Key

2.KRB_AS_REQ 客户端使用Master Key加密一个时间戳(timestamp),然后和自己的身份信息(username,servername等)发送给KDC,KDC访问AS服务。

3.KRB_AS_REP AS使用Matster Key解密时间戳,若解密成功,表明了客户端拥有某个特定用户的口令(即验证了用户的身份)。AS向客户端发送使用共享秘钥加密的两条信息,分别是:

  1. 短期会话密钥Session Key(S-KDC-Client),用于客户端向KDC发起后续的请求,该消息经客户端的长期密钥(共享秘钥,Master Key)加密。(此短期会话密钥仅适用于该客户端和KDC之间)
  2. 票据授予票据(Ticket Granting Ticket,简称TGT),包含有关用户名、域名、时间和组成员资格等信息。该消息经仅KDC可知的密钥加密(在Windows环境中为krbtgt账户的NTLM-HASH)。另外AS会将Session Key(S-KDC-Client)使用仅KDC可知的秘钥即krbtgt账户的NTLM-HASH(KDC Master key) 进行加密并将其包含在TGT发送给Client

(二)、Ticket Granting Service Exchange

4.KRB_TGS_REQ-客户端使用Master Key解密会话秘钥Session Key(S-KDC-Client),然后使用其加密构建一个Authenticator,
Authenticator包含Client的用户名,IP地址,timestamp等许多信息(Client-Info)。然后发送TGTAuthenticator及要请求的服务信息(Domain name\Client等)给KDC,KDC派发给TGS处理。

5.KRB_TGS_REP-票据授予服务TGS获取加密的AuthenticatorTGT,先利用KDC的Master Key解密TGT,获取其中的Session Key(S-KDC-Client),然后就可以利用Session Key(S-KDC-Client)解密Authenticator,获取Client-Info。然后和解密的TGT中的Client-Info进行对比。 对比通过,票据授予服务向客户端发送一个服务票据(Service Ticket,简称ST),包括两个部分:

  1. 远程服务器的部分-包含请求用户的组成员资格、时间戳、用于客户端和远程服务器之间通信的会话密钥Session Key(S-Server-Client)。使用远程服务器Server和KDC共享的长期密钥(即KDC与服务器之间的Master Key)加密这部分消息。
  2. 客户端的部分-包含用于客户端和远程服务器之间通信的会话秘钥Session Key(S-Server-Client)。使用步骤3中AS回复的短期会话密钥Session Key(S-KDC-Client)加密这部分消息。

6.KRB_AP_REQ- 客户段获取到TGS发送来的信息,使用S-KDC-Client解密前一部分内容,获取S-Server-Client。而客户端无法解密Tickets内容,于是客户端把服务票据中的服务器部分和请求一起发送到远程服务器。远程服务器将直接接受该服务器票据,并不需要和KDC直接通信,因为该票据是用远程服务器和KDC共享的长期密钥加密过的。解密成功即表明KDC已经允许了此次通信。

(三)、Client/Server Exchange

7.Client 通过TGS Exchange获得的S-Server-Client再进行创建Authenticator,并使用其进行加密。最后将这个加密过的AuthenticatorTicket作为KRB_AP_REQ发送给Server。同时,KRB_AP_REQ还包含一个Flag用来表示Client是否进行双向验证。

8.Server接收到KRB_AP_REQ之后,通过自己的Master Key解密Ticket,从而获得S-Server-Client,并通过其解密Authenticator,进而验证Client身份。验证成功则Client正常访问请求资源,否则拒绝访问。

至此,一次Kerberos通信完成。

总结


本文介绍了Kerberos的基本通信与信任原理。是深入理解域渗透相关原理的基础。从协议原理我们大概可以看出,kerberos信任的核心就是仅双方可知的长期秘钥,当需要通信的时候,再生成会话秘钥。而认证的核心就是“票据”,TGTTGS。而krbtgt账户的NTLM HASH则是TGT生成的核心之一。从通信协议来看,只要krbtgt账户HASH信息泄漏,整个通信协议即沦陷,这也是黄金票据`Golden Ticket`的相关原理。

REFERENCE

[1] https://blog.csdn.net/wulantian/article/details/42418231
[2] http://www.mamicode.com/info-detail-1944858.html
[3] http://www.h3c.com.cn/MiniSite/Technology_Circle/Net_Reptile/The_ Seven/Home/Catalog/201309/797631_97665_0.htm

Responses