NTLM 协议

来源

介绍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 上的网页。

详细的验证过程是:

  1. (此步只有交互式验证需要)用户登录时输入的user name、password和domain name,然后Client端计算password的hash值并保存在本地
  2. 客户端将user name的明文发送给DC
  3. DC生成一个16-byte的随机数,叫做challenge,传输给client
  4. client收到challenge以后,在复制一份拷贝,然后将其中一个challenge用password hash加密,这个叫做response,然后将challenge,response以及user name传送给server
  5. server端在收到client传送过来的三份内容以后将它们转发给DC
  6. DC在收到user name,response,challenge以后,根据user name在account database中找到其对应的password hash,然后用这个password hash加密challenge
  7. 最后一步是客户端将response跟加密后的challenge进行比较,如果相同则NTLM验证成功。

NTLM 协议_第1张图片

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的详细讲解!

你可能感兴趣的:(windows,http,NTLM)