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对比,相等则认证成功,否则失败,并将结果发送给服务端。
-
服务端收到域控的验证结果后,将验证结果发送给客户端。