背景
最近幾個月從事工控安全工作,其中涉及到模糊測試和漏洞分析,之前一直在忙各自專案,所以對漏洞挖掘沒怎麼做,這兩天剛好對施耐德plc進行了一次fuzz,出現了兩次異常,這篇文章對異常進行分析的乙個小結。
涉及到的知識
又叫模糊測試,原理就是往被測試目標傳送大量畸形資料,去發現目標漏洞的一種方法,這個技術不是本次文章的重點。
工控系統
plc介紹
可程式設計控制器,和一般的控制器的差別是它是可以對其程式設計的,而且有網絡卡介面,用來控制裝置的,因為沒有硬碟,所以很多沒有作業系統,只有韌體,也有一部分plc比較強大有作業系統和web服務,
modbus介紹
modbus是由modicon(現為施耐德電氣公司的乙個品牌)在2023年發明的,是全球第乙個真正用於工業現場的匯流排協議。modbus網路是乙個工業通訊系統,由帶智慧型終端的可程式設計序控制器
和計算機通過公用線路或區域性專用線路連線而成。其系統結構
既包括硬體、亦包括軟體。它可應用於各種資料採集和過程監控。
modbus網路只有乙個主機,所有通訊都由他發出。網路可支援247個之多的遠端從屬控制器,但實際所支援的從機數要由所用通訊裝置決定。採用這個系統,各pc可以和中心主機交換資訊而不影響各pc執行本身的控制任務。
正文
首先大家看一下我的fuzz結果,因為有兩次異常,這邊貼出來一次代表一下
這是fuzz的日誌,其中00-00-00-00-00-03-00-00-de引發了通訊異常,要對這個異常進行復現,所以要構造同樣的資料報傳送給目標,看能否再次引發,目前只知道協議的modbus的,對這個資料格式有待確定,通過查詢modbus協議結構,發現它有應該有12個位元組,但是這邊只有9個單元,所以我很疑惑這些是單個位元組的16進製制還是18個數字,我隱約肯定這是乙個資料報,應該是16進製制,但是和協議資料報的長度又對不上
資料型別轉位元組流
通過上面的**進行分析,資料項轉換成位元組剛好是9個位元組,意思是日誌列印的是9個位元組可以確定,這邊需要提一點是python轉換成位元組流的時候的位數問題,比如乙個整形8,你傳入struct.pack的字元格式不同,它轉換的位元組數也是不同的,因為它對應c語言的整形,一般情況你使用i做引數的話它會把數字轉為4個位元組,對應c語言的整形,下面會放一張表
還有涉及到二進位制的大端和小端傳輸方式
為了讓大家更直觀的看到差異,給大家做個例子,其中a=0
大家看到h和b轉為的位元組碼位數是不一樣的,所以檢視程式的源**我確定了位元組的位數和位元組的含義,在fuzz的原始碼上找到了位元組數量和日誌中的16進製制的對應關係,確定了位元組的含義。
構造引發異常的modbus資料報
接下來是構造modbus資料報,用16進製制資料封裝成乙個modbus資料報,根據modbus協議的結構,在日誌中的資料其實把資料報的頭和控制部分已經定義好了,它先更改的是資料部分,這邊需要做的是封裝成16進製制然後驗證資料報。
首先我寫了乙個簡單的python指令碼,然後把日誌裡的字串寫成16進製制形式資料
然後對傳送的資料報使用wireshark進行流量分析,如下圖
大家可以看到,完成了資料傳輸,而且服務端有響應,說明那個資料並不能使plc產生漏洞,但也有好的一面是構造的資料報是正確的,然後接著驗證構造的資料報如下,大家可以看到它的資料部分是de,和日誌的最後乙個位元組是一致的,說明按照位元組序是可以構造資料報的,而不需要再考慮大端小端問題
很遺憾這次沒有挖到漏洞,不過對流程做個小結,後續會有更多分享。
Modbus閘道器 Modbus協議閘道器
modbus閘道器是將modubs tcp協議轉換成modbus rtu協議的一種裝置。modbus協議在儀器和感測器領域有著廣泛的應用,可以獲取儀器和感測器的資料。然而,傳統的基於rs485的modbus rtu 或ascii 具有速度慢 擴充套件性差的特點,因此modbus tcp作為一種基於網...
工控安全 工控常見協議識別
首先是因為接到乙個任務 需要對工控常見協議的識別流量進行收集。專案見 含nse指令碼和識別pcap流量 協議通訊 埠siemens s7 tcp102 modbus tcp502 iec 60870 5 104 tcp2404 dnp3 tcp20000 ethernet ip udp44818 b...
modbus協議分析
rtu模式 1,modbus功能碼表 功能碼功能碼描述 plc位址 modbus位址 位操作 字操作 操作暫存器數量 0fh寫多個線圈 00001 09999 0000h ffffh 位操作多個 01h讀線圈狀態 00001 09999 0000h ffffh 位操作單個或多個 02h讀離散輸入狀態...