1. 程式人生 > >工控安全入門之Modbus(轉載)

工控安全入門之Modbus(轉載)

中間 們的 無效 開始 正常的 讀取 禁用 一個 建設

工控安全這個領域比較封閉,公開的資料很少。我在讀《Hacking Exposed Industrial Control Systems》,一本16年的書,選了的部分章節進行翻譯,以其拋磚引玉。

MODBUS

Modbus是20世紀70年代後期由Modicon(現為施耐德電氣)為了配合其可編程邏輯控制器(PLC)一起使用,創建的基於串行的控制協議。Modbus是最常見的工業控制協議,主要是因為Modbus是一種開放的簡單而強大的協議,可以在沒有任何版稅的情況下開放使用。自從引入Modbus以來,協議已被移植到以太網上工作。為了實現這一點,基於串行的協議被封裝(基本上是“封裝”)在TCP數據的頭部,並且通過默認TCP端口502在以太網絡上傳輸。由於其易於使用,Modbus可以在各種工廠甚至於變電站中找到。

Modbus 分組幀可以分為兩部分:應用數據單元(ADU)和協議數據單元(PDU)。ADU 由地址,PDU 和錯誤檢查方法組成。PDU 由功能碼和Modbus幀的數據段組成。圖51是 Modbus 串行協議的示例,也稱為 Modbus RTU。(譯者:註意 ADU 包含 PDU,兩者是包含關系)

技術分享

圖51 Modbus RTU

Modbus RTU 協議與 Modbus 的所有其他實現不同,包括 Modbus+,Modbus ASCII,Modbus TCP/IP,TCP/IP上 的 Modbus 以及 Modbus 的其他較不常見的實現。我們的重點將是 Modbus TCP/IP。Modbus TCP/IP 和 Modbus over TCP/IP 之間的一個主要區別是 ModbusTCP/IP 在數據包的有效載荷內沒有校驗和,就像在 Modbus RTU 中一樣。

Modbus TCP/IP 由 ADU 和 PDU 組成,非常類似於 Modbus RTU。然而,在 Modbus TCP/IP中,

技術分享

圖52 MBAP和PDU

ADU 由 Modbus 應用頭(MBAP)和 PDU 組成。MBAP 頭由事務 ID,協議ID,長度和單元 ID 組成。PDU 與 Modbus RTU 中的 PDU 具有相同的結構,具有功能碼和數據有效載荷。數據包中的功能代碼(FC)是幫助確定數據包性質的項目。例如,此處顯示的功能代碼為0x2b(43),為讀取設備標識FC。這個FC向設備請求特定的信息,例如PLC的制造商和PLC型號。

針對不同的 FC,數據包的數據部分代表不同的信息。對於讀取設備標識FC,該數據告訴設備請求的是哪部分標識。利用 Nmap,您可以使用 modbus-discover Nmap 腳本(https://nmap.org/nsedoc/scripts/modbus-discover.html)進行爆破收集。modbus-discover Nmap 腳本還會嘗試收集Slave ID信息。從站 ID 信息通過 FC 17(0x11)讀取。Modbus 標準包含了大多數設備將支持的功能代碼。這些功能碼在 Modbus 標準中定義,如圖53所示。

技術分享

圖53 Modbus 功能碼

作為較舊的協議,Modbus 缺少大多數現代化的安全功能,甚至無法抵禦諸如未經身份驗證的命令發送和數據包重放之類微不足道的攻擊。使用每個功能代碼,數據包的數據部分發生變化,因此它包含正在請求的適當信息。作為示例,在功能碼1的 Modbus 線圈的讀取請求中,數據包的數據部分包含參考號,即開始讀取的點和要讀取的線圈數。圖54是 Wireshark 中的一個示例 數據包:

技術分享

圖54 Modbus 請求響應示例

有多種讀寫Modebus線圈和寄存器的技術。你可以使用像Python這樣的編程語言來手工處理數據包,因為數據包非常簡單,而且有pymodbus這樣的庫來幫助你構建,接收和解析數據包。另一個使數據包操作變得簡單的工具是scapy(http://www.secdev.org/projects/scapy/)。當然,在大多數情況下,最簡單和快速的方法是使用已經實現Modbus協議的客戶端工具。這裏推薦一個適合滲透測試人員使用的工具,modbus-cli(https://github.com/tallakt/modbus-cli)。它允許你使用簡單的命令來讀寫線圈和寄存器,如下圖55所示:

對Modbus設備進行滲透測試的一個難點,是需要找出每個線圈和寄存器對應的功能是什麽。與很多協議不同,Modbus協議不會記錄讀寫的值的意義。根據你的目標,你可以執行更多的測試,來收集更多設備執行邏輯的信息。利用CybatiWorks(https://cybati.org/cybatiworks)等模擬器系統,您可以嘗試在非生產系統上執行測試和收集信息。通過使用人機界面(HMI),更改線圈和寄存器的影響變得更加明顯。下面我們使用CybatiWorks模擬一個交通燈控制面板的示例,它的HMI非常簡單,您可以看到系統處於自動模式。

技術分享

圖55 查看寄存器

技術分享

圖56 存儲模式信息的寄存器

技術分享

圖57 Cybatiworks模擬器

通過修改設置和遍歷查詢寄存器的值,你可以定位哪個寄存器與系統的模式設置相關聯(這個過程比較像做遊戲破解時CE的行為)。這個過程會花一些時間,而且當你查詢系統中無效的地址時還會導致錯誤。如下圖57所示,通過上述步驟,我們發現設置寄存器%MW4的值為1,令系統處於自動模式,以使指示燈以給定的頻率發生變化。

你可能想要更改系統的模式,從而使設備不會定時的改變交通指示燈。為了達到這個效果,你可能想要修改寄存器%MW4的值為零。但在這個例子中,這個設備並不能通過一次數據寫來關閉自動模式。通過測試,我們認為這種現象可能是設備的內部邏輯導致的。要想關閉自動模式,一個特定的指示燈需要先被打開。我們使用寫入命令,反轉所有寄存器的值,但除了%MW3。之所以保留%MW3,是因為%MW3映射到了HMI上的閃爍按鈕,無論其它寄存器是什麽狀態,只要%MW3被置位,所有指示燈將閃爍。完成上述步驟後,再將%MW4置為零,將禁用HMI中的設置。下圖58顯示了寫命令發出後,值的修改狀況

技術分享

圖 58 寫命令後的寄存器值

Modbus協議的中間人攻擊

  • 流行程度:10

  • 難度:8

  • 影響面:8

  • 威脅評分:9

由於設計中缺乏安全進制,Modbus協議易受中間人(Man in The Middle,MiTM)攻擊的影響,也包括數據包重放攻擊。前文提到的對Cybati交通燈系統的攻擊方式,就可以用於中間人攻擊。在攻擊中,攻擊者還可以通過欺騙HMI來使交通燈系統看起來沒有異常,從而延遲廠商發現問題。用多種開源或商用的工具可以用於在Modbus網絡上執行中間人攻擊。Modbus VCR(https://github.com/reidmefirst/modbus-vcr/)是開源的免費工具,它使用Ettercap記錄Modbus流量,然後重放該流量,使系統看起來就像在處理正常的流量。

施耐德PLC高危命令字

  • 流行程度:10

  • 難度:8

  • 影響面:8

  • 威脅評分:9

Modbus協議的實現中常常包含一些廠商實現的非標準的功能碼。一個典型的例子是施耐德PLC中的0x5a(90)功能碼。和大多數專有協議一樣,你必須使用工程軟件來分析協議的工作原理。工控安全研究和顧問公司Digital Bond在知名項目ProjectBasecamp中最早在一個Metasploit模塊(https://www.rapid7.com/db/modules/auxiliary/admin/scada/modicon_command)中,指出功能碼 0x5a 的問題。該功能碼實現了Modbus標準未允許的功能,如終止 CPU 的工作。這個高危功能碼是通過記錄工程軟件(Unity Pro)與 Modicon PLC 的通信流量來發現的。

技術分享

圖59 Unity Pro菜單項

通過數據包重放,可以看到這個命令字終止了Modicon PLC所有的運行邏輯。對於需要實時控制的系統,這樣的攻擊可能導致災難性後果。

記錄工程軟件和PLC之間的通信可以從協議中提供一些可用的信息。執行功能代碼90的情況下,PLC泄露了令人驚訝的信息,如圖510所示,包括最後加載程序到設備的機器主機名。當檢查捕獲自PLC和工程軟件的流量時,Modbus中常常是未編碼的字符串,從而易於從設備的響應中解析。

技術分享

在示例中,項目名稱為“Project“,十六進制值為”\x50\x72\x6f\x6a\x65\x63\x74“。進一步檢查數據包,十六進制”\x08\x00\x00“是小端序似乎是項目修訂號,通過程序解釋後,會顯示為0.0.8。”\x0c\x3b\x0c\x0e\x01\xde\x07“是項目文件上次修改的日期。下面顯示的日期時間戳記以小時,分,秒,日,月和年為單位,也是小端序。

技術分享

圖511 時間戳

施耐德PLC識別

  • 流行程度:10

  • 難度:8

  • 影響面:3

  • 威脅評分:7

依然使用相同的技術,Digital Bond的項目Project Redpoint(https://github.com/digitalbond/Redpoint/blob/master/modicon-info.nse)能夠從PLC搜集更多的信息,包括PLC部署在工業設施內部的位置。使用Modbus Nmap腳本收集信息有助於構建設備畫像,這些設備通過功能碼43和功能碼90與Modbus進行通信。我們可以使用協議內置的命令(功能碼43和功能碼90),安全地從設備獲取信息。

工控安全入門之Modbus(轉載)