Windows认证机制
首先,我们简短介绍下Windows的认证机制。主要有以下三种,
- 本地认证
- 网络认证
- 域内认证 如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4ba5fabb1c7e474d648305d71f85e872.png)
Kerberos协议
Kerberos 是一种由 MIT(麻省理工大学)提出的一种网络身份验证协议。它旨在通过使用密钥加密技术为客户端/服务器应用程序提供强身份验证。
- 基于票据的认证服务
- 基于对称加密算法的加密体系
- 用于分布式用户身份认证
参与方
- 客户端
- KDC(密钥分发中心)
- 服务端
三段交互认证
- 认证服务KAS
- 票据授予服务TGS
- 获取服务票据ST
![](https://i-blog.csdnimg.cn/blog_migrate/87aa6f830293d8ad20ff7c6f733cfd18.png)
KRBTGT账户: KDC的服务账户,KDC中一般用KRBTGT账户的NTLM Hash加密会话密钥
长期密钥Long-term key: 一般是用户的登录密码
会话密钥Session key: 用于某次会话的密钥,属于短期密钥,一次会话结束后作废
票据许可票据TGT:KDC-AS颁发的该客户端身份许可的票据
服务票据ST:KDC-TGS颁发的给该客户端的具体到某一服务的票据
认证服务KAS
![](https://i-blog.csdnimg.cn/blog_migrate/55f51c2f47ca5cc1ee5c4e46b7bb4b86.png)
- KRB_AS_REQ(请求)
Client->AS:Client 先向 KDC 的 AS 发送 Authenticator1(内容为Client hash加密的时间戳)。 Kerberos认证抓包分析如下(数据包字段详解请见www.cnblogs.com/Yang34/p/14… )
![](https://i-blog.csdnimg.cn/blog_migrate/ccdaf16498cec767e71d615baa31a3cf.png)
- KRB_AS_REP(应答)
AS-> Client:AS根据用户名在AD中寻找是否在白名单中,然后根据用户名提取到对应的NTLM Hash,然后会生成一个随机数session key,然后返回给Client由Client的ntlm hash加密的session key-as作为AS数据,再返回TGT(使用KDC中krbtgt的NTLM Hash加密session key和客户端的信息,客户端的信息里面包含了时间戳等信息)。抓包分析如下:
![](https://i-blog.csdnimg.cn/blog_migrate/ae9eddb2ef68dea407a0bba8f4df7f71.png)
- AS验证的简述 在 KDC(AD) 中存储了域中所有用户的密码 HASH,当 AS 接收到 Client 的请求之后会根据 KDC 中存储的密码来解密,解密成功并且验证信息。 验证成功后返回给 Client两个东西,一个是由 Client 密码 HASH 加密的 session key-as 和 TGT(由 KRBTGT HASH 加密的 session key 和 TimeStamp 等信息)。
票据授予服务TGS
![](https://i-blog.csdnimg.cn/blog_migrate/49f76a05abd1f6fbb42782cc479b3106.png)
- KRB_TGS_REQ(请求)
Client 接收到了加密后的session key-as 和 TGT 之后,先用自身密码 HASH解密得到session key ,TGT 是由 KDC 中KRBTGT的HASH加密,所以Client 无法解密。这时 Client 再用session key加密的TimeStamp,然后再和TGT 一起发送给 KDC 中的 TGS(TicketGranting Server)票据授权服务器换取能够访问 Server 的票据。抓包分析如下:
![](https://i-blog.csdnimg.cn/blog_migrate/0b4f832642f848a90a5b948f4e2c8026.png)
- KRB_TGS_REP(应答)
TGS 收到 Client 发送过来的 TGT 和 Session key 加密的 TimeStamp 之后,首先会检查自身是否存在 Client 所请求的服务。如果服务存在,则用 KRBTGT的HASH解密 TGT。抓包分析如下:
- TGS验证的简述 一般情况下 TGS 会检查 TGT 中的时间戳查看 TGT 是否过期,且原始地址是否和 TGT 中保存的地址相同。 验证成功之后将返回Client两个东西,一个是用 session key 加密的 session key-tgs,然后另一个是 Client要访问的Server的密码 HASH 加密的 session key-tgs(前面和session key加密生成的)生成就是ST(TGS)
获取服务票据ST
![](https://i-blog.csdnimg.cn/blog_migrate/3672ea1d5c7b5b61582752b68ce0bc02.png)
- KRB_AP_REQ(请求)
Client -> Server 发送 Authenticator3(session key-tgs 加密 TimeStamp) 和票据 ST(Server 密码 HASH 加密 session key-tgs),Client 收到 session key 加密生成的 session key-tgs 和 Server 密码 HASH 加密 session key-tgs生成的TGS 之后,用 session key 解密得到 session key-tgs,然后把 sessionkey-tgs 加密的 TimeStamp 和 ST(也就是TGS)一起发送给 Server。抓包分析如下:
![](https://i-blog.csdnimg.cn/blog_migrate/b665a58312060bdfba618c81adcdafe6.png)
- KRB_AP_REP(应答)
Server-> Client server 通过自己的密码解密 ST,得到 sessionkey-tgs, 再用 sessionkey-tgs 解密 Authenticator3 得到 TimeStamp,验证正确返回验证成功。抓包分析如下:
![](https://i-blog.csdnimg.cn/blog_migrate/3ebbb1084c5954840159650b73fa1fa2.png)
- 获取ST简述 最后一次验证,server向client再发一次消息是为了完成双向的身份验证。
Kerberos 认证的优点
- 验证性能较好
- 双向认证
- 支持委派
以上内容参考过以下文章,仅用作个人知识梳理。后面的内容应该会讲到Windows认证机制的另外两种,包含ntlm-hash/net ntlm-hash的验证和Kerberos认证机制的一些利用方法等。打码中。。。