snmp数据包分析

今天看了一下snmp数据包的报文格式,用wireshark抓了两个数据包来分析。

先说说snmp get-request的书报包格式吧,get-next-request,get-response,set-request这几个格式都是差不多的,只是pdu类型不一样。还有trap格式不大一样。

好,先说说get-request报文格式(参考tcp/ip详解 卷一)。

版本 + 团体名 + pdu类型 + 请求标识 + 差错状态 + 差错索引 + 差错索引 + 名称 + 值 + 名称 + 值 。。。。

trap的也说一下

版本 + 团体名 + pdu类型 + 企业 + 代理地址 + trap类型 + 特定代码 + 时间戳 + 名称 + 值。。。

okay,下面说一下我的环境

主机windows xp虚拟机Vmware ubuntu,抓包工具wireshark,使用的netsnmp,主机ip210.38.235.184,虚拟机ip210.38.235.186

这里虚拟机向主机发一条命令snmpget -v 1 -c public 210.38.235.184 sysDescr.0(oid为1.3.6.1.2.1.1.1.0)

先来看看snmp v1版的数据包吧

c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00 00 47 21 ba 40 00 40 11 9d 2b d2 26 eb ba d2 26 eb b8 96 f9 00 a1 00 33 8a 2d 30 29 02 01 00 04 06 70 75 62 6c 69 63 a0 1c 02 04 26 ca 2f cb 02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 01 00 05 00

c8 1f 66 05 fb a6//目的网卡地址

00 0c 29 90 f7 6d//源网卡地址

08 00//协议类型,这里是ip协议

45 00 00 47 21 ba 40 00 40 11 9d 2b d2 26 eb ba d2 26 eb b8//ip头部20个字节

96 f9 00 a1 00 33 8a 2d//udp8个字节

30 29//30表示snmp消息用的是asn.1 sequence 29表示消息长度(29后面的字节数)41个字节

02 01 00 //这里采用的是BER(Basic encode rule)编码(第一个字节表示数据类型,第二个字节表示数据长度,后面为数据)02表示INTEGER类型,01表示长度为1,00表示版本为v1
04 06 70 75 62 6c 69 63//这里是团体名public阿斯科马,这里也采用的是BER编码

a0 1c//pdu类型a0表示get-request 1c表示pdu数据长度28个字节

02 04 26 ca 2f cb//request-id管理进程设置的一个整数

02 01 00//差错状态,00表示没有出现差错

02 01 00//差错状态索引,00

30 0e//表示值名称采用的是asn.1,数据长度为14个字节

30 0c//表示第一个值名称采用的是asn.1,数据长度为12个字节

06 08 2b 06 01 02 01 01 01 00//这里采用的是BER,但是snmp,oid的编码方式有点怪,后面我会有说明

05 00//snmp NULL 所以数据长度为0

okay上面已经分析完snmp v1的数据包

下面看看snmp v2数据包

c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00 00 47 21 b9 40 00 40 11 9d 2c d2 26 eb ba d2 26 eb b8 a8 8d 00 a1 00 33 d1 e6 30 29 02 01 01 04 06 70 75 62 6c 69 63 a0 1c 02 04 51 5a b7 e0 02 01 00 02 01 00 30 0e 30 0c 06 08 2b 06 01 02 01 01 01 00 05 00

c8 1f 66 05 fb a6 //目的网卡地址
00 0c 29 90 f7 6d //源网卡地址 这里应该是数据链路层封装的头部
08 00 //协议类型,这里是ip协议

45 00 00 47 21 b9 40 00 40 11 9d 2c d2 26 eb ba d2 26
eb b8 //ip首部
a8 8d 00 a1 00 33 d1 e6 //udp首部
//下面是snmp报文
30//表示snmp消息是asn.1 sequence类型
29//29表示该字段后面还有41个字节
02 01 01//最后一个01表示snmp版本为2c这里采用的是BER编码方式 02表示该字段为INTEGER类型,第二个01表示数据长度为1
04 06 70 75 62 6c 69 63 //这里是团体名称public,04表示数据类型为OCTET STRING类型,06表示数据长度为6个字节,后面6个为public 的阿斯科马值,但是这里为什么后面的没有采用这种BER编码方式,即数据类型+数据长度+数据类容
a0 1c //a0表示报文类型为get-request,1c表示后面还有28个字节的数据,这里为什么没有采用BER编码方式?这里除了类型字段外,其他的都采用BER编码方式
02 04 51 5a b7 e0 //request ID这是由管理进程设置的一个整数这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文

02 01 00 //差错状态 00表示noError
02 01 00 //差错状态索引00
//下面为名称 值
30 0e //30 asn.1 sequence类型 0e长度为14
30 0c //第一个名值对编码方式asn.1 sequence 长度为12
06 08 2b 06 01 02 01 01 01 00 //oid为1.3.6.1.2.1.1.1.0 关于SNMP的OID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为x和y。编码时40*x+y,这里x=1,y=3,因此结果为40*1+3=43,即表示十六进制的2b
05 00//asn.1的NULL类型 variable-value1的值为NULL

这里说明一下关于SNMP的OID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为x和y。编码时40*x+y,这里x=1,y=3,因此结果为40*1+3=43,即表示十六进制的2b

关于snmp trap数据包,我会面会分析。可以参考http://blog.chinaunix.net/uid-23069658-id-3251045.html这篇文章写得还不错

snmp报文中pdu只有pdu类型没有采用BER编码,其他的都采用了BER编码

okay先到这

参考:http://blog.chinaunix.net/uid-23069658-id-3251045.html

接着昨天的写

今天抓了一个snmpget -v 1 -c public 210.38.235.184 sysDescr.0,对应的get-response数据包

 还是先上抓到的数据包

//getresponse数据包
//换成v1版
//从虚拟机linux ip:210.38.235.186
//发送snmpget -v 1 -c public 210.38.235.184 sysDescr.0
//到主机windwos xp ip:210.38.235.184
//使用wireshark抓取到的数据包
00 0c 29 90 f7 6d c8 1f 66 05 fb a6 08 00 45 00
00 cd 01 7d 00 00 40 11 fc e2 d2 26 eb b8 d2 26
eb ba 00 a1 d3 95 00 b9 cb ae 30 81 ae 02 01 00
04 06 70 75 62 6c 69 63 a2 81 a0 02 04 34 55 03
c4 02 01 00 02 01 00 30 81 91 30 81 8e 06 08 2b
06 01 02 01 01 01 00 04 81 81 48 61 72 64 77 61
72 65 3a 20 78 38 36 20 46 61 6d 69 6c 79 20 36
20 4d 6f 64 65 6c 20 35 38 20 53 74 65 70 70 69
6e 67 20 39 20 41 54 2f 41 54 20 43 4f 4d 50 41
54 49 42 4c 45 20 2d 20 53 6f 66 74 77 61 72 65
3a 20 57 69 6e 64 6f 77 73 20 32 30 30 30 20 56
65 72 73 69 6f 6e 20 35 2e 31 20 28 42 75 69 6c
64 20 32 36 30 30 20 4d 75 6c 74 69 70 72 6f 63
65 73 73 6f 72 20 46 72 65 65 29

下面是分析数据包

//get-response数据包
//snmpget -v 1 -c public 210.38.235.184 sysDescr.0
//得到对应的snmp get-response数据包
00 0c 29 90 f7 6d //目的网卡地址mac地址
c8 1f 66 05 fb a6 //源网卡地址mac地址
08 00 //协议类型,这里是ip协议
45 00 00 cd 01 7d 00 00 40 11 fc e2 d2 26 eb b8 d2 26 eb ba //ip首部
00 a1 d3 95 00 b9 cb ae //udp首部 16位源端口 + 16位目的端口 + 16udp长度 + 16位udp校验和
30 81 ae //这里30表示asn.1中的sequence 81和ae同时表示数据长度,这里后面会重点讲解一下数据长度为174,注意计算方法
02 01 00 //版本号v1
04 06 70 75 62 6c 69 63 //团体名public
a2 81 a0 //a2表示消息类型为get-response,81,a0表示数据长度
02 04 34 55 03 c4 //这里为request id整数
02 01 00 //这里是差错状态,noError值为0
02 01 00 //差错索引,这里为0
30 81 91 //30值名称为asn.1的sequence 81和91为值名称的长度
30 81 8e //同上
06 08 2b 06 01 02 01 01 01 00 //这里应该是oid了,1.3.6.1.2.1.1.1.0
04 81 81 //这里为oid对应的值了Hardware: x86 Family 6 Model 58 Stepping 9 AT/AT COMPATIBLE - Software: Windows 2000 Version 5.1 (Build 2600 Multiprocessor Free)可以查阿斯科马表
48 61 72
64 77 61 72 65 3a 20 78 38 36 20 46 61 6d 69 6c
79 20 36 20 4d 6f 64 65 6c 20 35 38 20 53 74 65
70 70 69 6e 67 20 39 20 41 54 2f 41 54 20 43 4f
4d 50 41 54 49 42 4c 45 20 2d 20 53 6f 66 74 77
61 72 65 3a 20 57 69 6e 64 6f 77 73 20 32 30 30
30 20 56 65 72 73 69 6f 6e 20 35 2e 31 20 28 42
75 69 6c 64 20 32 36 30 30 20 4d 75 6c 74 69 70
72 6f 63 65 73 73 6f 72 20 46 72 65 65 29//174个字节

通过分析,snmp 中get-response数据包,其实和get-request的格式是一样的。不过今天由于数据包长度超过了127,使得计算上面差点没看懂,通过谷歌看到了一个很好的解释http://stackoverflow.com/questions/22998212/decode-snmp-pdus-where-to-start 这里面很好的解释了,30 81 ae , udp首部后面,30 81 ae的原因。(顺便吐槽一下度娘有点渣)

 okay,下面重点说一下30 81 ae是怎么回事

算了,我还是把别人的贴过来吧,写的很清楚

representing numbers larger than 255. To do this SNMP uses only the 7 least significant bits to store data, the most significant bit is a flag to signal that the data continues in the next byte. Numbers lower than 128 are stored in a single byte

0x127
= 0 111 1111
= 127

  0x85 0x22
= 1 000 0101, 0 010 0010
=   000 0101    010 0010
= 674

  0xc0 0x80 0x80 0x80
= 1 100 0000, 1 000 0000, 1 000 0000, 0 000 0000
=   100 0000    000 0000    000 0000    000 0000
= 0x8000000

This method is also used if the length of a TLV field is larger than 127.

RFC1592 describes the structure of the messages, take a look at page 11 for a similar example.

I can also recommend using Wireshark to analyze packets, it does an excellent job of translating them to something readable.

 上面是stackoverflow上的解释

在30 81 ae后面有174个字节(我数了一下)

照着上面的算法

81 ae 

1000 0001 1010 1110

超过了127后面的数字也表示数据长度,这样

实际表示的数据为

 000 0001 010 1110

整理一下为0000 0000 1010 1110(十进制为174)

ps:snmp v1的trap数据包和v2的trap数据包格式不一样,v2的trap数据包越来越接近普通报文数据包。snmp trap要配置一下,暂时不抓取snmp trap数据包分析了

待续

接着上午的写,本来以为net-snmp的trap消息需要配置一些配置文件,后面man了一下snmptrap 和snmptrapd命令,发现如果要发送trap消息是不需要配置的,直接使用snmptrap命令就行了,因为snmptrap是一个发送trap消息的命令。snmptrapd需要配置,来接收snmp trap消息。好了,和以前一样先上数据包,然后分析数据包(主机ip:210.38.235.184)

snmp v2 trap

//snmp v2 trap数据包
//snmptrap -v 2c -c public 210.38.235.184 "aaa" 1.3.6.1.4.1.2345 SNMPv2-MIB::sysLocation.0 s "just here"
//              manager ip 主机名

c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00
00 67 21 31 40 00 40 11 9d 94 d2 26 eb ba d2 26
eb b8 a3 14 00 a2 00 53 92 5a 30 49 02 01 01 04
06 70 75 62 6c 69 63 a7 3c 02 04 7e df d8 73 02
01 00 02 01 00 30 2e 30 15 06 0a 2b 06 01 06 03
01 01 04 01 00 06 07 2b 06 01 04 01 92 29 30 15
06 08 2b 06 01 02 01 01 06 00 04 09 6a 75 73 74
20 68 65 72 65

 分析数据包

c8 1f 66 05 fb a6 //目的网卡地址
00 0c 29 90 f7 6d //源网卡地址
08 00 //协议类型
45 00 00 67 21 31 40 00 40 11 9d 94 d2 26 eb ba d2 26 eb b8//ip首部
a3 14 00 a2 00 53 92 5a //udp首部

30 49 //asn.1 49数据长度73个字节
02 01 01 //snmp版本v2
04 06 70 75 62 6c 69 63 //团体名 public
a7 3c //这里a7指的是trap类型为厂家自定义类型 3c为数据长度60个字节
02 04 7e df d8 73 //这里是request id整数
02 01 00 //这里是差错状态00表示noError
02 01 00 //这里是差错索引00
30 2e //30 asn.1 2e数据长度46个字节
30 15 //第一个值名称用的是asn.1 sequence 数据长度为21个字节
06 0a 2b 06 01 06 03 01 01 04 01 00 //object name 1.3.6.1.6.3.1.1.4.1.0
06 07 2b 06 01 04 01 92 29 //value 1.3.6.1.4.1.2345
//第二个值名称(这里不止一个名称-值)
30 15 //第二个值名称
06 08 2b 06 01 02 01 01 06 00 //object name 1.3.6.1.2.1.1.6.0
04 09 6a 75 73 74 20 68 65 72 65//value just here的阿斯科马

这里通过分析snmp v2 trap数据包可以发现,其实snmp v2 trap数据包格式和snmp get-request的数据包格式越来越接近

下面还有snmp v1 trap数据包的分析

snmp v1 trap 数据包分析

先上数据包

//snmp v1 trap 数据包
//snmptrap -v1 -c public 210.38.235.184 1.3.6.1.4.1.1 210.38.235.186 2 3 1000 1.3.6.1.9.9.44.1.2.1 i 12 1.3.4.1.2.3.1 s test_snmptrap
c8 1f 66 05 fb a6 00 0c 29 90 f7 6d 08 00 45 00
00 6e 21 32 40 00 40 11 9d 8c d2 26 eb ba d2 26
eb b8 a7 c7 00 a2 00 5a e4 4c 30 50 02 01 00 04
06 70 75 62 6c 69 63 a4 43 06 06 2b 06 01 04 01
01 40 04 d2 26 eb ba 02 01 02 02 01 03 43 02 03
e8 30 29 30 0e 06 09 2b 06 01 09 09 2c 01 02 01
02 01 0c 30 17 06 06 2b 04 01 02 03 01 04 0d 74
65 73 74 5f 73 6e 6d 70 74 72 61 70

分析数据包

//snmp v1 trap 数据包
//snmptrap -v1 -c public 210.38.235.184 1.3.6.1.4.1.1 210.38.235.186 2 3 1000 1.3.6.1.9.9.44.1.2.1 i 12 1.3.4.1.2.3.1 s test_snmptrap
//              manager ip 企业id agent ip trap类型 trap特征码 uptime 被发送oid
c8 1f 66 05 fb a6 //manager 网卡地址
00 0c 29 90 f7 6d //agent 网卡地址
08 00 //协议类型
45 00
00 6e 21 32 40 00 40 11 9d 8c d2 26 eb ba d2 26 eb b8//ip首部20个字节
a7 c7 00 a2 00 5a e4 4c //udp首部8个字节
30 50 //asn.1 sequence 80个字节
02 01 00 //snmp 版本v1
04 06 70 75 62 6c 69 63 //团体名public
a4 43 //trap类型 67个字节
06 06 2b 06 01 04 01 01 //enterprise 1.3.6.1.4.1
40 04 d2 26 eb ba //代理地址210.38.235.186
02 01 02 //trap类型 02
02 01 03 //trap特征码03
43 02 03 e8 //启动时间 1000 0x 03e8
30 29 //名称值 41个字节
30 0e //第一个名称值 14个字节
06 09 2b 06 01 09 09 2c 01 02 01//object name 1.3.6.1.9.9.44.1.2.1
02 01 0c //value 12
30 17 //第二个名称值 23个字节
06 06 2b 04 01 02 03 01 //1.3.4.1.2.3.1
04 0d 74 65 73 74 5f 73 6e 6d 70 74 72 61 70//test_snmptrap 阿斯科马

这里snmp v1 trap数据包分析完,可以发现格式为版本号+团体名+trap类型+企业id+代理ip+trap类型+特定码+时间戳+名称+值。。

snmp v1和v2的数据包基本分析完成,snmp v3安全方面有点复杂,还没怎么研究,以后研究了在另开一篇,进行记录

原文地址:https://www.cnblogs.com/luckygxf/p/4008666.html