NTLM协议是在Microsoft环境中使用的一种身份验证协议,它允许用户向服务器证明自己是谁(挑战(Chalenge)/响应(Response)认证机制),以便使用该服务器提供的服务。NTLM协议即可以为工作组的机器提供身份验证,也可以用于域环境身份验证,NTLM还可以为SMB,HTTP,LDAP,SMTP等上层协议提供认证
早期SMB认证协议以明文传输,因此出现了安全问题,后来出现了LM协议,但是比较容易破解,再后来出现了NTLM协议,目前NTLM协议主要有两个版本,NTLM v1和NTLM v2版本,区别如下
NTLM的认证分为三步
协商这一步比较简单,客户端向服务器端发送协商消息,包含了协议版本等信息
challenge
,使用登入用户名对应的NTML Hash加密challenge,生成challenge1 (也叫Net NTLM Hash),同时将challenge发送给客户端服务器收到Response之后,判断是否与challenge1相等,如果相等则通过
个人觉得,这个过程和公私钥认证的过程挺像的
在Windows系统导出密码的时候,经常看到这样的密码格式
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
其中的
LM Hash的本质是DES加密,但是现在基本都已经没有使用LM Hash
由于LM Hash加密算法的不安全性,微软后面推出NTLM Hash。其与LM Hash有着不同的加密算法
从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash
用户登入的密码存储在lsass.exe进程中
右击可以转为存储文件
使用mimikatz.exe 查看hash值
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit
winlogon.exe -> 接收用户输入 -> lsass.exe -> (认证)
Kerberos是一种计算机网络认证协议 ,其设计目标是通过密钥系统为网络中通信的客户机(Client)/服务器(Server)应用程序提供严格的身份验证服务,确保通信双方身份的真实性和安全性。不同于其他网络服务,Kerberos协议中不是所有的客户端向想要访问的网络服务发起请求,他就能建立连接然后进行加密通信,而是在发起服务请求后必须先进行一系列的身份认证,包括客户端和服务端两方的双向认证,只有当通信双方都认证通过对方身份之后,才可以互相建立起连接,进行网络通信。即Kerberos协议的侧重在于认证通信双方的身份,客户端需要确认即将访问的网络服务就是自己所想要访问的服务而不是一个伪造的服务器,而服务端需要确认这个客户端是一个身份真实,安全可靠的客户端,而不是一个想要进行恶意网络攻击的用户。
88
密钥分发中心又分为两个部分,分别是:
客户端在访问每个想要访问的网络服务时,他需要携带一个专门用于访问该服务并且能够证明自己身份的票据,当服务端收到了该票据他才能认定客户端身份正确,向客户端提供服务。所以整个流程可简化为三步:
在域渗透中,黄金票据就是伪造TGT,白银票据就是伪造ST
如果你的理解能力很强的话,可以参考:[1]毕淏,程晓荣.Kerberos认证协议分析与研究[J].电脑知识与技术,2017,13(27):37-38+59.DOI:10.14004/j.cnki.ckt.2017.3068.
其实无论是在域环境下还是在非域环境下,这两个协议都可以使用,在域环境下到底使用哪一个,主要还是由域控配置来进行选择,两个协议都是windows的一种安全认证协议,其应用比较广泛,设置可以应用到web服务之中,尽管如此,但是在windows server 2008以及更高的版本中,默认使用kerberos协议来进行安全认证
windows本机内是不存储明文密码的,只存储Hash值,本机用户的密码hash是放在本地的SAM文件里面,域内用户的密码hash是存在域控的NTDS.DIT文件里面
SAM文件的路径:C:\Windows\System32\config\SAM
lsass.exe这个进程比较特殊,会存储明文密码