什么是Snmp Fuzzer
snmp fuzzer是一款用于對(duì)目標(biāo)設(shè)備snmp可寫(xiě)oid節(jié)點(diǎn)數(shù)據(jù)進(jìn)行fuzz測(cè)試的小工具。
02
為什么要用Snmp Fuzzer
現(xiàn)如今工控環(huán)境中,存在大量的工控設(shè)備默認(rèn)開(kāi)啟了snmp服務(wù)并支持snmp寫(xiě)操作,且設(shè)備使用了默認(rèn)的snmp community值,由于工控環(huán)境的特殊性,設(shè)備參數(shù)設(shè)定后會(huì)長(zhǎng)時(shí)間不會(huì)修改,導(dǎo)致開(kāi)啟snmp服務(wù)的工控設(shè)備存在數(shù)據(jù)被篡改、覆蓋、以及被大量可寫(xiě)數(shù)據(jù)攻擊致癱瘓的風(fēng)險(xiǎn)。而snmp fuzzer靈活且自動(dòng)化能夠?qū)﹂_(kāi)放了snmp寫(xiě)權(quán)限的工控設(shè)備進(jìn)行檢測(cè),從而評(píng)估設(shè)備的安全性。
03
工控設(shè)備開(kāi)啟snmp的危害
在以往的測(cè)試過(guò)程中,通過(guò)snmp fuzzer發(fā)現(xiàn)過(guò)一些工控設(shè)備的漏洞,這些漏洞主要集中在對(duì)snmp寫(xiě)操作的數(shù)據(jù)沒(méi)有進(jìn)行有效的校驗(yàn)。例如某設(shè)備支持通過(guò)snmp寫(xiě)操作來(lái)修改設(shè)備網(wǎng)卡的mac地址,但是沒(méi)有對(duì)mac地址的長(zhǎng)度進(jìn)行校驗(yàn),只要傳入過(guò)長(zhǎng)或者過(guò)短的mac地址都會(huì)造成設(shè)備癱瘓。還有些設(shè)備的網(wǎng)卡可以通過(guò)snmp寫(xiě)操作來(lái)開(kāi)啟和禁用,這樣直接就會(huì)造成設(shè)備的網(wǎng)絡(luò)中斷影響業(yè)務(wù)。此外通常廠(chǎng)商還會(huì)有其自定義的私有oid節(jié)點(diǎn),這些節(jié)點(diǎn)也很可能會(huì)存在一些安全問(wèn)題,導(dǎo)致設(shè)備出現(xiàn)各種預(yù)期外的異常。
04
Snmp Fuzzer檢測(cè)流程
snmp fuzz測(cè)試機(jī)通過(guò)發(fā)送可寫(xiě)oid的snmp set-request請(qǐng)求去改變工控設(shè)備可寫(xiě)oid控制的數(shù)據(jù),通過(guò)發(fā)送get request、get-next-request請(qǐng)求, 來(lái)接收工控設(shè)備返回的get-response報(bào)文,如果測(cè)試機(jī)沒(méi)有收到get-response的回復(fù)報(bào)文,則利用socket通信,來(lái)監(jiān)測(cè)工控設(shè)備是否崩潰。
05
Snmp Fuzzer安裝
在Ubuntu環(huán)境下安裝與使用snmp fuzzer。
1. 通過(guò)git命令,下載snmp fuzzer 代碼。
https://github.com/dark-lbp/snmp_fuzzer
2. snmp fuzzer運(yùn)行依賴(lài)scrapy,如果沒(méi)有安裝scrapy,需要安裝。
運(yùn)行pip install scrapy命令,安裝scrapy。
06
1. 編寫(xiě)掃描目標(biāo)設(shè)備可寫(xiě)oid的測(cè)試py腳本。
a. 創(chuàng)建一個(gè)test_scan_oid.py的文件。
b. 打開(kāi)test_scan_oid.py文件,輸入以下內(nèi)容。
如下圖所示:
target:設(shè)置目標(biāo)機(jī)的IP地址。
port:檢查目標(biāo)機(jī)是否崩潰的通信端口。
count:fuzz snmp oid可寫(xiě)報(bào)文的次數(shù)。
nic:目標(biāo)機(jī)的默認(rèn)路由。
Target:創(chuàng)建一個(gè)snmpTarget類(lèi)。
SnmpTrarget參數(shù)說(shuō)明:
name:測(cè)試fuzz的名字,測(cè)試人員可以自定義。
monitor_port:目標(biāo)機(jī)是否存活監(jiān)控端口。
community:具備oid可寫(xiě)權(quán)限v2c用戶(hù),通常設(shè)備設(shè)置的v2c用戶(hù)為:public或者private。
oid:開(kāi)始掃描oid結(jié)點(diǎn)。
version:snmp用戶(hù)版本,目前snmp fuzzer只支持snmp v1、v2c。
Target.oid_scan():開(kāi)啟掃描目標(biāo)機(jī)可寫(xiě)oid的功能。
Target.save_scan_result():保存可寫(xiě)oid到pcap文件。
c.運(yùn)行test_scan_oid.py文件,開(kāi)始掃描目標(biāo)機(jī)可寫(xiě)的oid。執(zhí)行python test_scan_oid.py命令執(zhí)行完后在snmp_fuzzer/output目錄下會(huì)有一個(gè)Ip+_snmp_set_packet_list.pcap的文件,如:
該文件存儲(chǔ)的是目標(biāo)設(shè)備可寫(xiě)的oid報(bào)文,用于fuzz測(cè)試。
2. 編寫(xiě)fuzz測(cè)試腳本,進(jìn)行fuzz測(cè)試。
a. 創(chuàng)建一個(gè)test_snmp_fuzz.py文件。
b. 打開(kāi)test_snmp_fuzz.py文件,輸入以下內(nèi)容,如下圖所示:
Target.read_test_case_from_pcap用于從可寫(xiě)的oid報(bào)文中讀取oid。
Traget.fuzz()用于開(kāi)始fuzz測(cè)試,通過(guò)不斷發(fā)送snmp set-request請(qǐng)求去設(shè)置snmp fuzz自己造的可寫(xiě)數(shù)據(jù)。如下圖所示:
3. 運(yùn)行test_snmp_fuzz.py文件,開(kāi)始fuzz測(cè)試。
python test_snmp_fuzz.py
當(dāng)目標(biāo)設(shè)備對(duì)某個(gè)寫(xiě)請(qǐng)求不進(jìn)行反饋或反饋異常時(shí),會(huì)通過(guò)socket connect 對(duì)目標(biāo)設(shè)備的存活進(jìn)行檢測(cè),具體檢測(cè)原理如下圖所示:
當(dāng)出現(xiàn)如下log信息時(shí)代表目標(biāo)機(jī)已經(jīng)崩潰。
07
如何避免開(kāi)啟snmp的危害
開(kāi)啟snmp服務(wù)的設(shè)備采用snmp v3用戶(hù),因?yàn)閟nmp v3支持用戶(hù)認(rèn)證與加密,安全性更好、更可靠。