NTLM(NT LAN MANAGER)是一种网络认证协议,它是基于挑战(Challenge)/响应(Response)认证机制的一种认证模式。
NTLM使用在Windows NT和Windows 2000 Server(or later)工作组环境中(kerberos用在域模式下)。在AD域环境中,如果需要认证Windows NT系统,也必须采用NTLM。
NTLM协议的认证过程分为三步:
1、协商:主要用于确认双方协议版本(NTLM v1/NTLM v2)
2、质询:就是挑战/响应认证机制起作用的范畴
3、验证:验证主要是在质询完成后,验证结果,是认证的最后一步
质询的完整过程:
1、客户端向服务端发送用户信息(用户名)请求
2、服务器接受到请求,判断本地账户列表是否有用户名,如果有,生成一个16位的随机数,被称之为“Challenge”,使用登陆用户名对应NTLM Hash加密Challenge(16位随机字符),生成Challenge1,生成一个Net-NTLM Hash存在内存中,同时,生成Challenge1后,将Challenge(16位随机字符)发送给客户端。
3、客户端接收到Challenge后,使用将要登陆的账户对应的NTLM Hash加密Challenge生成Response,然后将Response发送至服务器端。
4、验证,服务器接收到客户端的Response后,对比Challenge1与Response是否相等,若相等,则认证通过。
ps:
1、Challenge是Server产生的一个16字节的随机数,每次认证随机数都不同
2、Response的表现形式是Net-NTLM Hash,它是由客户端提供的密码Hash加密Server返回Challenge产生的结果
NTML认证方式
1、交互式认证:使用域账号登陆到客户端;涉及到两部分(客户端、域控)
2、非交互式认证:在已登陆的客户端上使用SSO的方式访问一台服务器;涉及三部分(客户端、域控、服务器)
Hash类型
1、LM HASH:LM Hash是一种比较古老的Hash,在LAN Manager协议中使用,非常容易通过暴力破解获取明文凭据。Vista以前的Windows OS使用它,Vista之后的版本默认禁用了LM协议,但某些情况下还是可以使用。
2、NTLM HASH:Vista以上现代操作系统使用的Hash。通常意义上的NTLM Hash指存储在SAM数据库及NTDS数据库中对密码进行摘要计算后的结果,这类hash可以直接用于PTH,并且通常存在于lsass进程中。
3、NET-NTLM HASH:Net-NTLM Hash用于网络身份认证(例如ntlm认证中),目前分为两个版本Net-NTLM v1和Net-NTLM v2;两个版本认证方式相同,但加密方式不同(net-ntlmv1 challenge8位,net-ntlmv2 challenge16位)
NTLM Hash产生方式
LM Hash 与 NTLM的关系:
1、在NTLM协议问世前,它的前身就是LM(LAN Manager)协议
2、不同点:加密算法
3、相同点:认证机制
4、目前大多数的Windows都采用NTLM协议认证,LM协议已经基本淘汰。
NTLM Hash产生:假设我们的密码是admin,那么操作系统会将admin转换为十六进制,经过Unicode转换后,再调用MD4加密算法加密,这个加密结果的十六进制就是NTLM Hash。
password ==> hex ==> Unicode ==> MD4 ==> NTLM Hash
NTLM系统下的hash密码格式
用户名称:SID:LM-HASH值:NT-HASH值
Administrator:500:C8825DB10F2590EAAAD3B435B51404EE:683020925C5D8569C23AA724774CE6CC:::
LM Hash是AAD3B435B51404EEAAD3B435B51404EE这表示空密码或者是未使用LM_HASH;
Hash一般存储在两个地方:1、SAM文件,存储在本机对应本地用户来;2、NTDS.DIT文件,存储在域控上对应域用户。
域中NTLM认证
在域中,NTLM认证多了一个角色:服务器
1、首先在client输入username,password和domain,然后client会把password hash后的值先缓存到本地,之后,client把username的明文发送给DC
2、DC会生成16字节的随机数,即challenge,再传回给client
3、当client收到challenge后,会先复制一份出来,然后和缓存中的密码hash再一同混合hash一次,混合后的值称为response,之后client再将challenge,response及username一并传给server
4、server端在收到client传过来的这三个值后,会把它们都转发给DC
5、当DC接收到过来的三个值后,会根据username到域控的账号数据库(ntds.dit)里面找到该username对应的hash,然后把这个hash拿出来和传过来的challenge值再混合hash
6、将混合后的hash值跟传来的response进行比较,相同则认证成功,反之,认证失败;如果是本地登陆,所有验证肯定也全部直接在本地进行