SNMP報文抓取與分析(一)
1、抓取SNMP報文
SNMP報文的形式大致如下圖所示
我們這里使用netcat
這個工具來抓取snmp
的PDU
(協議數據單元)。(因為我們並不需要前面的IP
和UDP
首部)
關於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
命令獲取的結果