NetNTLMv2 哈希捕获
注意
Gemini 2.5 Pro 生成 + 人工整理
您好!您这个问题提得非常棒,直接触及了现代内网渗透测试中最核心、最普遍的一种攻击方式的底层原理。
您对攻击流程的描述是完全正确的,但您最后的疑问——“是不是靶机错误地向我传输了凭据?”——这正是最关键的认知误区。
答案是:靶机没有犯任何错误。它是在严格地、完美地执行一个设计上就存在“缺陷”的认证协议。我们利用的不是它的“错误”,而是利用了这个协议的“规则”。
一、 “夜店保安”的比喻:理解Challenge/Response
为了理解这个过程,我们先不用技术术语,用一个比喻:
- 你 (攻击者): 你开了一家假的“VIP休息室”(你的SMB服务器)。
- 靶机 (用户想进门): 某位员工的电脑,它想访问一个网络资源。
- 密码 (NTLM哈希): 只有VIP本人知道的、一个不能直接说出口的“秘密口令”。
现在,这位员工的电脑(靶机)被你诱导,走到了你这个假VIP休息室的门口。
靶机: “你好,我是
Domain\User
,我想进来。” (这是NEGOTIATE
阶段)你 (假保安): “哦?想进来?我不能直接问你的秘密口令,那样不安全。我现在给你一个随机的、一次性的数字:
123456
。你用你的秘密口令,对这个数字进行一次加密计算,把结果告诉我。如果你是对的,我就让你进。” (这是CHALLENGE
阶段,这个随机数就是挑战(Challenge))靶机: “好的。” 它的电脑会执行一个操作:
- 从系统里拿出该用户的“秘密口令”(NTLM哈希)。
- 用这个哈希,对你给的随机数
123456
进行一系列复杂的哈希运算(HMAC-MD5)。 - 得到一个加密后的结果,我们称之为**“响应(Response)”**。
- 然后把这个“响应”发回给你。 (这是
AUTHENTICATE
阶段)
“捕获”发生:
- 你作为假保安,收到了这个“响应”。你虽然不知道用户的“秘密口令”原文,但你现在拥有了三样东西:
- 用户名 (
Domain\User
) - 你发出去的随机挑战 (
123456
) - 对方用秘密口令加密挑战后返回的响应。
- 用户名 (
- 这就是被“捕获”的NetNTLMv2凭据! 它不是明文密码,也不是原始的NTLM哈希,而是一个包含了这三样东西的“认证包”。
- 你作为假保安,收到了这个“响应”。你虽然不知道用户的“秘密口令”原文,但你现在拥有了三样东西:
所以,靶机没有犯错,它只是在认真地回答保安的提问。问题在于,这个保安是假的。
二、 NetNTLMv2认证的技术分解
现在我们把上面的比喻翻译成技术术令。这个过程被称为**“挑战/响应(Challenge/Response)”认证机制**。
NEGOTIATE_MESSAGE (协商)
- 客户端向服务器发送一个协商消息,表明它想进行NTLM认证,并告知自己支持的认证特性。
CHALLENGE_MESSAGE (挑战)
- 服务器收到后,生成一个16字节的随机数,这个数被称为**“Server Challenge”**。
- 服务器将这个Challenge发回给客户端。
AUTHENTICATE_MESSAGE (认证)
- 这是最关键的一步。客户端收到Server Challenge后,会执行以下操作:
- 从系统中获取当前用户的NTLM哈希(这是用户的密码经过MD4加密后的结果,存储在SAM或NTDS.dit中)。
- 使用这个NTLM哈希作为密钥,对
Server Challenge
和一些其他信息(如用户名、域名)进行一次HMAC-MD5哈希运算。 - 这个运算的结果,就是NetNTLMv2 Response。
- 客户端将包含用户名、Server Challenge、NetNTLMv2 Response等信息的一个大数据包发回给服务器。
- 这是最关键的一步。客户端收到Server Challenge后,会执行以下操作:
三、 “捕获”到底是如何做到的?
当你使用Responder
或impacket
工具包里的smbserver.py
在本机开启一个SMB服务时,你的攻击机就扮演了服务器的角色。
- 诱导连接: 你通过LLMNR/NBT-NS投毒等方式,诱导靶机来访问你的SMB服务。
- 你发送挑战: 当靶机来连接时,你的
Responder
或smbserver.py
自己生成了一个随机的Server Challenge并发给靶机。 - 你接收响应: 靶机认真地用自己的NTLM哈希加密了这个挑战,然后把包含用户名、挑战、响应的整个认证包发回给你。
- 捕获完成: 你的工具接收到这个认证包,将其完整地、一字不差地保存到一个文件中或直接显示在屏幕上。
这串被保存下来的、包含了用户名、Server Challenge和NetNTLMv2 Response的文本,就是我们常说的“捕获到的NetNTLMv2哈希”。
捕获之后能做什么?
我们捕获的不是可以直接用于Pass-the-Hash的原始NTLM哈希,但我们可以对它做两件非常有用的事:
离线暴力破解 (Offline Cracking)
- 工具: Hashcat
- 原理: 因为我们现在同时拥有“问题”(Server Challenge)和“加密后的答案”(NetNTLMv2 Response),我们可以用Hashcat进行离线破解。Hashcat会去猜用户的原始明文密码,对每一个猜测的密码计算出其NTLM哈希,然后再用这个哈希去对我们已知的Server Challenge进行加密,看结果是否与我们捕获的Response一致。如果一致,就说明猜对了。
- Hashcat模式:
-m 5600
NTLM中继攻击 (NTLM Relay)
- 工具:
ntlmrelayx.py
- 原理: 这是更高级、更危险的利用方式。我们作为中间人,在收到靶机的认证请求后,不自己处理,而是将其原封不动地“中继”给网络中的另一台真实的服务器(比如一台文件服务器或域控)。我们把真实服务器的Challenge发给靶机,再把靶机的Response发给真实服务器,从而冒充靶机用户,登录到那台真实服务器上,而全程我们都无需知道用户的密码。
- 工具:
希望这个解释能帮您彻底理解NetNTLMv2捕获的本质!