Windows密码的网络认证---基于挑战响应认证的NTLM协议
一,网络认证NTLM协议简介
在平时的测试中,经常会碰到处于工作组的计算机,处于工作组的计算机之间是无法建立一个可信的信托机构的,只能是点对点进行信息的传输。
举个例子就是,主机A想要访问主机B上的资源,就要向主机B发送一个存在于主机 B上的一个账户,主机B接收以后会在本地进行验证,如果验证成功,才会允许主机A进行相应的访问。
NTLM 协议是一种基于 挑战(Challenge)/ 响应(Response) 认证机制,仅支持Windows的网络认证协议。
它主要分为协商、质询和验证三个步骤:
- 协商,这个是为了解决历史遗留问题,也就是为了向下兼容,双方先确定一下传输协议的版本等各种信息。
- 质询,这一步便是Challenge/Response认证机制的关键之处,下面会介绍这里的步骤。
- 验证,对质询的最后结果进行一个验证,验证通过后,即允许访问资源。
二,基本的流程
认证成功
首先,client会向server发送一个username,这个username是存在于server上的一个用户;
接着会在本地查询是否存在这样的一个用户,如果存在,将会生成一个16位的随机字符,即challenge,然后用查询到的这个username的NTLM hash和challenge进行加密,生成challenge1,将challenge1存储在本地,并将 challenge传给client;
当client接收到challenge时,将发送的username所对应的NTLM hash对challenge进行加密即response,并 response发送给server;
server在收到response后,将其与challenge1进行比较,如果相同,则验证成功;
如果不相同,则验证失败;
认证失败
首先,client会向server发送一个username,这个username是存在于server上的一个用户;
当server接收到这个信息时,首先会在本地查询是否存在这样的一个用户,如果不存在,则直接返回认证失败;
三,NTLM协议v1和v2区别
NTLM v1
- 安全性较低:NTLM v1的认证过程相对简单,安全性较低。它容易受到中间人攻击和重放攻击等。
- 认证机制:在NTLM v1中,客户端首先向服务器发送一个包含用户名(以明文形式)和挑战消息的请求。服务器接收到这个请求后,会用自己的密钥对这个挑战消息进行加密,并发送给客户端作为响应。客户端随后会用自己的密钥对挑战消息进行加密,并将这个加密后的消息发送给服务器进行验证。
NTLM v2
- 增强的安全性:相较于NTLM v1,NTLM v2提供了更强的安全性。它引入了对响应消息的额外加密层,使得攻击者更难破解。
- 改进的认证机制:在NTLM v2中,客户端和服务器之间的挑战和响应过程更加复杂。除了挑战消息外,还引入了目标信息(如服务器名称和域名)和时间戳,这些都被加入到加密计算中。这增加了攻击者伪造有效响应的难度。
- 兼容性:尽管NTLM v2提供了更强的安全性,但它仍然需要与旧的系统和应用程序兼容。因此,许多现代Windows系统同时支持NTLM v1和v2,但默认情况下可能更倾向于使用v2进行认证。
四,抓包测试
实验环境:
server2019:192.168.20.153
server2008:192.168.20.154
在2019这个机器上已经安装wireshark;
在2008上已经存在一个管理员用户,为Administrator用户;
密码为com.1234;
使用下面的命令进行网络连接;
net use \\192.168.20.154 /u:Administrator com.1234
使用wireshark进行抓包;
接下来分析抓到的数据包;
接下来根据NTLMv2格式,找出各个字段对应的值;
username::domain:challenge:HMAC‐MD5:blob
username:对应数据包中 user name
domain:对应数据包中的 Domain name
HMAC‐MD5:对应数据包中的NTProofStr
blob:数据库包中rsponse去掉HMAC‐MD5的值
10号数据包发送username和password;
11号返回challenge;
12号返回response的数据包;
username:Administrator
domain:ADMIN
challenge:afa477384221e315
NTProofStr:24f00e683ff25a2163601ccc751ba732
rsponse:24f00e683ff25a2163601ccc751ba732010100000000000063af3e97b02edb0160c9af9d01a6f7c20000000002000a00410044004d0049004e0001001400530045005200560045005200320030003000380004001200610064006d0069006e002e0063006f006d000300280053006500720076006500720032003000300038002e00610064006d0069006e002e0063006f006d0005001200610064006d0069006e002e0063006f006d000700080063af3e97b02edb0106000400020000000800300030000000000000000100000000200000219d0a74dcdbdf803b0712aab3af7d3cc94960eaaf5d459b1e46bd5c4a0793fd0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00320030002e00310035003400000000000000000000000000
接下来构造NTLMv2格式;
Administrator::ADMIN:afa477384221e315:24f00e683ff25a2163601ccc751ba732:010100000000000063af3e97b02edb0160c9af9d01a6f7c20000000002000a00410044004d0049004e0001001400530045005200560045005200320030003000380004001200610064006d0069006e002e0063006f006d000300280053006500720076006500720032003000300038002e00610064006d0069006e002e0063006f006d0005001200610064006d0069006e002e0063006f006d000700080063af3e97b02edb0106000400020000000800300030000000000000000100000000200000219d0a74dcdbdf803b0712aab3af7d3cc94960eaaf5d459b1e46bd5c4a0793fd0a001000000000000000000000000000000000000900260063006900660073002f003100390032002e003100360038002e00320030002e00310035003400000000000000000000000000
在kali中使用命令进行爆破;(拥有一个强大的字典)
john --format=netntlmv2 1.txt --wordlist=rockyou.txt
这样就得到了账户的密码;