工控安全這個領(lǐng)域比較封閉,公開的資料很少。我在讀《Hacking Exposed Industrial Control Systems》,一本16年的書,選了的部分章節(jié)進行翻譯,以其拋磚引玉。
MODBUS
Modbus是20世紀70年代后期由Modicon(現(xiàn)為施耐德電氣)為了配合其可編程邏輯控制器(PLC)一起使用,創(chuàng)建的基于串行的控制協(xié)議。Modbus是最常見的工業(yè)控制協(xié)議,主要是因為Modbus是一種開放的簡單而強大的協(xié)議,可以在沒有任何版稅的情況下開放使用。自從引入Modbus以來,協(xié)議已被移植到以太網(wǎng)上工作。為了實現(xiàn)這一點,基于串行的協(xié)議被封裝(基本上是“封裝”)在TCP數(shù)據(jù)的頭部,并且通過默認TCP端口502在以太網(wǎng)絡(luò)上傳輸。由于其易于使用,Modbus可以在各種工廠甚至于變電站中找到。
Modbus 分組幀可以分為兩部分:應(yīng)用數(shù)據(jù)單元(ADU)和協(xié)議數(shù)據(jù)單元(PDU)。ADU 由地址,PDU 和錯誤檢查方法組成。PDU 由功能碼和Modbus幀的數(shù)據(jù)段組成。圖5?1是 Modbus 串行協(xié)議的示例,也稱為 Modbus RTU。(譯者:注意 ADU 包含 PDU,兩者是包含關(guān)系)
圖5?1 Modbus RTU
Modbus RTU 協(xié)議與 Modbus 的所有其他實現(xiàn)不同,包括 Modbus+,Modbus ASCII,Modbus TCP/IP,TCP/IP上 的 Modbus 以及 Modbus 的其他較不常見的實現(xiàn)。我們的重點將是 Modbus TCP/IP。Modbus TCP/IP 和 Modbus over TCP/IP 之間的一個主要區(qū)別是 ModbusTCP/IP 在數(shù)據(jù)包的有效載荷內(nèi)沒有校驗和,就像在 Modbus RTU 中一樣。
Modbus TCP/IP 由 ADU 和 PDU 組成,非常類似于 Modbus RTU。然而,在 Modbus TCP/IP中,
圖5?2 MBAP和PDU
ADU 由 Modbus 應(yīng)用頭(MBAP)和 PDU 組成。MBAP 頭由事務(wù) ID,協(xié)議ID,長度和單元 ID 組成。PDU 與 Modbus RTU 中的 PDU 具有相同的結(jié)構(gòu),具有功能碼和數(shù)據(jù)有效載荷。數(shù)據(jù)包中的功能代碼(FC)是幫助確定數(shù)據(jù)包性質(zhì)的項目。例如,此處顯示的功能代碼為0x2b(43),為讀取設(shè)備標識FC。這個FC向設(shè)備請求特定的信息,例如PLC的制造商和PLC型號。
針對不同的 FC,數(shù)據(jù)包的數(shù)據(jù)部分代表不同的信息。對于讀取設(shè)備標識FC,該數(shù)據(jù)告訴設(shè)備請求的是哪部分標識。利用 Nmap,您可以使用 modbus-discover Nmap 腳本進行爆破收集。modbus-discover Nmap 腳本還會嘗試收集Slave ID信息。從站 ID 信息通過 FC 17(0x11)讀取。Modbus 標準包含了大多數(shù)設(shè)備將支持的功能代碼。這些功能碼在 Modbus 標準中定義,如圖5?3所示。
圖5?3 Modbus 功能碼
作為較舊的協(xié)議,Modbus 缺少大多數(shù)現(xiàn)代化的安全功能,甚至無法抵御諸如未經(jīng)身份驗證的命令發(fā)送和數(shù)據(jù)包重放之類微不足道的攻擊。使用每個功能代碼,數(shù)據(jù)包的數(shù)據(jù)部分發(fā)生變化,因此它包含正在請求的適當信息。作為示例,在功能碼1的 Modbus 線圈的讀取請求中,數(shù)據(jù)包的數(shù)據(jù)部分包含參考號,即開始讀取的點和要讀取的線圈數(shù)。圖5?4是 Wireshark 中的一個示例數(shù)據(jù)包:
圖5?4 Modbus 請求響應(yīng)示例
有多種讀寫Modebus線圈和寄存器的技術(shù)。你可以使用像Python這樣的編程語言來手工處理數(shù)據(jù)包,因為數(shù)據(jù)包非常簡單,而且有pymodbus這樣的庫來幫助你構(gòu)建,接收和解析數(shù)據(jù)包。另一個使數(shù)據(jù)包操作變得簡單的工具是scapy。當然,在大多數(shù)情況下,最簡單和快速的方法是使用已經(jīng)實現(xiàn)Modbus協(xié)議的客戶端工具。這里推薦一個適合滲透測試人員使用的工具,modbus-cli。它允許你使用簡單的命令來讀寫線圈和寄存器,如下圖5?5所示:
對Modbus設(shè)備進行滲透測試的一個難點,是需要找出每個線圈和寄存器對應(yīng)的功能是什么。與很多協(xié)議不同,Modbus協(xié)議不會記錄讀寫的值的意義。根據(jù)你的目標,你可以執(zhí)行更多的測試,來收集更多設(shè)備執(zhí)行邏輯的信息。利用CybatiWorks等模擬器系統(tǒng),您可以嘗試在非生產(chǎn)系統(tǒng)上執(zhí)行測試和收集信息。通過使用人機界面(HMI),更改線圈和寄存器的影響變得更加明顯。下面我們使用CybatiWorks模擬一個交通燈控制面板的示例,它的HMI非常簡單,您可以看到系統(tǒng)處于自動模式。
圖5?5 查看寄存器
圖5?6 存儲模式信息的寄存器
圖5?7 Cybatiworks模擬器
通過修改設(shè)置和遍歷查詢寄存器的值,你可以定位哪個寄存器與系統(tǒng)的模式設(shè)置相關(guān)聯(lián)(這個過程比較像做游戲破解時CE的行為)。這個過程會花一些時間,而且當你查詢系統(tǒng)中無效的地址時還會導(dǎo)致錯誤。如下圖5?7所示,通過上述步驟,我們發(fā)現(xiàn)設(shè)置寄存器%MW4的值為1,令系統(tǒng)處于自動模式,以使指示燈以給定的頻率發(fā)生變化。
你可能想要更改系統(tǒng)的模式,從而使設(shè)備不會定時的改變交通指示燈。為了達到這個效果,你可能想要修改寄存器%MW4的值為零。但在這個例子中,這個設(shè)備并不能通過一次數(shù)據(jù)寫來關(guān)閉自動模式。通過測試,我們認為這種現(xiàn)象可能是設(shè)備的內(nèi)部邏輯導(dǎo)致的。要想關(guān)閉自動模式,一個特定的指示燈需要先被打開。我們使用寫入命令,反轉(zhuǎn)所有寄存器的值,但除了%MW3。之所以保留%MW3,是因為%MW3映射到了HMI上的閃爍按鈕,無論其它寄存器是什么狀態(tài),只要%MW3被置位,所有指示燈將閃爍。完成上述步驟后,再將%MW4置為零,將禁用HMI中的設(shè)置。下圖5?8顯示了寫命令發(fā)出后,值的修改狀況
圖5?8 寫命令后的寄存器值
Modbus協(xié)議的中間人攻擊
由于設(shè)計中缺乏安全進制,Modbus協(xié)議易受中間人(Man in The Middle,MiTM)攻擊的影響,也包括數(shù)據(jù)包重放攻擊。前文提到的對Cybati交通燈系統(tǒng)的攻擊方式,就可以用于中間人攻擊。在攻擊中,攻擊者還可以通過欺騙HMI來使交通燈系統(tǒng)看起來沒有異常,從而延遲廠商發(fā)現(xiàn)問題。用多種開源或商用的工具可以用于在Modbus網(wǎng)絡(luò)上執(zhí)行中間人攻擊。Modbus VCR是開源的免費工具,它使用Ettercap記錄Modbus流量,然后重放該流量,使系統(tǒng)看起來就像在處理正常的流量。
施耐德PLC高危命令字
Modbus協(xié)議的實現(xiàn)中常常包含一些廠商實現(xiàn)的非標準的功能碼。一個典型的例子是施耐德PLC中的0x5a(90)功能碼。和大多數(shù)專有協(xié)議一樣,你必須使用工程軟件來分析協(xié)議的工作原理。工控安全研究和顧問公司Digital Bond在知名項目ProjectBasecamp中最早在一個Metasploit模塊中,指出功能碼 0x5a 的問題。該功能碼實現(xiàn)了Modbus標準未允許的功能,如終止 CPU 的工作。這個高危功能碼是通過記錄工程軟件(Unity Pro)與 Modicon PLC 的通信流量來發(fā)現(xiàn)的。
圖5?9 Unity Pro菜單項
通過數(shù)據(jù)包重放,可以看到這個命令字終止了Modicon PLC所有的運行邏輯。對于需要實時控制的系統(tǒng),這樣的攻擊可能導(dǎo)致災(zāi)難性后果。
記錄工程軟件和PLC之間的通信可以從協(xié)議中提供一些可用的信息。執(zhí)行功能代碼90的情況下,PLC泄露了令人驚訝的信息,如圖5?10所示,包括最后加載程序到設(shè)備的機器主機名。當檢查捕獲自PLC和工程軟件的流量時,Modbus中常常是未編碼的字符串,從而易于從設(shè)備的響應(yīng)中解析。
在示例中,項目名稱為“Project“,十六進制值為”\x50\x72\x6f\x6a\x65\x63\x74“。進一步檢查數(shù)據(jù)包,十六進制”\x08\x00\x00“是小端序似乎是項目修訂號,通過程序解釋后,會顯示為0.0.8?!盶x0c\x3b\x0c\x0e\x01\xde\x07“是項目文件上次修改的日期。下面顯示的日期時間戳記以小時,分,秒,日,月和年為單位,也是小端序。
圖5?11 時間戳
施耐德PLC識別
依然使用相同的技術(shù),Digital Bond的項目Project Redpoint能夠從PLC搜集更多的信息,包括PLC部署在工業(yè)設(shè)施內(nèi)部的位置。使用Modbus Nmap腳本收集信息有助于構(gòu)建設(shè)備畫像,這些設(shè)備通過功能碼43和功能碼90與Modbus進行通信。我們可以使用協(xié)議內(nèi)置的命令(功能碼43和功能碼90),安全地從設(shè)備獲取信息。
聯(lián)系客服