SNMP报文抓取与分析(一)

SNMP报文抓取与分析(一)

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
^C
o@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码值
a1 PUD类型get-next-request
1f snmp pdu的长度为31个OctStr(后面的内容31字节)
02 04 22 70 8b d4 请求标识符Request ID
02 01 00 表示error-state为0
02 01 00 表示error-index为0
30 11 表示后面变量绑定是SEQUENCE类型17个字节长度
30 0f 表示(变量名1
06 表示该字段是OID类型
0b OID长度11字节
2b 06 01 04 01 1.3.6.1.4.1(标识1.3被合并为2B)
8c a6 5e 201566 (这也是根据规则转换得到的)
01 01 01 1.1.1
05 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码值
a2 PUD类型get-response
23 snmp pdu的长度为35个OctStr(后面的内容31字节)
02 04 22 70 8b d4 请求标识符Request ID
02 01 00 表示error-state为0
02 01 00 表示error-index为0
30 11 表示后面变量绑定是SEQUENCE类型17个字节长度
30 0f 表示(变量名1
06 表示该字段是OID类型
0b OID长度11字节
2b 06 01 04 01 1.3.6.1.4.1(标识1.3被合并为2B)
8c a6 5e 201566 (这也是根据规则转换得到的)
01 01 01 1.1.1
00 表示.0 即第一个实例\
  (下面的值实际是节点1.3.6.1.4.1.201566.1.1.1.0的)
02 01 2b 02 01 表示INTEGER类型1个字节,2b表示值(43)
05 00 表示NULL

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

posted @ 2015-07-23 17:50  乌合之众  阅读(7068)  评论(0编辑  收藏  举报
clear