
Wireshark 进行 SNMP 协议加密报文解密查看概述SNMP 协议与加密机制SNMPSimple Network Management Protocol简单网络管理协议是网络设备管理中广泛使用的协议用于监控网络设备如路由器、交换机、服务器的状态。早期版本SNMPv1 和 SNMPv2c采用明文传输安全性极弱攻击者可以轻松捕获并篡改管理数据。为此SNMPv3 引入了基于用户的安全模型USM支持加密通过 AES 或 DES 算法和认证通过 MD5 或 SHA 算法。然而在安全审计或网络故障排查中我们可能需要对 SNMPv3 加密报文进行解密分析。Wireshark 作为强大的网络协议分析工具内置了对 SNMPv3 解密的支持——前提是拥有正确的安全参数如用户名、认证密码、加密密码。本文将深入剖析 SNMPv3 加密报文的解密原理并通过可运行的代码示例演示如何生成加密 SNMP 报文以及如何在 Wireshark 中配置解密密钥从而查看原始管理信息。## 解密原理SNMPv3 加密流程SNMPv3 的加密基于以下核心组件-Engine ID每个 SNMP 引擎的唯一标识符用于派生加密密钥。-用户名访问实体标识。-认证协议如 HMAC-MD5-96 或 HMAC-SHA-96用于验证报文完整性。-隐私协议如 CBC-DES 或 CFB-AES用于加密 PDU协议数据单元。-密钥派生通过多次哈希操作基于 Engine ID 和密码生成认证密钥和加密密钥。解密过程需要 Wireshark 获取这些参数。通常在捕获加密的 SNMP 流量时Wireshark 会显示为“Encrypted PDU”或乱码。要解密用户需提供“Security Name”用户名、“Authentication Password”认证密码和“Privacy Password”加密密码以及准确的 Engine ID。Wireshark 会使用这些参数模拟密钥派生并解密报文。## 准备工作生成加密 SNMP 报文为了演示解密过程我们需要生成加密的 SNMPv3 报文。这里使用 Python 的pysnmp库来模拟一个 SNMP 管理器向网络设备发送加密的 GET 请求。### 代码示例1生成加密 SNMPv3 请求python# 导入 pysnmp 相关模块from pysnmp.hlapi import *# 定义 SNMP 管理器参数target_host 192.168.1.100 # 目标设备 IP模拟community public # 仅为示例实际 SNMPv3 不使用此参数username admin # SNMPv3 用户名auth_key authpassword # 认证密码priv_key privpassword # 加密密码# 创建 SNMP 引擎内置 Engine ID默认为自动生成errorIndication, errorStatus, errorIndex, varBinds next( getCmd(SnmpEngine(), # 设置安全参数用户名为 admin使用 SHA 认证和 AES 加密 UsmUserData(username, auth_key, priv_key, authProtocolusmHMACSHAAuthProtocol, # SHA-1 认证 privProtocolusmAesCfb128Protocol), # AES-128 加密 # 目标设备地址 UdpTransportTarget((target_host, 161)), # 上下文参数通常为空 ContextData(), # 要获取的 OID系统描述 ObjectType(ObjectIdentity(SNMPv2-MIB, sysDescr, 0))))# 检查错误并输出结果if errorIndication: print(fError: {errorIndication})elif errorStatus: print(fError Status: {errorStatus.prettyPrint()})else: for varBind in varBinds: print(fReceived: {varBind})注释说明-UsmUserData用于指定 SNMPv3 的安全参数包括认证密码和加密密码。-authProtocolusmHMACSHAAuthProtocol表示使用 SHA-1 进行认证。-privProtocolusmAesCfb128Protocol表示使用 AES-128 进行加密CFB 模式。- 运行此代码会向目标发送加密的 SNMP 报文但若无实际设备可配合 Wireshark 抓包工具模拟。注意实际运行需要安装pysnmp库pip install pysnmp并确保目标设备开启 SNMPv3 服务。为演示方便可以在本地使用 Net-SNMP 的snmptrapd或模拟器。## Wireshark 解密配置步骤假设我们已经使用上述代码或通过真实设备捕获了加密的 SNMPv3 流量。接下来在 Wireshark 中解密1.打开捕获文件加载包含 SNMPv3 加密报文的.pcap文件。2.进入首选项点击菜单栏Edit-Preferences或按CtrlShiftP。3.找到 SNMP 协议在左侧协议树中展开Protocols选择SNMP。4.添加解密密钥在右侧的User Table区域点击Edit按钮添加新条目 -Engine ID如果已知填写十六进制字符串如0x80001f8880...。若未知可留空或使用捕获到的报文中的 Engine ID可在 SNMP 报文的msgAuthoritativeEngineID字段查看。 -Security Name例如admin。 -Authentication Protocol选择SHA-1与生成时一致。 -Authentication Password输入authpassword。 -Privacy Protocol选择AES-128CFB 模式。 -Privacy Password输入privpassword。5.应用并查看点击OK保存然后刷新 Wireshark按CtrlR。此时加密的 SNMP 报文应显示为明文数据包括 OID 和值。原理Wireshark 会从捕获的报文中提取 Engine ID如果未手动指定然后结合用户输入的密码通过标准密钥派生算法RFC 3414计算会话密钥最终解密报文。## 代码示例2提取 SNMP 报文中的 Engine ID如果捕获的报文中 Engine ID 未知我们可以编写一个 Python 脚本解析 pcap 文件并提取 Engine ID。这有助于在 Wireshark 中正确配置解密参数。python# 使用 scapy 库解析 pcap 文件提取 SNMPv3 Engine IDfrom scapy.all import *def extract_snmp_engine_id(pcap_file): # 读取 pcap 文件 packets rdpcap(pcap_file) for packet in packets: # 检查是否为 UDP 报文且目的端口为 161SNMP if packet.haslayer(UDP) and (packet[UDP].dport 161 or packet[UDP].sport 161): # 尝试解析 SNMP 层 try: # 使用 scapy 的 SNMP 解析器需要扩展此处为模拟 # 注意scapy 默认不支持 SNMPv3 直接解析此处仅演示思路 # 实际应使用 raw 数据解析 BER 编码 raw_data bytes(packet[UDP].payload) # 假设我们知道 SNMPv3 报文中 Engine ID 的偏移 # 实际解析需参考 RFC 3412 的 BER 结构 # 这里仅打印前 50 字节作为示例 print(fRaw packet data (first 50 bytes): {raw_data[:50].hex()}) # 真实场景中需要解析 msgAuthoritativeEngineID 字段 # 例如offset 12, length 8 等具体取决于编码 break except Exception as e: print(fError parsing packet: {e}) continue# 使用示例extract_snmp_engine_id(snmp_capture.pcap)注释说明- 此代码使用scapy库pip install scapy读取 pcap 文件。- 由于 SNMPv3 的 BERBasic Encoding Rules编码复杂直接解析 Engine ID 需要手动处理 TLV 结构。实际应用中可使用pysnmp库的hlapi或 Wireshark 的导出功能。- 在实际调试中更简单的方法是在 Wireshark 中查看报文详情展开 SNMP 层找到msgAuthoritativeEngineID字段复制其值如80 00 1f 88 80 ...。## 常见问题与调试技巧-解密失败最常见的原因是密码错误或协议不匹配。确保认证协议SHA-1 vs MD5和加密协议AES vs DES与生成时一致。-Engine ID 不匹配如果 Wireshark 未正确识别 Engine ID手动从报文中提取并输入。-密钥派生差异某些设备可能使用非标准密钥派生如厂商自定义此时需要查阅设备文档。-Wireshark 版本建议使用最新版 Wireshark3.x 以上对 SNMPv3 解密支持更完善。## 总结通过本文我们深入剖析了 SNMPv3 加密报文的解密原理涵盖了从密钥派生到 Wireshark 配置的完整流程。我们通过 Python 代码示例演示了如何生成加密的 SNMP 请求并提供了提取 Engine ID 的辅助脚本。实际操作中只需在 Wireshark 中正确输入用户名、认证密码、加密密码和 Engine ID即可将加密的 SNMP 流量还原为可读的管理信息。这一技术对于网络安全审计、故障排查和协议分析至关重要。掌握它你将能透视加密网络中的管理数据洞悉设备状态。