实验环境设置
(1)在本地主机上开启SNMP服务,注意读写权限
(2)安装MIB Browser,可根据OID获取设备的各种信息
(3)两台主机连接到同一台路由器(一个网段内),主机A获取主机B的IP地址并加入SNMP服务,以便能够通过MIB获得主机B的信息。
实验步骤
(1)打开Wireshark,选择两台主机同时连接的WLAN,准备抓包,可以通过过滤器设置只得到SNMP的报文
(2)在MIB Browser 的Agent(addr)中输入主机B的IP地址,点击GetNext或者Get获取信息,同时可以看到Wireshark中成功抓取到SNMP的各种类型报文。
(3)选择报文打开,进行报文分析
实验结果分析和结论
前置知识——snmp报文数据类型
简单类型:
- INTEGER,整数类型:ASN.1中未限制整数的位数,即可以是任意大小的整数。如 Number::=INTEGER
- BOOLEAN,布尔类型:取值为TRUE或FALSE。如 Married::=BOOLEAN
- REAL,实数类型:ASN.1中对实数精度无限制,REAL可以表示所有的实数。实数可以表示为科学计数法:M×BE,其中尾数M和指数E可以取任何正或负整数值,基数B可以取2或10。如 angle1 AngleInRadians::={31415926, 10, -7}
- ENUMERATED,枚举类型:是一组个数有限的整数值,可以给每个整型值赋予不同的意义。如 Month::= ENUMERATED {Jan (1), … , Dec (12) }
- OBJECT DESCRIPTION,对象描述符:用于确定对象的一串字符串。
- NULL,空值类型:用于位置的填充。若某个时刻无法得知数据准确值,就将其定义为NULL类型。
- EXTERNAL,自定义类型。
结构类型:
- SEQUENCE,序列类型,包含0个或多个组成元素的有序列表。列表的不同元素可分属于不同的数据类型。元素含元素名、元素类型,其中元素类型可是简单类型,也可是定义的其他构造类型。如 BookPageNo::=Sequence {ChapterNo, Separator,PageNo}
- SEQUENCE OF,单纯序列(数组)类型,即序列中的各项都属于同一类型,可看作SEQUENCE类型的特例。如 BookPages::= Sequence of BookPageNo
- SET,集合类型,包含0个或多个组成元素的无序集合。元素顺序无任何意义,但它们之间必须是不相同的,组成元素的类型可以为不同的ASN.1类型。如 BookPages::=Set {ChapterNo, Separator, PageNo}
- SET OF,单纯集合类型,是包含0个或多个组成元素的无序集合,同单纯序列类型类似,元素须为相同的类型。如 BookPages::=Set of {Sequence {ChapterNo, Separator, PageNo}}
首先要清楚SNMP协议本身的报文格式(本文只以普通消息为例)
*参数说明:
- 版本:SNMP V1为0,V2:1, V3:2;
- 团体名:团体名(community):是一个字符串,作为管理进程和代理进程之间的验证的密码,读缺省为“public”,写缺省为“private”;
- PDU类型:
- 请求标识符(request ID): 由管理进程设置的一个整数值。代理进程发送get-response时也要返回此请求标识符。
- 差错状态(error status):由代理进程回答时填入0~5中的一个数字。
- 差错索引(error index):当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移;
- 变量绑定(variable-bindings):读取或设置的一个或多个oid的名和对应的值,在get或get-next报文中,变量的名称有效,但值应忽略
拆分报文时,只需要抓住编码结构“TLV”
根据Wireshark可以看到,主机通过MIB Browser获取主机B的各项信息时,抓取主机A发送给主机B的get-request、get-next-request类型的SNMP报文以及主机B回复给主机A的get-respose类型SNMP报文,现在截取几段报文分析如下:
- 报文1
TLV | 数据 | 含义 | |
1 | Tag | 30 | SEQUENCE数据类型 |
Length | 26 | 数据包长度为22个字节 | |
2 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 版本为v1 | |
3 | Tag | 04 | OCTET SIRING数据类型 |
Length | 06 | 数据长度6字节 | |
Value | 70 75 62 6c 69 63 | Public | |
4 | Tag | a0 | PUD类型:get-request |
Length | 19 | PUD数据包长度25字节 | |
5 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 01 | reuest ID:00000001 | |
6(Error status) | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 00:noError一切正常 | |
7 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | Error Index | |
8 | Tag | 30 | SEQUENCE数据类型 |
Length | 0e | 数据包长度14字节 | |
9 | Tag | 30 | SEQUENCE数据类型 |
Length | 0c | 数据长度12字节 | |
10 | Tag | 06 | OBJECT DESCRIPTION(对象描述符) |
Length | 08 | 数据长度8字节 | |
Value | 2b 06 01 02 01 01 05 00 | 1.3.6.1.2.1.1.5.0 | |
11 | Tag | 05 | NULL |
Length | 00 |
|
- 报文2
序号 | TLV | 数据 | 含义 |
1 | Tag | 30 | SEQUENCE数据类型 |
Length | 35 | 数据包长度为53个字节 | |
2 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 版本为v1 | |
3 | Tag | 04 | OCTET SIRING数据类型 |
Length | 06 | 数据长度6字节 | |
Value | 70 75 62 6c 69 63 | Public | |
4 | Tag | a2 | PUD类型:get-response |
Length | 28 | PUD数据包长度40字节 | |
5 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 01 | reuest ID:00000001 | |
6(Error status) | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 00:noError一切正常 | |
7 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | Error Index | |
8 | Tag | 30 | SEQUENCE数据类型 |
Length | 1d | 数据包长度29字节 | |
9 | Tag | 30 | SEQUENCE数据类型 |
Length | 1b | 数据长度27字节 | |
10 | Tag | 06 | OBJECT DESCRIPTION(对象描述符) |
Length | 08 | 数据长度8字节 | |
Value | 2b 06 01 02 01 01 05 00 | 1.3.6.1.2.1.1.5.0 | |
11 | Tag | 04 | OCTET SIRING数据类型 |
Length | 0f | 数据长度15字节 | |
Value | 44 45 53 4b 54 4f 50 2d 45 4f 39 37 4f 39 37 | “DESKTOP-EO97O97” (ASCII编码) |
- 报文三
序号 | TLV | 数据 | 含义 |
1 | Tag | 30 | SEQUENCE数据类型 |
Length | 26 | 数据包长度为22个字节 | |
2 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 版本为v1 | |
3 | Tag | 04 | OCTET SIRING数据类型 |
Length | 06 | 数据长度6字节 | |
Value | 70 75 62 6c 69 63 | Public | |
4 | Tag | a1 | PUD类型:get-next-request |
Length | 19 | PUD数据包长度25字节 | |
5 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 01 | reuest ID:00000001 | |
6(Error status) | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | 00:noError一切正常 | |
7 | Tag | 02 | INTTEGER整数型 |
Length | 01 | 数据长度1字节 | |
Value | 00 | Error Index | |
8 | Tag | 30 | SEQUENCE数据类型 |
Length | 0e | 数据包长度14字节 | |
9 | Tag | 30 | SEQUENCE数据类型 |
Length | 0c | 数据长度12字节 | |
10 | Tag | 06 | OBJECT DESCRIPTION(对象描述符) |
Length | 08 | 数据长度8字节 | |
Value | 2b 06 01 02 01 01 03 00 | 1.3.6.1.2.1.1.3.0 | |
11 | Tag | 05 | NULL |
Length | 00 |
- trap类型报文获取见博客:网络管理——SNMP通信-CSDN博客