1.3.2 NTLM本地认证
1.NTLM本地登录认证
当我们在Windows操作系统中创建用户的时候,该用户的密码会加密存储在一个SAM(Security Account Manager,安全账号管理器)文件中,这是Windows操作系统用于管理用户账户安全的一种机制。SAM文件的存储路径如下,另见图1-19。
图1-19 SAM文件的存储路径
我们可以将这个SAM文件理解成一个用于存储本地计算机所有用户登录凭据的数据库,所有用户的登录名及口令等数据信息都会保存在其中。该文件会将密码通过NTLM哈希的方式进行加密,然后存储在SAM文件中。存储在SAM文件中的密码均为加密过的哈希值,如图1-20所示。
当我们使用创建用户的身份登录系统时,系统会主动读取本地SAM文件所存的密码,并与我们输入的密码进行校验。如果校验成功,则证明登录成功,反之则登录失败。所谓的本地认证过程其实是对用户输入的密码与SAM数据库里加密的哈希值比对的过程,如图1-21所示。
图1-20 NTLM哈希值
图1-21 用户登录系统认证过程
2.哈希密码的存储方式
Windows操作系统不会存储用户输入的明文密码,而是将其进行加密并存储在SAM数据库中。当用户使用账号密码凭据登录时,系统会先将用户输入的账号密码凭据转换成NTLM哈希,然后将转换后的哈希与SAM数据库中的NTLM哈希进行校验,校验成功则证明登录成功,反之则登录失败。
在Windows操作系统中加密哈希的算法分为两种,一种是LM哈希加密算法,另一种是NTLM哈希加密算法,后者目前更为流行。
(1)LM哈希
LM哈希是早期Windows系统使用的密码存储方式,非常老旧。LM哈希作为很早之前使用的算法,存在着很多的问题和缺陷。Windows操作系统在不断迭代,从Windows Vista和Windows Server 2008开始逐渐将LM哈希加密算法替换为NTLM哈希加密算法。
(2)NTLM哈希
NTLM(NT LAN Manager)哈希是Windows为了安全性和兼容性而设计的哈希加密算法。微软为了解决LM哈希加密算法存在的诸多安全问题而在Windows NT 3.1中引入了NTLM算法。目前Windows Vista和Windows Server 2008以后的操作系统版本均默认开启了NTLM哈希算法。
3.NTLM哈希算法原理
目前在大部分Windows操作系统中使用的密码哈希为NTLM哈希。NTLM哈希值是经过Hex、Unicode、MD4三层编码加密得到的一个由字母和数字组成的32位的哈希值。以下是NTLM哈希的具体算法。
1)将用户密码进行Hex编码,得到十六进制格式。
2)将得到的十六进制结果转换为Unicode编码。
3)使用MD4加密算法对Unicode转换的结果进行加密。
4.本地登录认证流程
假设当Windows操作系统进入登录页面时用户按下SAS按键序列(也就是Ctrl+Alt+Del),这将使系统从默认桌面切换至Winlogon桌面,并启动LogonUI来提示用户输入账号和密码等信息。在用户输入账号和密码信息以后,Winlogon会通过LsaLogonUser将登录信息传递给身份验证程序包(MSV1_0),由MSV1_0身份验证程序包将登录用户账号和密码的哈希值发送至本地SAM Server数据库中进行匹配。如匹配成功,则向MSV1_0身份验证程序包返回获取到用户的SID及用户所属组的SID,并发送给LSA Server。LSA Server利用该唯一SID等信息创建安全访问令牌(访问令牌包括用户的SID、组SID及分配的权限),然后将令牌的句柄和登录信息发送给Winlogon,由Winlogon继续执行该用户的登录过程,如图1-22所示。
图1-22 本地登录认证流程