0x01 LM Hash加密算法
LM Hash本质是一个DES加密,从Windows Vista和Windows Server 2008开始就禁用了LM Hash。LM Hash明文密码被限定在14位以内,密码超过14位则会停止使用LM Hash。下面介绍一下LM Hash的加密流程,以P@ss1234为例:
P@ss12345->P@SS1234->5040535331323334
5040535331323334->5040535331323334000000000000
| 50 | 40 | 53 | 53 | 31 | 32 | 33 | 
|---|---|---|---|---|---|---|
| 01010000 | 01000000 | 01010011 | 01010011 | 00110001 | 00110010 | 00110011 | 
拼接后数据:01010000010000000101001101010011001100010011001000110011
| 34 | 00 | 00 | 00 | 00 | 00 | 00 | 
|---|---|---|---|---|---|---|
| 00110100 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 
拼接后数据:00110100000000000000000000000000000000000000000000000000
| 0101000 | 0010000 | 0001010 | 0110101 | 0011001 | 1000100 | 1100100 | 0110011 | 
|---|---|---|---|---|---|---|---|
| 01010000 | 00100000 | 00010100 | 01101010 | 00110010 | 10001000 | 11001000 | 01100110 | 
转化成十六进制:5020146a3288c866
| 0011010 | 0000000 | 0000000 | 0000000 | 0000000 | 0000000 | 0000000 | 0000000 | 
|---|---|---|---|---|---|---|---|
| 0011010 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 00000000 | 
转化成十六进制:3400000000000000
| 明文 | 秘钥 | DES加密 | 
|---|---|---|
| KGS!@#$% | 5020146a3288c866 | 896108C0BBF35B5C | 
| KGS!@#$% | 3400000000000000 | FF17365FAF1FFE89 | 
拼接后得到最终的LM Hash:896108C0BBF35B5CFF17365FAF1FFE89
0x02 NTLM Hash加密算法
为了解决LM Hash加密和身份验证方案中的安全弱点,微软提出了NTLM Hash加密算法。下面介绍一下LM Hash的加密流程,以P@ss1234为例。
| 字符 | P | @ | s | s | 1 | 2 | 3 | 4 | 
|---|---|---|---|---|---|---|---|---|
| ASCII | 80 | 64 | 115 | 115 | 49 | 50 | 51 | 52 | 
| 16进制 | 50 | 40 | 73 | 73 | 31 | 32 | 33 | 34 | 
拼接后字符:5040737331323334
5040737331323334->50004000730073003100320033003400
- 对Unicode编码进行MD4加密。
50004000730073003100320033003400-> 74520a4ec2626e3638066146a0d5ceae
0x03 Net-NTLM Hash 加密算法
Net-NTLM有两个版本,两者的区别是Challenge值与加密算法不同。
| 版本 | Challenge值长度 | 加密算法 | 
|---|---|---|
| Net-NTLM v1 Hash | 8字节 | DES加密算法 | 
| Net-NTLM v2 Hash | 16字节 | HMAC-MD5加密算法 | 
3.1 Net-NTLM v1 Hash生成步骤
-  将16字节的NTLM Hash填充到21字节,并平均分成三组,每组7字节。 
-  将这三组数据分别作为3DES的秘钥对Challenge加密,得到三个密文。 
-  将三个密文拼接起来得到NTLM response。 
-  拼接用户名等信息得到最终的Net_NTLM v1 Hash,格式: username::hostname:LM response:NTLM response:challenge
3.2 Net-NTLM v2 Hash生成步骤
-  将大写的User name和区分大小写的Domain name拼接在一起并转化成ASCII编码,然后逐个ASCII编码转成16进制,最后逐个转化成Unicode编码得到data (Unicode编码是在每个16进制字节后面加00)。 
-  用NTLM Hash作为加密秘钥对data进行HMAC-MD5加密得到NTLM v2 Hash。 
-  构建一个blob,将challenge和blob拼接在一起得到data2,其中blob包含了用户名、域名、随机挑战、时间戳等信息。 
-  使用NTLM v2 Hash作为加密秘钥对data2进行HMAC-MD5加密得到HMAC-MD5。 
-  拼接用户名等信息得到最终的Net_NTLM v2 Hash,格式: username::domain:challenge:HMAC_MD5:blob
0x04 NTLM协议认证
4.1 工作组环境下的NTLM认证

-  用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。 
-  服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。 
-  客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。 
-  服务端收到Type 3后取出Net-NTLM Hash,用服务端保存的密码生成的NTLM Hash对challenge加密得到服务端的Net-NTLM Hash,将客户端与服务端计算的Net_NTLM Hash对比,相等则认证成功,否则失败,并将验证结果发送给客户端。 
4.2 域环境下的NTLM认证

-  用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。 
-  服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。 
-  客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。 
-  客户端收到Type 3后提取Net-NTLM Hash,通过Netlogon协议与域控服务器简历一个安全通道,将验证消息发送给域控。 
-  域控收到验证消息后取出Net-NTLM Hash和challenge,同时从数据库中找到该用户的NTLM Hash对challenge加密得到Net-NTLM Hash并与客户端的Net-NTLM Hash对比,相等则认证成功,否则失败,并将结果发送给服务端。 
-  服务端收到域控的验证结果后,将验证结果发送给客户端。 



















