当我们在一台Windows机器上面创建用户的时候,该用户的密码会加密储存在一个SAM(Security Account Manager 安全账号管理器)中,是Windows操作系统管理用户帐户的安全所使用的一种机制,该文件存储路径如图1-1所示。
%SystemRoot%\system32\config\sam
我们可以将这个SAM文件理解成一个用于存储本地计算机所有用户登录凭证的数据库,所有用户的登录名及口令等数据信息都会保存在此处,该文件会将密码通过NTLM hash的方式进行加密,然后存储在SAM文件中,存储在SAM中的密码均为加密过的HASH值,如图1-2所示。
当我们使用创建用户的身份去执行登录系统时,系统会主动读取本地SAM文件所存的密码,并与我们输入的密码进行校验比对,如果校验成功则证明登录成功,反之则登录失败。所谓的本地认证过程其实是对用户输入的密码与SAM安全管理数据库里加密的HASH值比对的过程,如图1-3所示。
在Windows操作系统中,不会存储用户输入的明文密码,而是将其输入的明文密码经过加密的方式存储在SAM数据库中,当用户使用账号密码凭据登录时,会先将用户输入的账号密码凭据转换成NTLM Hash,通过转换后的Hash与SAM数据库中的NTLM hash进行校对,校验成功则证明登录成功,反之则登录失败。
然而在Windows操作系统中加密Hash的算法也分为两种,一种是LM HASH加密算法,一种是NTML HASH加密算法,目前使用最流行的HASH加密算法为NTML HASH(NT LAN Manager加密算法)。
LM Hash是早期Windows系统使用的密码存储方式,非常老旧。LM Hash作为最很早之前使用的算法,存在着很多的问题和缺陷。但随着Windows操作系统的不断更新迭代,从Windows erver 2003以后版本的操作系统逐渐由之前的LM HASH加密算法改为了NTML HASH加密算法。
NTML HASH(NT LAN Manager)是Windows 为了安全性和兼容性而设计的散列加者算法。是微软为了解决LM HASH加密算法存在诸多安全问题而在Windows NT3.1中引入的NTML算法。目前Windows7/Windows Server 2008以后的操作系统版本均默认开启了NTML HASH算法。
目前在大部分的Windows操作系统中所使用的密码HASH均为NTLM HASH(NT LAN Manager),是经过Hex、Unicode、MD4三层编码加密等到的一个字母和数字组成的32值的Hash,如下是NTLM HASH的具体算法。
1)将用户密码进行hex编码得到十六进制格式。
2)将得到的十六进制结果转换为Unicode编码。
3)使用MD4加密算法对Unicode转换的结果进行加密。
#coding:utf-8
import hashlib
import binascii
password = "123456"
binhex = binascii.b2a_hex(password)
print "hex加密结果:"+binhex
print "Unincode转换结果 " + binhex.encode('utf-16le')
print "md4加密结果 " + binascii.hexlify(hashlib.new('md4', binhex.encode('utf-16le')).digest())
假设当Windows操作系统进入登录页面时,用户按下SAS按键序列(也就是CTRL+ALT+DEL)将从默认桌面切换至Winlogin桌面并启动LogonUI 来提示用户输入账号和密码等信息,当用户输入账号密码信息以后,Winlogon会通过LsaLogonUser将登录信息传递给身份验证程序包(MSV1_0) ,由MSV1_0身份验证包将登录用户名以及密码的散列值发送至本地SAM Server 数据库中进行匹配,如匹配成功,则向MSV1_0身份验证程序包返回获取到用户的SID(Security Identifier安全标识)以及用户所属组的SID,并发送给LSA server,LSA利用该唯一安全标识符等信息创建安全访问令牌(访问令牌包括了用户的SID、组SID以及分配的权限),然后将令牌的句柄和登录信息发送给Winlogon,由Winlogon继续执行该用户的登录过程,如图1-4所示。
NTLM(Windows NT LAN Manager)是基于一种Challenge/Response挑战响应验证机制,用于对域上主机进行身份验证。当用户主机请求访问与域关联的服务时,服务会向用户主机发送质询,要求用户主机使用其身份验证令牌进行验证,然后将此操作的结果返回给服务。该服务可以验证结果或将其发送到DC进行验证。如果服务或DC确认用户主机的身份令牌正确,则用户主机使用该服务。NTLM已经不被微软所推荐了,因为它不支持很多新型加密的方式,微软已经使用Kerberos作为首选的身份验证。
NTLM也是Windows网络认证协议的一种,其以NTLM HASH 作为凭证的方式进行认证,采用挑战/响应(Challenge/Response)的消息交换模式,NTLM认证协议分三步走。
1)协商(Negotiate):主要用于确认双方协议版本。
2)质询(Question):就是挑战(Challenge)/响应(Response)。
3)验证(Response):验证主要是在质询完成后,验证结果,是认证的最后一步。
NTLM协议认证包含了NTLM V1、NTLM V2、NTLM session v2三个版本,其中使用最多的还是NTLM V2协议。
NTLM V1协议:NTLM V1协议是NTLM第一版协议,NTLM V1协议在服务器和客户端之间的Challenge/Response中同时使用NT Hash和LM Hash。
NTLM V2 协议:NTLM V2也可称为NTLM第二版协议,是NTLM协议V1的改进版本,其通过强化认证协议及安全身份认证机制的方式来增加NTLM的安全性。
NTLM V1与NTLM V2两者的区别在于Challenge和加密算法不同,NTLM V1的Challenge有8位数值,主要加密算法为DES;NTLM V2的Challenge有16位数值,主要加密算法为HMAC- MD5。
NTLM协议的认证方式可以划分成交互式NTLM身份验证”和“非交互式NTLM身份验证”两种类型,如下所示。
交互式的NTLM身份验证通常涉及到用户请求身份验证的客户端系统以及保留与用户密码相关信息的域控制器这两种系统,其主要应用在用户要登录某台客户端的场景上面。
非交互式NTLM身份验证通常涉及到用于请求身份的验证的客户端系统以及保存资源的服务器和代表服务器进行身份验证计算的域控制器这三个系统,非交互式的NTLM身份验证无需进行交互式提供凭据,用户只需要成功登录一次就可访问所有相互信任的应用系统以及共享资源。
如图1-5所示,详细地描述了NTLM在工作站环境中的工作机制,其具体工作分步机制如下。
1)用户输入账号密码登录客户端时,客户端会将用户的账号密码转换为NTLM HASH并进行缓存,原始的密码将会被丢弃(因Windows安全准则要求,原始密码在任何情况下都不能被缓存)。
2)当成功登录客户端的用户想要试图访问服务器某个资源时,客户端就会向服务端发送Type1协商消息进行认证请求,该协商消息包括了客户端支持和服务器请求的功能列表。
3)服务器收到客户端发送的Type1协商消息认证请求后,服务器端会生成一个16位数值的随机数,简称“质询”(Challenge)或“随机数”(Nonce),并通过Type2质询消息对客户端进行相应,该响应消息中包含了服务器支持同意列表以及由服务器产生的16位数值的Challenge挑战码。
4)客户端接受到服务器端发来的Challenge挑战码后,客户端使用之前转换缓存的NTLM HASH对Challenge进行加密运算,得到Response,并通过Type3身份验证消息回复服务器端的质询,该身份验证消息中包含了Response、Username以及加密后的Challenge。
5)服务器端接收到由客户端返回加密后的Challenge后,服务器会使用自己密码的NTLM- HASH对Challenge进行加密计算得到Net NTLM-hash值,并与客户端发送的Net NTLM-hash值进行匹配对比,如匹配成功,则证明客户端的输入的密码正确,认证成功,反之,认证失败。
如图1-6所示,详细地描述了NTLM在域环境中的工作机制,其具体工作分步机制如下。
1)域用户输入账号密码登录客户端时,客户端会将用户的账号密码转换为NTLM HASH并进行缓存,原始的密码将会被丢弃。
2)当成功登录客户端的用户想要试图访问服务器某个资源时,客户端就会向服务端发送Type1协商消息进行认证请求,该协商消息包括了客户端支持和服务器请求的功能列表。
3)服务器收到客户端发送的Type1协商消息认证请求后,服务器端会生成一个16位数值的随机数,并通过Type2质询消息对客户端进行响应,该响应消息中包含了服务器支持同意列表以及由服务器产生的16位数值的Challenge挑战码。
4)客户端接受到服务器端发来的Challenge挑战码后,客户端会将使用之前转换缓存的NTLM HASH 对Challenge进行加密运算,得到Response,并通过Type3身份验证消息回复服务器端的质询,该身份验证消息中包含了Response、Username以及加密后的Challenge。
5)服务器端接收到由客户端返回加密后的Challenge后,服务器会通过Netlogon协议向DC发送针对客户端的验证请求,同时将Type1、Type2、Type3全部发送给DC域控。
6)DC域控制器根据Username从AD中查询该用户密码的NTLM-HASH,并使用此NTLM HASH来加密Challenge得到的Net NTLM-hash值与服务端收到的Net NTLM-hash进值行对比验证,最终将对比验证结果发送给Server端。
7)Server服务器端根据DC反馈的结果对客户端进行最后的校验。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。