NTLM协议

0x01 LM Hash加密算法

LM Hash本质是一个DES加密,从Windows Vista和Windows Server 2008开始就禁用了LM Hash。LM Hash明文密码被限定在14位以内,密码超过14位则会停止使用LM Hash。下面介绍一下LM Hash的加密流程,以P@ss1234为例:

  1. 将密码转成大写,然后转成十六进制。

P@ss12345->P@SS1234->5040535331323334

  1. 十六进制字符不足14字节则用0补齐(14字节包含28位十六进制数字)。

5040535331323334->5040535331323334000000000000

  1. 将14字节数据分成两组,每组7字节,将每个字节的数字逐个转化成二进制,然后拼接起来(每个字节包含2位十六进制数字)。
50405353313233
01010000010000000101001101010011001100010011001000110011

拼接后数据:01010000010000000101001101010011001100010011001000110011

34000000000000
00110100000000000000000000000000000000000000000000000000

拼接后数据:00110100000000000000000000000000000000000000000000000000

  1. 将每组二进制数据按7bit为一组,分为8组,每组末尾加0,然后将每组逐个转成16进制后拼接。
01010000010000000101001101010011001100010011001000110011
0101000000100000000101000110101000110010100010001100100001100110

转化成十六进制:5020146a3288c866

00110100000000000000000000000000000000000000000000000000
0011010000000000000000000000000000000000000000000000000000000000

转化成十六进制:3400000000000000

  1. 将上面生成的两组数据分别作为DES加密秘钥对字符串KGS!@#$%加密,然后拼接得到最终的LM Hash。
明文秘钥DES加密
KGS!@#$%5020146a3288c866896108C0BBF35B5C
KGS!@#$%3400000000000000FF17365FAF1FFE89

拼接后得到最终的LM Hash:896108C0BBF35B5CFF17365FAF1FFE89

0x02 NTLM Hash加密算法

为了解决LM Hash加密和身份验证方案中的安全弱点,微软提出了NTLM Hash加密算法。下面介绍一下LM Hash的加密流程,以P@ss1234为例。

  1. 将密码转化成ASCII编码,然后逐个编码转成16进制。
字符P@ss1234
ASCII806411511549505152
16进制5040737331323334

拼接后字符:5040737331323334

  1. 将ASCII编码的十六进制字逐个转化成Unicode编码(Unicode编码是在每个16进制字节后面加00)。

5040737331323334->50004000730073003100320033003400

  1. 对Unicode编码进行MD4加密。

50004000730073003100320033003400-> 74520a4ec2626e3638066146a0d5ceae

0x03 Net-NTLM Hash 加密算法

Net-NTLM有两个版本,两者的区别是Challenge值与加密算法不同。

版本Challenge值长度加密算法
Net-NTLM v1 Hash8字节DES加密算法
Net-NTLM v2 Hash16字节HMAC-MD5加密算法
3.1 Net-NTLM v1 Hash生成步骤
  1. 将16字节的NTLM Hash填充到21字节,并平均分成三组,每组7字节。

  2. 将这三组数据分别作为3DES的秘钥对Challenge加密,得到三个密文。

  3. 将三个密文拼接起来得到NTLM response。

  4. 拼接用户名等信息得到最终的Net_NTLM v1 Hash,格式:username::hostname:LM response:NTLM response:challenge

3.2 Net-NTLM v2 Hash生成步骤
  1. 将大写的User name和区分大小写的Domain name拼接在一起并转化成ASCII编码,然后逐个ASCII编码转成16进制,最后逐个转化成Unicode编码得到data (Unicode编码是在每个16进制字节后面加00)。

  2. 用NTLM Hash作为加密秘钥对data进行HMAC-MD5加密得到NTLM v2 Hash。

  3. 构建一个blob,将challenge和blob拼接在一起得到data2,其中blob包含了用户名、域名、随机挑战、时间戳等信息。

  4. 使用NTLM v2 Hash作为加密秘钥对data2进行HMAC-MD5加密得到HMAC-MD5。

  5. 拼接用户名等信息得到最终的Net_NTLM v2 Hash,格式:username::domain:challenge:HMAC_MD5:blob

0x04 NTLM协议认证

4.1 工作组环境下的NTLM认证

在这里插入图片描述

  1. 用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。

  2. 服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。

  3. 客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。

  4. 服务端收到Type 3后取出Net-NTLM Hash,用服务端保存的密码生成的NTLM Hash对challenge加密得到服务端的Net-NTLM Hash,将客户端与服务端计算的Net_NTLM Hash对比,相等则认证成功,否则失败,并将验证结果发送给客户端。

4.2 域环境下的NTLM认证

在这里插入图片描述

  1. 用户输入账号和密码,客户端用密码生成NTLM Hash并缓存。同时向服务端发送NTLMSSP_NEGOTIATE消息请求身份认证(Type 1协商消息)。

  2. 服务端收到Type 1后随机生成一个challenge值并缓存,同时向客户端发送包含Challenge的NTLMSSP_CHALLENGE消息(Type 2质询消息)。

  3. 客户端收到Type 2后用NTLM Hash对challenge进行加密得到Net-NTLM Hash,将其封装到NTLMSSP_AUTH消息中发往服务端(Type 3认证消息)。

  4. 客户端收到Type 3后提取Net-NTLM Hash,通过Netlogon协议与域控服务器简历一个安全通道,将验证消息发送给域控。

  5. 域控收到验证消息后取出Net-NTLM Hash和challenge,同时从数据库中找到该用户的NTLM Hash对challenge加密得到Net-NTLM Hash并与客户端的Net-NTLM Hash对比,相等则认证成功,否则失败,并将结果发送给服务端。

  6. 服务端收到域控的验证结果后,将验证结果发送给客户端。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

rpsate

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值