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命令獲取的結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM