来源
介绍NTLM 之前,简单看一下NetBIOS和SMB是什么
NetBIOS协议是由IBM公司开发,主要用于数十台计算机的小型局域网。NetBIOS协议是一种在局域网上的程序可以使用的应用程序编程接口(API),为程序提供了请求低级服务的统一的命令集,作用是为了给局域网提供网络以及其他特殊功能,几乎所有的局域网都是在NetBIOS协议的基础上工作的。
SMB(Server Message Block)通信协议是微软(Microsoft)和英特尔(Intel)在1987年制定的协议,主要是作为Microsoft网络的通讯协议。SMB 是在会话层(session layer)和表示层(presentation layer)以及小部分应用层(application layer)的协议。SMB使用了NetBIOS的应用程序接口 (Application Program Interface,简称API)。另外,它是一个开放性的协议,允许了协议扩展——使得它变得更大而且复杂;大约有65个最上层的作业,而每个作业都超过120个函数,甚至Windows NT也没有全部支持到,最近微软又把 SMB 改名为 CIFS(Common Internet File System),并且加入了许多新的特色。
早期SMB协议在网络上传输明文口令。后来出现 LAN Manager Challenge/Response 验证机制,简称LM,它是如此简单以至很容易就被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。
现在已经有了更新的NTLMv2以及Kerberos验证体系。NTLM是windows早期安全协议,因向后兼容性而保留下来。NTLM是NT LAN Manager的缩写,即NT LAN管理器。
windows NT 系统大概是 微软1997年发表的,从Win2000开始默认协议为Kerboros。
NTLM 验证过程
Microsoft NTLM给出了NTLM详细介绍。
NTLM 验证分为交互式验证和非交互式验证两种。
交互式验证:
最典型的就是两个系统- 客户端请求验证; 域控制器端(保存了用户和密码的相关信息)
非交互式验证:
已经登录系统的用户去请求另一台服务器的资源,这里就涉及到三个系统了-- 客户端, 域控制器和服务器。
这两种状况的使用状况简单举例来说, 使用场景可以是:
交互式验证就是域帐号登录某台机器。
非交互式验证就是已经登录这台机器的用户,使用SSO的方式去访问某web server 上的网页。
详细的验证过程是:
- (此步只有交互式验证需要)用户登录时输入的user name、password和domain name,然后Client端计算password的hash值并保存在本地
- 客户端将user name的明文发送给DC
- DC生成一个16-byte的随机数,叫做challenge,传输给client
- client收到challenge以后,在复制一份拷贝,然后将其中一个challenge用password hash加密,这个叫做response,然后将challenge,response以及user name传送给server
- server端在收到client传送过来的三份内容以后将它们转发给DC
- DC在收到user name,response,challenge以后,根据user name在account database中找到其对应的password hash,然后用这个password hash加密challenge
- 最后一步是客户端将response跟加密后的challenge进行比较,如果相同则NTLM验证成功。
Microsoft NTLM 中有提示:
不要直接使用NTLM,而是使用negotiate。如果使用negotiate的话,那么windows会判断kerberos是否可用,如果可用就优先使用kerberos,否则使用NTLM。kerberos的安全性要比NTLM要高。
NTLM HTTP认证
但在浏览器中使用NTLM验证的时,验证过程如下:
1: C --> S GET ...
2: C <-- S 401 Unauthorized
WW-Authenticate: NTLM
3: C --> S GET ...
Authorization: NTLM <base64-encoded type-1-message>
4: C <-- S 401 Unauthorized
WWW-Authenticate: NTLM <base64-encoded type-2-message>
5: C --> S GET ...
Authorization: NTLM <base64-encoded type-3-message>
6: C <-- S 200 Ok
从交互过程可以发现,client会发送type-1消息和type-3消息给server,而server会发送type-2消息给client。
Type-1消息包括机器名、Domain等
Type-2消息包括server发出的NTLM challenge
Type-3消息包括用户名、机器名、Domain、以及两个根据server发出的challenge计算出的response,这里response是基于challenge和当前用户的登录密码计算而得
从这里可以看出, 不管是否域帐号验证成功与否, 都可以通过这种方式获取登录机器的域帐号。
注:文章转载自 http://blog.csdn.net/oscar999/article/details/18987979,感谢oscar999的详细讲解!