今天看了一下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 //第一个值名称用的是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 //第二个值名称
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安全方面有点复杂,还没怎么研究,以后研究了在另开一篇,进行记录

snmp数据包分析的更多相关文章

  1. 《Wireshark数据包分析实战》 - http背后,tcp/ip抓包分析

    作为网络开发人员,使用fiddler无疑是最好的选择,方便易用功能强. 但是什么作为爱学习的同学,是不应该止步于http协议的,学习wireshark则可以满足这方面的需求.wireshark作为抓取 ...

  2. WireShark数据包分析数据封装

    WireShark数据包分析数据封装 数据封装(Data Encapsulation)是指将协议数据单元(PDU)封装在一组协议头和尾中的过程.在OSI七层参考模型中,每层主要负责与其它机器上的对等层 ...

  3. 可视化数据包分析工具-CapAnalysis

    可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流量数据的工具,本文介绍又一款实用工具-CapAnalysis(可视化数据包分析工具),将比Xpli ...

  4. tcprstat源码分析之tcp数据包分析

    tcprstat是percona用来监测mysql响应时间的.不过对于任何运行在TCP协议上的响应时间,都可以用.本文主要做源码分析,如何使用tcprstat请大家查看博文<tcprstat分析 ...

  5. firebug登陆之数据包分析

    登陆之数据包分析 工具: python-urllib2   |  firefox+firebug或者chrome,用浏览器打开登陆页面之后,按F12键会默认打开开发者工具或者启动firebug,点击n ...

  6. Wireshark数据包分析(一)——使用入门

    Wireshark简介: Wireshark是一款最流行和强大的开源数据包抓包与分析工具,没有之一.在SecTools安全社区里颇受欢迎,曾一度超越Metasploit.Nessus.Aircrack ...

  7. Wireshark工具抓包的数据包分析

    Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料. Wireshark使用WinPCAP作为接口,直接与网卡 ...

  8. 网络数据包分析 网卡Offload

    http://blog.nsfocus.net/network-packets-analysis-nic-offload/     对于网络安全来说,网络传输数据包的捕获和分析是个基础工作,绿盟科技研 ...

  9. wireshark数据包分析实战 第一章

    1,数据包分析工具:tcpdump.wireshark.前者是命令行的,后者是图形界面的. 分析过程:收集数据.转换数据(二进制数据转换为可读形式).分析数据.tcpdump不提供分析数据,只将最原始 ...

随机推荐

  1. JavaScript的检测属性、属性特性、枚举属性

    /* 检测属性 检测属性可以通过三种方式 1.通过in运算符 2.通过hasOwnPerperty() 如果给定的属性是继承属性将返回false 3.通过propertyIsEnumerable(): ...

  2. css3 2d

    CSS3 2D 转换   通过 CSS3 转换,我们能够对元素进行移动.缩放.转动.拉长或拉伸. 以下是 2D 转换 1 translate()通过 translate() 方法,元素从其当前位置移动 ...

  3. 用户 'sa' 登录失败。 (Microsoft SQL Server,错误: 18456)

    今天登陆数据库的时候,却忽然登陆了不了,并且提示了这样的错: 解决方法: 1.用Windows身份登录数据库 2.安全性==>登录名==>双击sa 3.重设密码 4.状态==>登录: ...

  4. 5.21_启程日本二面_1 vs 1

    昨天上午刚群面完,晚上7点左右就接到了电话.面试官就两位菇凉,看来她们也是很辛苦.今天下午3点 1 vs 1,在一家咖啡店里,主要是询问下去日本的意愿是否足够强烈.太老实,这里实话实说,也没有表现出非 ...

  5. spark streaming kafka1.4.1中的低阶api createDirectStream使用总结

    转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不 ...

  6. JQ定义

    什么是jQuery对象 通过$(‘选择器’)获取到都是jQuery对象 什么是DOM对象 通过getElementById或者 getElementsByTagName或者getElementsByN ...

  7. 【php学习之路】字符串操作

           无论学习那种语言,字符串操作都是必备的基础.学php的时候总是会不知不觉的与C#比较,用起来总觉得怪怪的没有那么顺手,有些命名也差别很大,再加上很多函数命名是简写形式不百度下还真不知道什 ...

  8. java中4中类修饰符访问范围

    public:本类中可见,同包中可见,子类中可见,其他包中可见. protected:本类中可见,同包中可见,子类中可见,其他包不可见. 默认:本类中可见,同包中可见,子类不可见,其他包不可见. pr ...

  9. PHP取当前页面完整URL地址

    #测试网址: http://localhost/blog/testurl.php?id=5 //获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br> ...

  10. 刀哥多线程笔记之gcd-02-block

    block 概念 block 是 C 语言的 是一种数据类型,可以当作参数传递 是一组预先准备好的代码,在需要的时候执行 动画 block 回顾 self.demoView.center = CGPo ...