幾個月前,我曾發過一篇博客” SNMP 最佳實踐“講述了一些基本的方法降低來自 SNMP 相關的安全隱患。我想現在大家應該都修復完了,那么是時候來從滲透測試的角度講述如何通過收集分析數據來發現并利用暴露的 SNMP 服務。
第一個問題是我們如何發現暴露的 SNMP 服務。通常我們會使用端口掃描工具 Nmap 來掃描開放的 UDP 端口 161。鑒于我們只是想有針對性的發現并提取數據,那么使用 Python 或 Perl 小腳本反而會更加方便簡單。就我個人來說,我更傾向于使用 Perl,因為我已經寫好了一個這樣的腳本,你可以從我的 Github頁面上下載使用。如果你選擇使用我的腳本,使用方法非常簡單,如下圖所示:
我在使用這個腳本的時候,我會將目標設置為要測試的一個子網范圍。例如,如果我想要測試內網的地址范圍 10.10.0.0/16,我會使用如下命令, ./snmpbw.pl 10.10.0.0/16 public 2 32。這個命令會啟動 32 個進程來嘗試發現 10.10.0.0/16 子網內所有暴露在 UDP 端口 161 上面的 SNMP 服務。當發現啟用 SNMP 服務并且團體名(community string) 標示為 “public” 的設備時,會從 “.1″ 開始枚舉所有的 MIB(管理信息庫) 表,并將返回的數據保存到一個文件中以供后續的分析。
這個方法可以獲取到很多幫助了解攻擊目標網絡環境的有用數據。 我經常會在確定目標 IP 地址范圍后就獻出這個腳本來收集 SNMP 數據,然后就讓其慢慢在后臺運行著,而我則繼續進行其他一些網絡偵查的工作。當腳本運行結束后,我們就要來分析得到的數據了。
分析的第一步就是從每一個文件的 MIB 表數據中提取出 sysDesc .1.3.6.1.2.1.1.1.0,以確定我們是從哪些設備中收集到的數據。這一步很簡單只需要使用如下的 grep 命令即可:
grep ".1.3.6.1.2.1.1.1.0" *.snmp
使用這個 grep 命令的示例如下圖所示:
現在,你獲取到了所有暴露出來 SNMP 服務的數據了,那么從這些數據中你能發現什么呢?實際上,從這些 SNMP 服務數據中暴露出的信息相當驚人,而我則經常會尋找以下有用的信息:
Email 地址
SNMP 團體名
密碼的哈希值
明文傳輸的密碼
當然,想挖掘出有用的信息非常消耗時間,因為導出的 MIB 數據往往會非常大能上好幾兆。所以我花了些時間研究如何減少花費在檢查和識別上的時間,并準備在這里分享一些給大家。
我在處理 SNMP MIB 數據時最喜歡干的一件事就是查找其他可用的 SNMP 團體名,因為這些數據通常可以用來進一步去訪問其他系統。舉個例子,如果我從一家公司的 Cisco 路由器上找到其私有的團體名標識,那么我后面就可以利用這個標識來從公司其他的路由器上提取運行配置。找到這些數據最好的方法就是查找關聯的 SNMP Trap 數據包。使用類似上面的 grep 命令就可以從大量的 MIB 數據中快速的找到與關鍵字 “trap” 相關的數據了。
grep -i "trap" *.snmp
下圖的示例顯示了我成功的從大量的 SNMP 數據中枚舉出來與 “trap” 相關的數據。在這個示例中,我成功的找到幾個 SNMP 的團體名,隨后我使用這些團體名成功的獲取到了整個網絡中的所有 Cisco 路由器的運行配置文件。
另一個有趣的東西是日志,我發現有些設備會將日志信息也存到 MIB 表中。這些日志里面當然也會包含失敗的登錄嘗試,想想你可能會在通過 Telnet 或 SSH 登錄時無意中輸入了密碼當做用戶名,悲劇…必須承認我經常犯這毛病,所以我也要檢查 MIB 表中的日志是否也記錄到這類信息。通過提取 SNMP 數據,你可能會發現一些將密碼作為用戶名輸入的日志信息,為了檢索這些信息,我通常會選擇搜索關鍵字 “fail”、”failed” 或者 “login” 看看是否會得到一些有用的數據。
grep -i "fail" *.snmp
下圖的示例顯示了從 SNMP MIB 表中找到的將密碼做為用戶名登錄的錯誤信息日志。最棒的事情就是日志的下一條可能就是密碼對應的真實用戶名。
這里特別需要注意,這些日志通常非常短,在屏幕上會快速的一閃而過,所以請確保在對設備進行暴力破解前保存一個備份。如果不這樣,你可能會得到像下圖一樣的結果。
最后總結下,我希望以上幾個小例子可以告訴你如何提取和利用 SNMP 數據。同時我還要特別指出,一定要花些時間在檢查暴露出的 SNMP 數據上, 這樣我們就可以為顧客更好的鑒定 SNMP 存在的安全風險并提供相應的解決方案。