9.9. NTLM 身份验证¶
9.9.1. NTLM认证¶
NTLM是NT LAN Manager的缩写,NTLM是基于挑战/应答的身份验证协议,是 Windows NT 早期版本中的标准安全协议。
9.9.1.1. 基本流程¶
客户端在本地加密当前用户的密码成为密码散列
客户端向服务器明文发送账号
服务器端产生一个16位的随机数字发送给客户端,作为一个challenge
客户端用加密后的密码散列来加密challenge,然后返回给服务器,作为response
服务器端将用户名、challenge、response发送给域控制器
域控制器用这个用户名在SAM密码管理库中找到这个用户的密码散列,然后使用这个密码散列来加密chellenge
域控制器比较两次加密的challenge,如果一样那么认证成功,反之认证失败
9.9.1.2. Net-NTLMv1¶
Net-NTLMv1协议的基本流程如下:
客户端向服务器发送一个请求
服务器接收到请求后,生成一个8位的Challenge,发送回客户端
客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,作为response发送给服务器
服务器校验response
Net-NTLMv1 response的计算方法为
将用户的NTLM hash补零至21字节分成三组7字节数据
三组数据作为3DES加密算法的三组密钥,加密Server发来的Challenge
这种方式相对脆弱,可以基于抓包工具和彩虹表爆破工具进行破解。
9.9.1.3. Net-NTLMv2¶
自Windows Vista起,微软默认使用Net-NTLMv2协议,其基本流程如下:
客户端向服务器发送一个请求
服务器接收到请求后,生成一个16位的Challenge,发送回客户端
客户端接收到Challenge后,使用登录用户的密码hash对Challenge加密,作为response发送给服务器
服务器校验response
9.9.2. Hash¶
9.9.2.1. LM Hash¶
LM Hash(LAN Manager Hash) 是windows最早用的加密算法,由IBM设计。LM Hash 使用硬编码秘钥的DES,且存在缺陷。早期的Windows系统如XP、Server 2003等使用LM Hash,而后的系统默认禁用了LM Hash并使用NTLM Hash。
LM Hash的计算方式为:
转换用户的密码为大写,14字节截断
不足14字节则需要在其后添加0×00补足
将14字节分为两段7字节的密码
以
KGS!@#$%
作为秘钥对这两组数据进行DES加密,得到16字节的哈希拼接后得到最后的LM Hash。
作为早期的算法,LM Hash存在着诸多问题:
密码长度不会超过14字符,且不区分大小写
如果密码长度小于7位,后一组哈希的值确定,可以通过结尾为
aad3b435b51404ee
来判断密码长度不超过7位分组加密极大程度降低了密码的复杂度
DES算法强度低
9.9.2.2. NTLM Hash¶
为了解决LM Hash的安全问题,微软于1993年在Windows NT 3.1中引入了NTLM协议。
Windows 2000 / XP / 2003 在密码超过14位前使用LM Hash,在密码超过14位后使用NTLM Hash。而之后从Vista开始的版本都使用NTLM Hash。
NTLM Hash的计算方法为:
将密码转换为16进制,进行Unicode编码
基于MD4计算哈希值
9.9.3. 攻击¶
9.9.3.1. Pass The Hash¶
Pass The Hash (PtH) 是攻击者捕获帐号登录凭证后,复用凭证Hash进行攻击的方式。
微软在2012年12月发布了针对Pass The Hash攻击的防御指导,文章中提到了一些防御方法,并说明了为什么不针对Pass The Hash提供更新补丁。
9.9.3.2. Pass The Key¶
在禁用NTLM的环境下,可以用mimikatz等工具直接获取密码。
9.9.3.3. NTLM Relay¶
攻击者可以一定程度控制客户端网络的时候,可以使用中间人攻击的方式来获取权限。对客户端伪装为身份验证服务器,对服务端伪装为需要认证的客户端。