安全圈 | 专注于最新网络信息安全讯息新闻

首页

工控安全入門之modbus

作者 gigliotti 时间 2020-02-24
all

   MODBUS

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

Modbus分組幀可以分為兩部分:應用數據單元(ADU)和協定資料單元(PDU)。ADU由地址,PDU和錯誤檢查方法組成。PDU由功能碼和Modbus幀的數據段組成。圖5‑1是Modbus串列協定的示例,也稱為Modbus RTU。(譯者:注意ADU包含PDU,兩者是包含關係)

圖5‑1 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中,

圖5‑2 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標準中定義,如圖5‑3所示。

圖5‑3 Modbus功能碼

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

圖5‑4 Modbus請求響應示例

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

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

圖5‑5查看寄存器

圖5‑6存儲模式資訊的寄存器

圖5‑7 Cybatiworks模擬器

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

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

圖5‑8寫命令後的寄存器值

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的通信流量來發現的。

圖5‑9 Unity Pro功能表項目

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

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

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

圖5‑11時間戳記

施耐德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),安全地從設備獲取資訊。

本文由看雪論壇ljcnaix翻譯,

轉載請注明來自看雪論壇

如果你喜歡的話,不要忘記點個贊哦!

熱門閱讀文章:

選擇看雪企業SRC的5大理由

初學Windows內核漏洞利用(二):熟悉HEVD

初學Windows內核漏洞利用(一):搭建實驗環境

從內核角度分析Dirty Cow原理

『資源』Web安全線上練習平臺

……

更多優秀文章,長按下方二維碼,“關注看雪學院公眾號”查看!

看雪論壇:http://bbs.pediy.com/

微信公眾號ID:ikanxue

微博:看雪安全

   商務合作:[email protected]