1. 程式人生 > 實用技巧 >淺議SNMP安全、SNMP協議、網路管理學習

淺議SNMP安全、SNMP協議、網路管理學習

隨著網路技術的飛速發展,網路的數量也越來越多。而網路中的裝置來自各個不同的廠家,如何管理這些裝置就變得十分重要。我們今天要研究的就是介紹管理這些裝置的標準,簡單來說就是如何在內網中管理各種異構裝置。

相關學習資料

tcp-ip詳解卷1:協議.pdf(重點看25章SNMP部分)
http://www.rfc-editor.org/rfc/rfc1213.txt
http://www.rfc-editor.org/rfc/rfc1155.txt
http://www.rfc-editor.org/rfc/rfc1157.txt
http://network.51cto.com/art/201007/209214.htm
http://zh.wikipedia.org/wiki/SNMP
http://network.51cto.com/art/201006/208297.htm
http://tools.ietf.org/html/rfc2578
http://wenku.baidu.com/view/3b19313d87c24028915fc3a1.html

目錄

1. 網路管理簡介
2. SNMP協議
3. SNMP通訊流程抓包實驗
4. SNMP存在的安全風險

1. 網路管理簡介

隨著網路技術的飛速發展,網路的數量也越來越多。而網路中的裝置來自各個不同的廠家,如何管理這些裝置就變得十分重要。我們今天要研究的就是介紹管理這些裝置的標準,簡單來說就是如何在內網中管理各種異構裝置。
0x1: TCP/IP的網路管理元件

1. 網路管理系統(NMSs,Network-management systems)
網路管理系統一般安裝在網路管理站上,一個網路管理系統執行應用程式,以該應用程式監視並控制被管理的裝置。也稱為管理實體(managing entity),網路管理員在這兒與網路裝置進行交
互。網路管理系統提供網路管理需要的大量運算和記憶資源。一個被管理的網路可能存在一個以上的網路管理系統
2. 被管理的裝置(managed device) 一個被管理的裝置是一個網路節點,它包含一個存在於被管理的網路中的SNMP代理者。被管理的裝置通過管理資訊庫(MIB)收集並存儲管理資訊,並且讓網路管理系統能夠通過SNMP代理者取得
這項資訊。被管裝置種類繁多,例如:
2.1) 路由器 2.2) X終端 2.3) 終端伺服器 2.4) 印表機等 3. 代理者(agent) 代理者是一種存在於被管理的裝置中的網路管理軟體模組。代理者控制本地機器的管理資訊,以和SNMP相容的格式傳送這項資訊。可以是一個獨立的程式(在Unix中叫守護程序),也可以是已經
整合到作業系統中(比如:銳捷路由器的RGNOS,或者UPS中的底層作業系統)

管理程序和代理程序之間的通訊可以有兩種方式:

1) 管理程序向代理程序發出請求:
    1.1) 詢問一個具體的引數值(例如:你產生了多少個不可達的ICMP埠)
    1.2) 要求改變代理程序的引數值(例如:把預設的IP TTL值改為64)
2) 代理程序主動向管理程序報告有某些重要的事件發生(例如:一個連線口掉線了) 

0x2: 網路管理體系架構

1. 管理資訊庫MIB(Management Information Base)
管理資訊庫(MIB)包含所有代理程序的所有可被查詢和修改的引數。RFC 1213 [McCloghrie and Rose 1991]定義了第二版的MIB,叫做MIB-II
MIB是一個數據庫的概念
2. 管理資訊結構SMI(Structure of Management Information) 關於MIB的一套公用的結構和表示符號,這個在RFC 1155 [Rose and McCloghrie 1990]中定義
SMI是一個數據結構的概念

3. 簡單網路管理協議SNMP(Simple Network Management Protocol) 管理程序和代理程序之間的通訊協議,在RFC 1157 [Case et al. 1990]中定義
SNMP是一個協議、以及通訊流程的概念

值得注意的是:

對協議和管理資訊結構的良好分離使得使用SNMP來監測和管理同一網路內上百的不同子系統非常簡單。MIB模型執行管理OSI參考模型的所有層,並可以擴充套件至諸如資料庫,電子郵件以及J2EE參
考模型之類的應用。

MIB(Management Information Base)

對於MIB,我們可以理解為一箇中央資料庫,用來儲存網路中各種裝置的引數資訊

1. 管理資訊庫MIB指明瞭網路元素(網路中的裝置)所維持的變數(能夠被管理程序查詢和設定的資訊)
2. MIB給出了一個網路中所有可能的被管理物件的集合的資料結構
3. MIB管理資訊庫採用和域名系統DNS相似的樹型結構,它的根在最上面,根沒有名字,它又稱為物件命名(object naming tree)

類似於資料庫中常說的唯一標識每條記錄的"主鍵",在MIB中,由物件識別符(OID:Object Identifier)唯一指定每條MIB記錄。

MIB是一個樹形結構(點分樹形結構),SNMP協議訊息通過遍歷SNMP MIB樹形目錄中的節點來訪問網路中的裝置

在這課"物件命名樹"中,我們care的只是"mgmt(管理子樹)",即

Root->iso->org->dod->internet->mgmt->mid..
{1.3.6.1.2.1}

最初的結點mib將其所管理的資訊分為8個類別

類別

標號

所包含的資訊

system

interfaces

address translation

ip

icmp

tcp

udp

egp

(1)

(2)

(3)

(4)

(5)

(6)

(7)

(8)

主機或路由器的作業系統

各種網路介面及它們的測定通訊量

地址轉換(例如ARP對映)

Internet軟體(IP分組統計)

ICMP軟體(已收到ICMP訊息的統計)

TCP軟體(演算法、引數和統計)

UDP軟體(UDP通訊量統計)

EGP軟體(外部閘道器協議通訊量統計)

例如,我們可以使用1.3.6.1.2.1.1來標識"主機或路由器的作業系統",從而對指定項進行資訊獲取以及引數設定

SMI(Structure Of Management Information)

對於SMI,我們可以把它理解為一個數據結構,一個規範規則。在繼續深入學習SMI之前,我們需要先來了解一下ASN.1

ASN.1:
高階資料描述語言,描述:
1) 資料型別
2) 結構
3) 組織
4) 編碼方法
包含語法符號和編碼規則兩大部分
//SMI是ASN.1的子集
SMI是SNMP的描述方法。但是因為ASN.1功能很強大,但SNMP只用到其中一小部分,為了方便使用,對這部分內容做了描述,限定了範圍,這就是SMI。SMI由ASN.1的一個"子集合"和一部分自
定義的型別、巨集等組成。SMI是ASN.1的一個子集

管理資訊結構SMI(structure of management information)指定了在SNMP的MIB中用於"定義管理目標的規則"。SMI是一種語言,是為了確保網路管理資料的"語法"和"語義"明確和無二義性而定義的語言。它是定義被管理網路實體中特定資料的語言

SMI定義了:

1) 資料型別
2) 物件模型
3) 寫入管理資訊的規則
4) 修改管理資訊的規則

我們接下來討論一下SMI中定義的資料型別:

1. Integer整型
Signed 32bit Integer (values between -2147483648 and 2147483647)
有符號32位整數(值範圍: -2147483648 ~ +2147483648)

2. Integer32
Same as Integer. 與Integer相同

3. UInteger32
Unsigned 32bit Integer (values between 0 and 4294967295)
無符號32位整數(值範圍:0~4294967295)

4. Octet String
Arbitrary binary or textual data, typically limited to 255 characters in length
任意二進位制或文字資料,通常長度限制在255個字元內。 

5. Object Identifier
An OID
一個OID

6. Bit String
Represents an enumeration of named bits. This is an unsigned datatype
表示取名的位的列舉。這是一個無符號的資料型別

7. IpAddress
An IP address. 一個IP地址,值範圍0到65535

8. Counter32
Represents a non-negative integer which monotonically increases until it reaches a maximum value of 32bits-1 (4294967295 dec), when it wraps 
around and starts increasing again from zero 表示一個非負的整數(可遞增到32位最大值-1),然後恢復並從0開始遞增 9. Counter64 Same as Counter32 but has a maximum value of 64bits-1 與Counter32相同,最大值為64位的最大值-1 10. Gauge32 Represents an unsigned integer, which may increase or decrease, but shall never exceed a maximum value 表示無符號整數,可增加或減少,但是不超過最大值 11. TimeTicks Represents an unsigned integer which represents the time,modulo 2ˆ32 (4294967296 dec), in hundredths of a second between two epochs 表示代表資料的一個無符號整數,2^32取模(4294967296),兩個值之間為百分之一秒。 12. Opaque Provided solely for backward-compatibility, its no longer used 提供向下相容,不再使用的資料型別 13. NsapAddress Represents an OSI address as a variable-length OCTET STRING 表示一個用變長八進位制字元窗表示的OSI地址

SNMP(Simple Network Management Protocol)

SNMP採用了Client/Server模型的特殊形式:代理/管理站模型。對網路的管理與維護是通過管理工作站與SNMP代理間的互動工作完成的。每個SNMP從代理負責回答SNMP管理工作站(主代理)關於SNMP MIB定義資訊的各種查詢

從圖中我們可以看到,不論是攻擊者還是安全測試人員要對網路中的裝置進行"SNMP查詢",都必須提供一個"community(團隊名)",這就是相當於密碼的作用。所謂的SNMP爆破指的就是窮舉這個"community"。

對於更安全地配置來說,還會在從代理上設定白名單,只允許指定IP、MAC的裝置進行SNMP訪問

SNMP網路管理體系總體架構圖

2. SNMP協議

簡單網路管理協議(SNMP:Simple Network Management Protocol)是由網際網路工程任務組(IETF:Internet Engineering Task Force )定義的一套網路管理協議。該協議基於簡單閘道器監視協議(SGMP:Simple Gateway Monitor Protocol)。利用SNMP,一個管理工作站可以遠端管理所有支援這種協議的網路裝置,包括監視網路狀態、修改網路裝置配置、接收網路事件警告等。雖然SNMP開始是面向基於IP的網路管理,但作為一個工業標準也被成功用於電話網路管理

1. SNMP從代理(網路中的裝置)和管理站(主代理)通過SNMP協議中的標準訊息進行通訊,每個訊息都是一個單獨的資料報。
2. SNMP使用UDP(使用者資料報協議)作為第四層協議(傳輸協議),進行無連線操作。
3. SNMP採用UDP161埠接收和傳送請求,162埠接收trap

和其他大部分的協議一樣,SNMP包含了多種資料報型別

1. GET REQUEST
從代理程序處提取一個或多個引數值

2. GET NEXT REQUEST
從代理程序處提取一個或多個引數的下一個引數值

3. GET RESPONSE
設定代理程序的一個或多個引數值

4. SET REQUEST
返回的一個或多個引數值。這個操作是由代理程序發出的。它是前面"GET RESPONSE"中操作的響應操作

5. TRAP
代理程序主動發出的報文,通知管理程序有故障或錯誤發生

6. GETBULK REQUEST
7. INFORM

SNMP的資料報格式

和其他的協議類似,SNMP中有不同種類的資料報,所以它們的協議格式在大框架相同的情況下,內部也略有不同,我們來分別學習

0x1: GET REQUEST、GET NEXT REQUEST、GET RESPONSE、SET REQUEST

1. 版本識別符(version identifier)
確保SNMP代理使用相同的協議,每個SNMP代理都直接拋棄與自己協議版本不同的資料報。
該欄位的值是通過SNMP版本號減去1得到的:
    1) 0代表SNMP v1
    2) 1代表SNMP v2
    3) 2代表SNMP v3
2. 團體名(Community Name)
用於SNMP從代理對SNMP管理站進行認證 
    1) 如果失敗,SNMP從代理將向管理站傳送一個認證失敗的Trap訊息
    2) 如果成功,則繼續進行下一步set/get操作
"Community團體名"是管理程序(主代理)和代理程序(從代理)之間的口令,是明文格式,預設為public(這顯然是一個明文弱密碼,這也是很多SNMP存在風險的原因)

3. 協議資料單元(PDU)
其中PDU指明瞭SNMP的訊息型別及其相關引數
    1) PDU型別
        1.1) 0表示get-request
        1.2) 1表示get-next-request
        1.3) 2表示get-response
        1.4) 3表示set-request
        1.5) 4表示trap
    2) 請求標識
    請求標識由管理程序設定,然後由代理程序在get-response中返回。這個欄位的作用是使客戶程序(在目前情況下是管理程序)能夠將伺服器程序(即代理程序)發出的響應和客戶程序發出的
查詢進行匹配。 這個欄位允許管理程序對一個或多個代理程序發出多個請求,並且從返回的眾多應答中進行分類
3) 差錯狀態 差錯狀態欄位是一個整數,它是由代理程序標註的,指明有差錯發生 3.1) 0: noError: 沒有錯誤 3.2) 1: tooBig: 代理程序無法把響應放在一個SNMP訊息中傳送 3.3) 2: noSuchName: 操作一個不存在的變數 3.4) 3: badValue: set操作的值或語義有錯誤 3.5) 4: readOnly: 管理程序試圖修改一個只讀變數 3.6) 5: genErr: 其他錯誤 4) 差錯索引 差錯索引欄位是一個整數偏移量,指明當有差錯發生時,差錯發生在哪個引數。它是由代理程序標註的,並且只有在發生noSuchName、readOnly和badValue差錯時才進行標註。否則為0 5) 名稱、值 在SNMP資料報中,名稱和值構成一張"" 5.1) GET REQUEST、GET NEXT REQUEST、GET RESPONSE value為空,只有名稱 5.2) SET REQUEST 名稱+值對

0x2: Trap

1. 版本識別符(version identifier)
確保SNMP代理使用相同的協議,每個SNMP代理都直接拋棄與自己協議版本不同的資料報。
該欄位的值是通過SNMP版本號減去1得到的:
    1) 0代表SNMP v1
    2) 1代表SNMP v2
    3) 2代表SNMP v3
2. 團體名(Community Name)
用於SNMP從代理對SNMP管理站進行認證 
    1) 如果失敗,SNMP從代理將向管理站傳送一個認證失敗的Trap訊息
    2) 如果成功,則繼續進行下一步set/get操作
"Community團體名"是管理程序(主代理)和代理程序(從代理)之間的口令,是明文格式,預設為public(這顯然是一個明文弱密碼,這也是很多SNMP存在風險的原因)

3. 協議資料單元(PDU)
其中PDU指明瞭SNMP的訊息型別及其相關引數
    1) PDU型別
    4表示trap
    2) 企業
    3) 代理的IP地址
    4) trap型別
        4.1) 0: coldStart: 代理程序對自己初始化
        4.2) 1: warmStart: 代理程序對自己重新初始化
        4.3) 2: linkDown: 一個介面已經從工作狀態改變為故障狀態,報文中的第一個變數標識此介面
        4.4) 3: linkUp: 一個介面已經從故障狀態改變為工作狀態,報文中的第一個變數標識此介面
        4.5) 4: authenticationFailure: 從SNMP管理程序收到無效"團隊名(密碼)"的報文
        4.6) 5: egpNeighborLoss: 一個EGP鄰站已變為故障狀態。報文中的第一個變數包含此鄰站的IP地址
        4.7) 6: enterpriseSpecific: 在這個特定的程式碼欄位中查詢trap資訊
    5) 特定程式碼
    6) 時間戳
    7) 名稱、值對

3. SNMP通訊流程抓包實驗

在ubuntu下安裝啟動SNMPD過程

1. 安裝snmp服務
apt-get install snmpd snmp

2. 修改團體名
vi /etc/snmp/snmpd.conf
增加一條
com2sec readwrite default public
則外部可以用public團體名訪問snmpMIB

3. 修改snmpd服務啟動引數
預設的snmpd是帶引數127.0.0.1啟動的,這樣啟動的時候就只能本機訪問snmp服務,如果要讓外部也能夠訪問snmp服務,則需要將該引數去掉。
vi /etc/default/snmpd,找到以下行: 
SNMPDOPTS=’-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1′
去掉其中的127.0.0.1,儲存

4. 重啟snmp服務
service snmpd restart

snmpwalk命令解釋

USAGE: snmpwalk [OPTIONS] AGENT [OID]
1. OPTIONS: 
    1) -v 1|2c|3        
    顯示指定SNMP的版本號
    2) -V
    顯示但前版本號 
    3) -c COMMUNITY        
    指定團體號,即SNMP密碼  
    4) -r RETRIES    
    設定失敗重試次數
    5) -t TIMEOUT    
    設定失敗等待延時閾值 
    6) -m MIB[:...]        
    載入指定列表的MIB資訊庫,預設為ALL
    7) -M DIR[:...]        
    載入制定路徑的MIB資訊庫

2. AGENT
目標裝置的代理地址(IP)
3. OID
可以是:
    1) 點分物件命名標識,例如: .1.3.6.1.2.1.25.2.2 
    2) 指定條目名稱,例如: system   

常用的snmp命令有如下:

1. 得到取得windows端的系統程序使用者數等
snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.25.1    

2. 取得系統總記憶體
snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.25.2.2  

3. hrSystemNumUsers
snmpwalk -c public -v 1 -m ALL 192.168.159.128 

4. 取得IP資訊
snmpwalk -c public -v 1 -m ALL 192.168.159.128 .1.3.6.1.2.1.4.20    

5. 檢視系統資訊
snmpwalk -v 2c -c public 192.168.159.128 system   

6. ifDescr
snmpwalk -v 1 192.168.159.128 -c public 

7. 得到取得windows端的系統程序使用者數等
snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.25.1    
 
8. 取得系統總記憶體
snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.25.2.2  

9. 取得系統使用者數
snmpwalk -v 2c -c public 192.168.159.128 hrSystemNumUsers  

10. 取得IP資訊
snmpwalk -v 2c -c public 192.168.159.128 .1.3.6.1.2.1.4.20    

11. 檢視系統資訊
snmpwalk -v 2c -c public 192.168.159.128 system   

12. 獲取網絡卡資訊
snmpwalk -v 2c -c public 192.168.159.128 ifDescr 
 
13. 獲取全部資訊
snmpwalk -v 2c -c public 192.168.159.128

0x3: SNMP通訊抓包截圖

get-request

get-next-request

get-response

4. SNMP存在的安全風險

0x1: 主要威脅

1. 資訊修改
一些非授權實體可能改變由另一個授權實體產生的訊息

2. 未授權訪問
一個實體偽裝成一個授權實體來進行它無權進行的操作 
    1) community團隊名暴力窮舉 
   可以使用例如hydra在內的工具進行SNMP密碼破解
2) 認證機制漏洞 2008-6-16 US-CERT和其他機構警告企業,SNMP協議現在的版本存在嚴重漏洞,這個漏洞可以允許黑客繞過協議認證機制,偽裝合法使用者。這個漏洞可以使黑客在受影響的系統上完成一切
合法使用者可以完成的行為。漏洞存在於SNMPv3的認證機制中,該機制使用鍵入的Hash Message Authentication Code(HMAC)。這是一種組合了密碼演算法雜湊式及密碼金鑰的運算,SNMPv3
的執行方法允許以縮短的HMAC編碼以最少的HMAC位元組(一個位元組)使用在認證人欄位中認證代理,而將HMAC減少至一個位元組是暴力破解法變得可行。黑客可以通過向受影響的計算機發送特製資訊
包利用這些缺陷,可以檢視並改變受到威脅的裝置配置
3. 洩密 竊聽代理和管理站之間的資料交換。即流量嗅探。 SNMP2.0和SNMP1.0的安全機制比較脆弱,通訊不加密,所有通訊字串和資料都以明文形式傳送。攻擊者一旦捕獲了網路通訊,就可以利用各種嗅探工具直接獲取通訊字串,即使使用者改變了
通訊字串的預設值也無濟於事。
4. 訊息流修改 訊息流修改是指訊息可能被惡意地重排、延遲或者重發 5. 拒絕服務 攻擊者阻止管理站和代理之間的資訊交換。 6. 流量分析 攻擊者觀測管理站和代理之間流量的一般模式。

0x2: SNMP安全測試相關工具

1. HNMS
http://www.nas.nasa.gov/Groups/LAN/Trouble/HNMS.html
2. RMON  
3. tkined
http://www.ibr.cs.tu-bs.de/projects/nm/scotty/tkined.html
4. NET-SNMP
http://www.net-snmp.net/
5. Mon 
系統監視工具
http://consult.ml.org/~trockij/mon/
6. IKT 
故障監測工具  
http://pikt.uchicago.edu/pikt/
7. Scotty 
網路管理工具 
http://www.cs.utwente.nl/~schoenw/scotty/
8. Big Brother  
系統監視工具 
http://www.iti.qc.ca/iti/users/sean/bb-dnld/
9. MRTG 
網路流量監視工具  
http://www.ee.ethz.ch/~oetiker/webtools/mrtg/mrtg.html
10. cmu-snmp 
SNMP工具 
http://www.gaertner.de/snmp/