Kerberos域网络安全从入门到精通
上QQ阅读APP看书,第一时间看更新

1.2 NTLM认证协议

NTLM是微软在Windows各版本操作系统中应用的认证协议,经历了LAN、V1和V2这3个主要版本。NTLM目前广泛用于SMTP(简单邮件传输协议)、PoP3(邮局协议版本3)、IMAP(互联网消息访问协议)、CIFS/SMB(通用网络文件系统/服务器信息块)、Telnet(远程终端协议)、SIP(会话初始协议,也称会话发起协议)、HTTP(超文本传输协议)等众多应用层协议的认证。为了便于众多应用层协议使用NTLM协议,将应用和认证彻底分离,微软为NTLM协议提供了一套封装接口,即NTLMSSP(NTLM安全支持程序),应用层协议直接调用即可,而不用关心认证协议的具体认证过程。

由于NTLMv1版本的加密强度较低,因此其已经逐渐被淘汰,目前高版本的Windows操作系统在默认情况下只支持NTLMv2版。Windows操作系统默认配置对应的组策略(Group Policy)为“计算机配置\Windows设置\安全设置\本地策略\安全选项\网络安全:LAN管理器身份验证级别”。Windows 7操作系统NTLM的默认配置如图1-3所示。其中,图1-3(a)是“本地安全设置”选项卡,图1-3(b)是“说明”选项卡,框线中内容表示默认情况下Windows Vista、Windows Server 2008、Windows 7以及Windows Server 2008 R2仅发送NTLMv2响应。

图1-3 Windows 7操作系统NTLM的默认配置

NTLM协议为经典的挑战-响应模型,其有3个角色,分别是客户端、应用服务器和认证服务器(如域服务器),NTLM协议原理如图1-4所示。

图1-4 NTLM协议原理

NTLM协议的挑战-响应过程共包括5步,下面以客户端申请访问应用服务器的SMB服务,并协商使用NTLM协议进行认证为例进行介绍。

Step 01 客户端向应用服务器发起NTLM协议认证的协商报文NTLM_NEGOTIATE,主要包含时间戳及客户端的账号信息等。

Step 02 应用服务器收到客户端的协商报文后,向客户端发起挑战,发送挑战报文NTLM_CHALLENGE给客户端,主要包含一个随机数作为挑战值(8字节的随机数)。

Step 03 客户端收到来自应用服务器的挑战值,计算对应的认证报文(也称响应报文)NTLM_AUTHENTICATE,发送给应用服务器。认证报文包含认证信息,主要是使用客户端的认证账号的口令NTLM值对挑战值(8字节的随机数)进行加密。

Step 04 应用服务器由于不具备认证功能,因此需要依托认证服务器DC进行认证。应用服务器与域服务器建立DCE/RPC的NETLOGON安全会话,并将来自客户端的认证报文发送给域服务器,安全会话的认证密钥是应用服务器本机的主机账号的NTLM值。

Step 05 域服务器对认证报文进行认证,如果认证成功,则通过NETLOGON会话通知应用服务器;如果失败,则返回认证失败,结束流程。

NTLM认证协议的核心是认证报文的计算,认证报文的计算基于NTLM Hash。NTLM Hash为Windows操作系统基于账号的口令明文计算出的密文,用于账号的登录认证,存放在本机的安全账户管理器(Security Accounts Manager, SAM)数据库及域服务器的NTDS数据库中。NTLM Hash包括NT Hash、LM Hash两部分。LM Hash算法的计算过程如下。

(1)将账号和口令明文转换为大写,转换为系统的OEM编码(一种编码格式,与DOS格式有区别)。

(2)口令补零或者截断到第14位,并且分为前后两个部分,各7字节。

(3)将前后7字节的每个字节后面添加1比特的“0”,变成两组64比特的DES算法密钥,记为DES KEY。

(4)使用DES算法,分别给上面的2个DES KEY加密固定的字符串“KGS!@#$%”,得到两个8字节的密文,该固定的字符串也称为Magic String。

(5)将2个8字节的密文连成1个16字节的密文,称为LM Hash。

上述过程的算法伪码表示如下。

NT Hash的算法为将口令全部转换为大写,然后采用MD4算法进行Hash计算,其伪码表示如下。

将NT Hash和LM Hash合在一起,称为NTLM Hash。从上述算法中可以看出,用户口令最长为14位,如果低于7位,则LM Hash的后半部分全部相同;LM Hash采用DES算法加密,NT Hash采用MD4算法加密,这两种算法的加密强度都很差,难以对抗现代破译算法,因此最初的LAN协议发展为NTLMv1协议。在NTLMv1协议中,认证报文的计算过程如下。

(1)客户端收到来自服务器的8字节随机挑战值,用C表示。

(2)将16字节的LM Hash添加5字节的0,共21个字节,分成3个7字节组,分别标记为K1、K2、K3,后续作为DES密钥使用。

(3)将K1、K2、K3的每个字节后添加1比特“0”,并在最后补齐1比特“0”,变成3个8字节组,成为DES密钥(64比特)。

(4)分别将K1、K2、K3作为密钥,对随机挑战值C进行DES加密,并连接成为response1。

(5)将16字节的NT Hash添加5字节的0,共21个字节,分成3个7字节组,分别标记为K4、K5、K6,后续作为DES密钥使用。

(6)分别将K4、K5、K6作为密钥,对随机挑战值C进行DES加密,并连接成为response2。

(7)response1连接response2,共同组成响应认证报文,也称为NTLM Net-Hash。

在NTLMv1认证协议中,认证报文的算法伪码表示如下。

在NTLMv2认证协议中,认证报文的计算过程如下。

(1)客户端收到来自服务器的8字节随机挑战值,用SC表示;客户端也会产生8字节的随机数,用CC表示。

(2)客户端由口令明文、当前时间、CC和服务器的域名共同组成CC*。

(3)计算v2-Hash, Hash算法为HMAC-MD5,使用v1版本中的NT Hash作为Key,账号名、服务器的域名作为输入值。

(4)以v2-Hash为Key, Hash算法为HMAC-MD5,SC、CC作为输入值,计算LMv2。

(5)以v2-Hash为Key, Hash算法为HMAC-MD5,SC、CC*作为输入值,计算NTv2。

(6)将LMv2、CC、NTv2、CC*连接,组成NTLMv2的响应报文。

在NTLMv2认证协议中,认证报文的算法伪码如下。

通过对比上述3个版本的算法,很容易得出如下结论:NTLMv2版本较NTLMv1版本和LAN版本不仅在加密算法上采用了安全性更高的SALT版HMAC-MD5算法,可以有效对抗爆破,而且在协议算法上多引入了一个客户端随机因子,在协议上提高了中间人攻击的对抗性。但是,NTLM的本质并没有发生改变,如口令最长14个字符,如果口令少于7字符,则采取补零的方式补齐。