news 2026/5/1 16:21:29

别再只记NTLM Hash了!手把手带你用Wireshark抓包,实战分析Windows网络认证全过程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
别再只记NTLM Hash了!手把手带你用Wireshark抓包,实战分析Windows网络认证全过程

从流量视角拆解Windows认证:Wireshark捕获NTLM三阶段全流程实战

当你盯着net use命令返回的"Access Denied"时,是否好奇过Windows究竟如何在后台完成身份验证?传统教程总让我们死记硬背NTLM Hash的计算公式,却很少展示协议在真实网络中的流动形态。今天我们将切换视角,用Wireshark抓包工具亲历NTLM认证的完整生命周期——从Type 1协商包到Type 3响应包,每个字节都有其存在的意义。

1. 实验环境搭建与抓包准备

在开始解剖协议之前,我们需要一个可控的实验环境。建议使用VirtualBox创建两台Windows 10虚拟机(192.168.1.10作为客户端,192.168.1.20作为服务器),确保它们处于同一NAT网络。禁用防火墙规则以免干扰认证流量:

# 在客户端和服务器执行 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False

安装Wireshark时需特别注意:必须勾选"Install Npcap in WinPcap API-compatible mode",这是捕获SMB流量的关键。启动抓包后立即应用过滤器:

# Wireshark捕获过滤器 smb || nbns || http || ntlmssp

触发认证最直接的方式是通过SMB协议访问共享资源。在客户端执行以下命令时,Wireshark窗口应立即显示相关流量:

:: 触发NTLM认证(替换实际密码) net use \\192.168.1.20\IPC$ /user:Administrator P@ssw0rd

关键配置检查点

  • 确保两台机器处于工作组模式(非域环境)
  • 服务器需开启IPC$共享(默认启用)
  • 客户端需使用未缓存的凭据(首次访问)

实验小技巧:在虚拟机中,可通过"克隆"功能快速复制出多台测试机,但记得修改每台的SID(使用sysprep工具)和IP地址。

2. NTLM Type 1消息:协商阶段的秘密握手

第一个值得关注的包通常标记为"SMB2 Negotiate Protocol"。展开SMB2头部的NTLMSSP字段,你会看到类似如下的结构:

NTLM Secure Service Provider NTLMSSP identifier: NTLMSSP NTLM Message Type: NTLMSSP_NEGOTIATE (1) Flags: 0xe2888235 Negotiate 56: True Negotiate Key Exchange: True Negotiate 128: True Negotiate Version: False Negotiate Target Info: True Request Non-NT Session Key: True Negotiate Identify: False Negotiate Extended Session Security: True Target Type: Domain Negotiate Always Sign: True Negotiate NTLM: True Negotiate Seal: True Negotiate Sign: True Negotiate OEM: True Negotiate Unicode: True

Flags字段详解

  • Negotiate NTLM(0x2000000):声明使用NTLM认证
  • Negotiate Unicode(0x1):要求字符串使用Unicode编码
  • Negregate Version(0x2000000):是否包含版本信息(本例未包含)

实战中易忽略的细节

  1. 如果看到Negotiate Local Call标志,说明是本地认证而非网络认证
  2. Target Type显示为"Domain"时,即使在工作组环境也会触发域认证流程
  3. 版本缺失可能影响NTLMv2的兼容性

用Python可以构造自己的Type 1消息:

import struct def build_type1(): signature = b'NTLMSSP\x00' msg_type = struct.pack('<I', 1) flags = struct.pack('<I', 0xe2888235) return signature + msg_type + flags

3. Type 2挑战消息:服务器端的防御艺术

服务器响应Type 1的包中,关键看NTLMSSP_CHALLENGE部分。以下是一个真实的Type 2消息解码示例:

NTLM Secure Service Provider NTLMSSP identifier: NTLMSSP NTLM Message Type: NTLMSSP_CHALLENGE (2) Target Name: WIN-7X64 Flags: 0xe2898235 Challenge: 7acd6e3d6a0c8f5b Context: 00000000 Target Information (av_pairs): DNS_COMPUTER_NAME: WIN-7X64 DNS_DOMAIN_NAME: WORKGROUP TERMINATOR:

Challenge生成机制: Windows使用CryptGenRandom() API生成16字节随机数(NTLMv2)。在注册表中可找到版本控制策略:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa] "LmCompatibilityLevel"=dword:00000003

安全加固建议

  • 将LmCompatibilityLevel设为5可强制使用NTLMv2
  • 禁用NTLMv1可防止彩虹表攻击
  • 启用SMB签名可缓解中继攻击

技术细节:在域环境中,Challenge由域控制器生成而非本地服务器,这是判断认证是否经过域控的重要标志。

4. Type 3认证消息:客户端响应全解析

客户端收到Challenge后构建的Type 3消息是最复杂的部分。我们重点关注NTProofStrResponse字段:

NTLM Secure Service Provider NTLMSSP identifier: NTLMSSP NTLM Message Type: NTLMSSP_AUTH (3) LM Response: 000000000000000000000000000000000000000000000000 NT Response: NTProofStr: d6e41b98b9e5f4f3c6b1d48e7a5f3d2 Response: 0101000000000000a03acf5bd601d701... Domain: WIN-7X64 User: Administrator Workstation: WIN10-CLIENT Session Key: 00000000000000000000000000000000 Flags: 0xe2888235

Response生成算法

  1. 将用户名转换为大写:"Administrator" → "ADMINISTRATOR"
  2. 拼接域名:"ADMINISTRATOR" + "WIN-7X64"
  3. 计算Unicode编码:"A\x00D\x00M\x00I\x00N\x00..."
  4. 用NTLM Hash作为Key进行HMAC-MD5运算
  5. 对Challenge+Blob进行二次HMAC-MD5得到NTProofStr

使用Impacket库验证计算:

from hashlib import md4 import hmac def ntlm_hash(password): return md4(password.encode('utf-16le')).digest() def ntlmv2_response(nt_hash, username, domain, challenge, blob): key = hmac.new(nt_hash, (username.upper()+domain).encode('utf-16le'), 'md5').digest() return hmac.new(key, challenge+blob, 'md5').digest()

5. 认证结果与安全分析

成功的认证会在SMB层返回STATUS_SUCCESS,而失败则显示STATUS_LOGON_FAILURE。从安全角度看,有几个关键风险点:

NTLM协议脆弱性

  • 中继攻击:Net-NTLM Hash可被重放到其他服务器
  • 哈希传递:直接使用NTLM Hash进行横向移动
  • 暴力破解:NTLMv1的Challenge仅有8字节

防御方案对比表

攻击类型缓解措施实施难度兼容性影响
中继攻击启用SMB签名★★★☆☆可能影响旧系统
哈希传递限制本地管理员权限★★☆☆☆
暴力破解强制NTLMv2★☆☆☆☆可能影响旧设备

检测恶意认证的Wireshark过滤器

# 检测异常多的认证尝试 ntlmssp && frame.time_delta < 1 # 寻找NTLMv1流量(安全风险) ntlmssp.ntlm_version == 1 # 捕获空会话尝试 smb2.session_id == 0x0000000000000000

6. 进阶实战:从流量提取Net-NTLM Hash

安全研究人员常需要从抓包文件中提取认证凭证。使用Python的scapy库可以快速实现:

from scapy.all import * def extract_netntlm(pcap): creds = [] for pkt in rdpcap(pcap): if pkt.haslayer(NTLM_Header): if pkt[NTLM_Header].type == 3: domain = pkt[NTLM_Domain].Domain.decode('utf-16le') user = pkt[NTLM_User].User.decode('utf-16le') nthash = pkt[NTLM_NTResponse].NTResponse.hex() creds.append(f"{user}::{domain}:{nthash}") return creds

提取的Hash格式为:username::domain:challenge:NTProofStr:blob,可直接用于Hashcat破解:

hashcat -m 5600 netntlmv2.txt rockyou.txt

性能优化技巧

  • 在GPU服务器上使用--force参数绕过警告
  • 组合使用-a 3(掩码攻击)和-a 0(字典攻击)
  • 对大型字典使用--session保存进度

7. 企业环境下的NTLM监控策略

在生产环境中,我们更需要持续监控NTLM流量。以下是基于Elastic Stack的实施方案:

Logstash过滤规则

filter { if [message] =~ /NTLMSSP/ { grok { match => { "message" => ".*NTLMSSP_AUTH.*User:%{DATA:user}.*Domain:%{DATA:domain}.*" } } fingerprint { source => ["[source_ip]", "[user]"] target => "[event_hash]" method => "SHA1" } } }

Kibana预警规则

  1. 相同IP在1分钟内发起超过5次认证失败
  2. 出现NTLMv1协议的使用记录
  3. 非工作时间段的异常认证尝试

在Windows事件日志中,关键事件ID包括:

  • 4624:成功登录
  • 4625:失败登录
  • 4776:NTLM认证尝试

可通过PowerShell脚本集中收集:

Get-WinEvent -FilterHashtable @{ LogName='Security' ID=4776 } | Select-Object -Property TimeCreated,Message
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 16:15:59

怎样高效使用Iwara视频下载工具:专业用户的完整实战指南

怎样高效使用Iwara视频下载工具&#xff1a;专业用户的完整实战指南 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool IwaraDownloadTool是一款专为Iwara平台设计的强大浏览器脚本…

作者头像 李华
网站建设 2026/5/1 16:11:54

告别DQ线混战:手把手解析NAND新接口SCA如何用CA通道提升SSD性能

告别DQ线混战&#xff1a;SCA接口如何通过CA通道重塑SSD性能架构 当一块高端SSD在满负荷运行时&#xff0c;工程师们常常会观察到一种奇怪的现象&#xff1a;尽管NAND颗粒的接口速率已经突破2000MT/s&#xff0c;但实际有效带宽却始终无法突破理论值的60%。这种性能瓶颈的根源…

作者头像 李华