SNMP报文抓取与分析(一)

来源:互联网 发布:淘宝api推广 编辑:程序博客网 时间:2024/06/05 14:09

1、抓取SNMP报文

SNMP报文的形式大致如下图所示

我们这里使用netcat这个工具来抓取snmpPDU(协议数据单元)。(因为我们并不需要前面的IPUDP首部)

关于netcat的一些基本使用可以看这里http://www.cnblogs.com/oloroso/p/4610563.html

本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso
本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso

netcat获取snmp报文

1 先获取snmpwalk发出的(get-next-request)

我们使用nc来监听161端口,然后把输出重定向到文件a.hex。因为监听的是161端口,所以这里必须以root权限运行。

sudo nc -u -l 161 >a.hex

这样之后使用snmpwalk这个工具来向这个“受控端”发送命令。

snmpwalk -c public -v 2c localhost 1.3.6.1.4.201566.1.1

2 再获取代理程序发回的(get-response)

我们先要打开代理程序Agent,然后使用下面的命令将a.hex的内容发给代理程序,并将接收到的返回保存到b.hex

o@o-pc:~/snmpPUD$ nc -u 127.0.0.1 161 <a.hex >b.hex^Co@o-pc:~/snmpPUD$

下图是针对SNMPv1版本的。目前比较通用的是SNMP v2c/v3版本,具有八种PDU类型。

分析获取到的报文

先使用hexdump来查看一下获取到的报文内容。(hexdump是一个很好用的十六进制分析工具)

o@o-pc:~/snmpPUD$ hexdump -C a.hex 00000000  30 2c 02 01 01 04 06 70  75 62 6c 69 63 a1 1f 02  |0,.....public...|00000010  04 22 70 8b d4 02 01 00  02 01 00 30 11 30 0f 06  |."p........0.0..|00000020  0b 2b 06 01 04 01 8c a6  5e 01 01 01 05 00        |.+......^.....|0000002e
o@o-pc:~/snmpPUD$ hexdump -C b.hex 00000000  30 30 02 01 01 04 06 70  75 62 6c 69 63 a2 23 02  |00.....public.#.|00000010  04 22 70 8b d4 02 01 00  02 01 00 30 15 30 13 06  |."p........0.0..|00000020  0e 2b 06 01 04 01 8c a6  5e 01 01 01 01 01 00 02  |.+......^.......|00000030  01 2b                                             |.+|00000032

报文分析结果

先看结果,然后再慢慢分析

get-next-request报文示例分析(a.hex)

十六进制数据解释30表示SNMP协议报文(整个报文是一个SEQUENCE)2c消息长度44字节(表示后面还有44个字节的内容)02 01 01协议版本(2c)(前两个字节02表示INTEGER类型01是指1个字节长度,最后的01是值01)04参数类型(OCTSTR)06群体(community)名长度70 75 62 6c 69 63群体名public的assic码值a1PUD类型get-next-request1fsnmp pdu的长度为31个OctStr(后面的内容31字节)02 04 22 70 8b d4请求标识符Request ID02 01 00表示error-state为002 01 00表示error-index为030 11表示后面变量绑定是SEQUENCE类型17个字节长度30 0f表示(变量名106表示该字段是OID类型0bOID长度11字节2b 06 01 04 011.3.6.1.4.1(标识1.3被合并为2B)8c a6 5e201566 (这也是根据规则转换得到的)01 01 011.1.105 00表示NULL

get-response报文示例分析(b.hex)

十六进制数据解释30表示SNMP协议报文(整个报文是一个SEQUENCE)30消息长度48字节(表示后面还有48个字节的内容)02 01 01协议版本(2c)(前两个字节02 01 表示INTEGER类型)04参数类型(OCTSTR)06群体(community)名长度70 75 62 6c 69 63群体名public的assic码值a2PUD类型get-response23snmp pdu的长度为35个OctStr(后面的内容31字节)02 04 22 70 8b d4请求标识符Request ID02 01 00表示error-state为002 01 00表示error-index为030 11表示后面变量绑定是SEQUENCE类型17个字节长度30 0f表示(变量名106表示该字段是OID类型0bOID长度11字节2b 06 01 04 011.3.6.1.4.1(标识1.3被合并为2B)8c a6 5e201566 (这也是根据规则转换得到的)01 01 011.1.100表示.0 即第一个实例\ (下面的值实际是节点1.3.6.1.4.1.201566.1.1.1.0的)02 01 2b02 01 表示INTEGER类型1个字节,2b表示值(43)05 00表示NULL

下面是使用snmpwalk命令获取的结果

0 0