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

攻击者可以一定程度控制客户端网络的时候,可以使用中间人攻击的方式来获取权限。对客户端伪装为身份验证服务器,对服务端伪装为需要认证的客户端。

9.9.4. 参考链接