前言:

Modbus 是由Modicon公司1979年發行的,已經被廣泛應用於工業控制現場的應用層協議,如Modbus協議已被廣泛應用於在監控和控制現場設備。Modbus協議最初是通過串行數據進行通信的,也就是Modbus Serial協議。隨着工業現代化的發展,產生了Modbus TCP協議,即通過與TCP協議相結合來發送和接收Modbus Serial數據。Modbus的出現是爲了使工業現場設備實時地接收和發送相關命令和數據,然後最重要的安全措施在Modbus的設計之初並沒有被考慮進去。

通過前一篇對 Moubus模擬器的使用和基礎知識的理解 ,本文主要深入研究Modbus專屬的滲透框架Smod,以及一些對Modbus PLC設備的掃描和漏洞利用腳本。

安全環境介紹:

自1979年以來,作爲業界系列上的標準,Modbus已經使數百萬自動化設備能夠進行通信。這些設備在全世界分佈着,下圖是SHODAN蒐集協議使用分佈區域的動態立體圖。大家可以看一下,鏈接: https://ics-radar.shodan.io/

然而廣泛的使用也必然引起黑客們的注意,隨之而來的是爆出各種各樣的安全問題,包括拒絕服務、遠程代碼執行和堆棧緩衝區溢出等漏洞,下方是部分關於Modbus協議和Schneider設備的漏洞:

Smod介紹:

Smod是一個模塊化的Modbus滲透測試框架,可以用來測試Modbus協議所需的各種診斷和攻擊功能。這是一個使用Python和Scapy的完整的Modbus協議實現。這個軟件可以在python 2.7.x下的Linux / OSX上運行。

近年來,SummerySCADA(過程控制網絡)系統已經從專有封閉網絡轉向開源解決方案和支持TCP / IP的網絡。這使他們容易受到我們傳統計算機網絡面臨的相同安全漏洞的影響。由於Modbus/TCP協議簡單且容易實現,而且廣泛應用於電力、水力等工業系統。所以Smod框架均使用Modbus/TCP協議。而且Smod框架可以用來評估一個Modbus協議系統的漏洞。下圖是啓動Smod:

下載鏈接: https://download.csdn.net/download/weixin_43977912/12366214

掃描PLC:

在對PLC設備進行一系列滲透測試操作之前,我們先對網段PLC設備進行一次掃描,瞭解有哪些設備。雖然Smod框架裏面也有掃描腳本,但並沒有Nmap裏面的Scripts腳本效率高,當然也可以用PLCScan(通過先檢測端口TCP/502,若開放會調用其他函數來進行更深層次的掃描檢測的工具)。這裏我選擇Nmap裏的三個模塊:

 modbus-discover.nse(nmap自帶)識別並發現Modbus PLCS設備及版本
 modicon-info.nse(需添加)識別並列舉Schneider Electric Modicon PLC
 modbus-enum.nse (需添加)識別並枚舉使用Modbus的設備

檢測腳本下載地址: https://download.csdn.net/download/weixin_43977912/12369553

使用modbus-discover.nse腳本,發現了一系列Schneider Electric的設備及版本號,還有開啓的502端口和sid(設備ID)。

使用modicon-info.nse腳本獲取更詳細的信息:

 BMX P34 2020:BMX P34 高性能CPU,內置USB口,Modbus,Ethernet TCP/IP
 Fireware:固件版本v3.2      
 Memory Card:BMXRMS008MP 內存卡8MB

Smod滲透:

接下來我們來使用Smod,看看它有哪些厲害的功能:

 1、 暴力破解PLC的UID
 2、 網絡嗅探進行ARP地址欺騙
 3、 枚舉Modbus PLC的功能
 4、 模糊讀寫單一或多個線圈功能
 5、 模糊讀寫單一或多個輸入寄存器功能
 6、 測試讀寫單一或多個保持寄存器功能
 7、 測試單個PLC 所有功能
 8、 對單個或多個線圈寫值進行Dos攻擊
 9、 對單個或多個寄存器寫值進行Dos攻擊
10、對ARP地址欺騙進行Dos攻擊

首先我們暴力破解PLC的UID,因爲接下來的操作,例如讀寫線圈和寄存器或者Dos攻擊,都需要帶上UID,所以我們先使用/modbus/scanner/uid這個模塊。如下圖所示,我們填寫好RHOSTS IP後直接exploit,獲取到的UID爲1。

接着我們對Modbus PLC的功能進行枚舉(/modbus/scanner/getfunc),攜帶上UID,查看我們可以針對其PLC做哪些滲透工作,如下圖所示,發現基本常用的功能碼(Function Code)都支持,那接下來就好辦了。

知道了該PLC支持的功能,我們先選擇讀取線圈看一下是否成功(/modbus/function/readCoils),發現讀取成功了Coils給了回應,如下圖所示:

接下來我們主要對保持寄存器進行讀取(/modbus/function/readHoldingRegister),需要設置的參數如下:

RHOSTS:xx.xx.xx.xx(IP)

Quantity:0×0010(爲讀取寄存器連續個數,默認爲10個,對應組態軟件的通道數量,這裏我們讀取16個,所以換成16進制是0010)

StartAddr:0×0064(爲寄存器起始地址,默認從0開始,這裏我們從100開始,所以換成16進制是0064)

UID:1

如下圖所示,讀取到了registerval(寄存器的值):

Dos這塊的攻擊我就不演示了,把我一羣PLC設備弄掛了我上哪哭去……篇幅原因,我再演示對單個寄存器的寫值功能,其他模塊的功能大同小異,大家有空可以一一嘗試哈,如果有不理解的地方,可以直接評論或者私信俺。如下圖所示,設置好了寄存器的數據存放地址和值,成功寫入。

總結:

使用了Smod滲透框架才知道,我們在一個PLC的網絡裏,居然可以做這麼多壞事!讀寫線圈和寄存器,還有Dos攻擊,這些對PLC都是致命的,所以一個Modbus協議系統裏需要多層次的安全防禦手段,例如流量異常行爲檢測,只有可信任的設備,才能接入工控系統網絡,且需要進行身份認證,確保登陸者也是可信任者。對Modbus 系統進行日誌記錄和安全審計功能,記錄操作的時間、地點、操作者和操作行爲等關鍵信息從而提供安全事件爆發後的追查能力。

當然,之前講述了很多Modbus協議和PLC設備被爆出的漏洞,所以企業也要定期對工控系統進行漏洞掃描,即時修補漏洞更新軟硬件。後續將與大家一起更深入研究Modbus協議,通過Python的modbus_tk模塊進行讀寫PLC並進行詳細的流量分析。

*本文作者:黃一113530,轉載請註明來自FreeBuf.COM

相關文章