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