NTLM(Windows NT LAN Manager)是一种用于身份验证和安全通信的协议。它最初由微软开发,用于早期版本的Windows操作系统。NTLM协议在Windows网络环境中广泛使用,特别是在企业网络中。
NTLM身份验证步骤
NTLM验证是一种Challenge/Response 验证机制,由三种消息组成:通常称为type 1(协商),类型type 2(质询)和type 3(身份验证)。
-
用户登录客户端电脑
-
(type 1)客户端向服务器发送type 1(协商)消息,它主要包含客户端支持和服务器请求的功能列表。
-
(type 2)服务器用type 2消息(质询)进行响应,这包含服务器支持和同意的功能列表。但是,最重要的是,它包含服务器产生的Challenge(16位随机数)。
-
(type 3)客户端用type 3消息(身份验证)回复质询。用户接收到步骤3中的challenge之后,使用用户hash与challenge进行加密运算得到response,将response,username,challenge发给服务器。消息中的response是最关键的部分,因为它们向服务器证明客户端用户已经知道账户密码。
-
服务器拿到type 3之后,使用challenge和用户hash进行加密得到response2(这就是Net-NTLM Hash)与type 3发来的response进行比较。如果用户hash是存储在域控里面的话,那么没有用户hash,也就没办法计算response2。也就没法验证。这个时候用户服务器就会通过netlogon协议联系域控,建立一个安全通道,然后将type 1,type 2,type3 全部发给域控(这个过程也叫作Pass Through Authentication认证流程)。
-
域控使用challenge和用户hash进行加密得到response2,与type 3的response进行比较。
NTLM Hash的产生
假设我的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash。
admin -> hex(16进制编码) = 61646d696e
61646d696e -> Unicode = 610064006d0069006e00
610064006d0069006e00 -> MD4 = 209c6174da490caeb422f3fa5a7ae634
LM Hash的产生
LM是NTLM的前身,LM与NTLM的认证机制相同,但是加密算法不同:
将所有小写字母转换为大写字母
• 123ABC // 未达到7个字符
• 将密码转化为16进制,分两组,填充为14个字符,空余位使用0x00字符填补
• 31323341424300000000000000
• 将密码分割为两组7个字节的块
• 31323341424300 00000000000000 // 16进制
• 将每组转化为比特流,不足56Bit则在左边加0
• 31323341424300 ->(转换为二进制) 110001001100100011001101000001010000100100001100000000(补足56Bit) 00110001001100100011001101000001010000100100001100000000
• 将比特流按照7比特一组,分出8组,末尾加0
由于后者都为0,结果可想而知,那就都是0;
• 将每组比特流转换为16进制作为被加密的值,使用DES加密,字符串 “KGS!@#$%”为Key(0x4B47532140232425),得到8个结果 ,每个 结果转换为16进制。
• 00110000100110001000110001101000000101000001001000001100 00000000
• 30988C6814120C00 -> DES(30988C6814120C00) -> 48-D7-EB-91-2F-5E-69-7C
• 由于我们的密码不超过7字节,所以后面的一半是固定的:
• AA-D3-B4-35-B5-14-04-EE
• 连接两个DES加密字符串。这是LM哈希。
• 48-D7-EB-91-2F-5E-69-7C-AA-D3-B4-35-B5-14-04-EE
LM和NTLM的区别
NTLM V1和NTLM V2最显著的区别就是Challenge与加密算法不同:
- Challenge长度:NTLM V1的Challenge有8位,V2是16位
- 加密算法:NTLM V1加密算法是DES,V2加密算法是HMAC_MD5