前言

虽然学习了一段时间域渗透,之前也学过一点Kerberos协议,但是发现理解得还是不到位,有的也还不清楚,所以重新总结学习一下,龙哥(Loong716)文章写得真详细,嫖嫖~~,此文摘自:https://loong716.top/2019/10/25/Windows-hash.html,些许改动和补充总结

NTLM

NTLM(NT LAN Manager)Windows中最常见的身份认证方式,主要有本地认证和网络认证两种情况

NTLM hash

NTLM hashNTLM认证中最重要的凭证,它的由来是

密码->十六进制编码->Unicode编码->md4加密->NTLM hash

本地认证

在本地认证过程中,当用户进行注销、重启、开机等需要认证的操作时,首先Windows会调用winlogon.exe进程(也就是我们平常见到的登录框)接收用户的密码
之后密码会被传送给进程lsass.exe,该进程会先在内存中存储一份明文密码,然后将明文密码加密为NTLM hash后,与Windows本地的SAM数据库(windows\system32\config\SAM)中该用户的NTLM Hash对比,如果一致则通过认证
![1](./images/1_1.png)

网络认证

工作组环境

网络认证需要使用NTLM协议,该协议基于挑战(Challenge)/响应(Response)机制

1.首先客户端向服务端发送用户名以及本机的一些信息
2.服务端接收到客户端的用户名后,先生成一个随机的16位的Challenge(挑战随机数),本地储存后将Challenge返回给客户端
3.客户端接收到服务端发来的Challenge后,使用用户输入密码的NTLM Hash对Challenge进行加密生成Response(也叫Net NTLM Hash),将Response发送给服务端
4.服务端接收到客户端发来的Response,使用数据库中对应用户的NTLM Hash对之前存储的Challenge进行加密,得到的结果与接收的Response进行对比,如果一致则通过认证

![2](./images/2_1.png)

域环境

域环境中虽然默认首选是kerberos认证,但是也可以使用NTLM来进行认证。其实NTLM在域环境与工作组环境中的差异不大,区别主要是最终在域控(DC)中完成验证
![3](./images/3_1.png)

NTLM的缺陷

在整个过程中都使用的NTLM hash而不是明文密码,所以当攻击者获取到了HTLM hash不需要破解成明文密码就能冒充该用户通过身份验证,这就是hash传递攻击

Kerberos

Kerberos实际上是一种基于票据(Ticket)的认证方式。客户端要访问服务器的资源,需要首先购买服务端认可的票据。也就是说,客户端在访问服务器之前需要预先买好票,等待服务验票之后才能入场。在这之前,客户端需要先买票,但是这张票不能直接购买,需要一张认购权证。客户端在买票之前需要预先获得一张认购权证。这张认购权证和进入服务器的入场券均有KDC发售

KDC(Key Distribution Center) : 密钥分发中心
KAS(Kerberos Authentication Service) : kerberos认证服务
TGT(Ticket Granting Ticket) : 认购权证
TGS(Ticket Granting Service) : 票据授予服务
ST(Service Ticket) : 服务票据

我自己总结了个流程:

客户端要访问服务端资源->客户端通过与KDC的验证得到TGT(得到购票的权利)->拿着TGT去TGS处购票得到ST->客户端购得了票ST便可以访问服务端资源了

中间具体的流程太细,了解一下就行,就是交互的两方之间的各种加密传输,具体需要了解参考https://loong716.top/2019/10/25/Windows-hash.html

Kerberos的缺陷

Kerberos认证完全依赖于KDC的密钥(即krbtgt用户的密钥)。因此,如果攻击者拿到了krbtgt账号的hash的话,那么他就可以访问域中任何以kerberos协议做身份认证的服务。这就产生了票据传递攻击(Pass The Ticket)。