PLC攻擊(一):應用層攻擊
轉載請註明出處:信安科研人
please subscribe my official wechat :信安科研人
獲取更多安全資訊
參考文獻:
A Stealth Program Injection Attack against S7-300 PLCs
A Control Injection Attack against S7 PLCs -Manipulating the Decompiled Code.
Patch Now and Attack Later – Exploiting S7 PLCs by Time-Of-Day Block
按照時間順序自上至下排序的三個工作全是來自🇩🇪
IHP – Leibniz-Institut für innovative Mikroelektronik, Frankfurt (Oder), Germany Brandenburg University of Technology Cottbus-Senftenberg, Cottbus, Germany
的Wael Alsabbagh以及 Peter Langendörfer所做,該團隊從PLC的應用層出發,主要針對西門子s7系列的PLC,到目前為止,設計了三種攻擊方式。
方式一 一種針對S7-300度隱蔽的程式注入攻擊
一 研究背景
背景一 PLC通訊協議
-
PLC一般通過TCP/IP與工作站通訊
-
西門子的TIA和PLC一般通過S7通訊
背景二 PLC遭受的威脅較大
二 研究思路
首先損害plc的安全性,並更改運行的控制邏輯程式。
第二,從控制中心的工程軟體中隱藏受感染的邏輯,該軟體可以從PLC遠程獲取邏輯並揭示控制邏輯的感染。(怎麼從遠程感染不是本文的重點)
三 研究內容
實驗架構
PLC讀取來自感測器1、2、3和4的輸入訊號。當水箱充滿水時,安裝在兩個水箱上的兩個上部感測器 (Num. 1,3) 向設備報告,而當水箱為空時,兩個下部感測器 (Num. 2,4) 向設備報告。然後,PLC根據接收到的感測器讀數為泵提供電源,放水至水箱。
攻擊者模型和攻擊面
-
攻擊者已經獲取網路訪問許可權,切可以通過102埠發送數據包至PLC
-
攻擊者無TIA軟體,也不了解PLC控制生產鏈具體細節
-
攻擊者不知道PLC的通訊協議以及現在所運行的控制邏輯程式
攻擊方法詳述
A.損害PLC的安全性——解除PLC的密碼保護
挑戰: 讀寫PLC需要8個字元長度的密碼
方法一般有兩種,一種是重放攻擊,通過提取,密碼的hash,然後發送至PLC
另一種是暴力攻擊,按照hash自列密碼的結果,暴力破解。
答:本文用重放攻擊,但是移除了PLC設置的原密碼
技術背景:
那麼,有兩種操作:一種是從這個地址中獲取密碼;一種是直接刪除這個數據(密碼),讓PLC不再受密碼保護。
作者選了第二種。
TIA修改通訊密碼的流程:
怎麼刪除?從密碼更新的流程出發:更新或刪除密碼時必須提供舊密碼;
-
更新新密碼時,PLC首先要清空塊SDB0的內容
-
然後將新的密碼寫入塊中
重放方法:
-
用TIA更新PLC配置的密碼,使用舊密碼更新,同時用wireshark記錄流量
-
只保留記錄流量中,刪除SBD0塊操作對應的流量(?怎麼找出來的?)
-
重放處理後的流量,發現PLC不再有密碼保護
B.從PLC中偷用戶程式位元組程式碼
通訊方式:用Python-snap7庫與PLC通訊
通訊目的:請求目標機器中的控制邏輯程式
使用工具:Python-snap7庫中的函數full_upload(type , block number),具體功能參考
上傳方式:如full_upload(OB塊,1),上傳至攻擊者的機器中,以供後續惡意程式碼注入
C. 將用戶位元組碼反編譯為STL程式碼
NOP指令對應的位元組就是F000,用如圖的方法提取所有STL指令對應的位元組,構建資料庫記錄這個映射。
D.隱蔽的控制注入攻擊
為什麼要隱蔽?因為不隱蔽的攻擊很容易被發現。
為什麼容易被發現?因為有檢測和保護機制,攻擊會破壞這些機制,從而被發現。
有哪些檢測和保護機制?如檢查程式碼大小、周期時間變化、程式碼比較等。
如何繞過?因為TIA會將在線的PLC上的控制程式與控制中心的離線的用戶控制程式進行比較來發現是否存在問題,作者通過構造虛假的PLC,將TIA與真PLC的連接重定向到假的PLC,並傳送原始的控制程式給TIA即可,本質上是中間人攻擊。
方案細節:
(1)如何假扮PLC?
背景:PN-DCP協議(數據流量層協議)有個漏洞。
這個協議用於發現設備或配置設備的名稱、IP地址等。TIA通過廣播一個名為"identify all"的數據包來請求網路中的所有可訪問設備,所有可用的S7 PLC將回應'identify ok'數據包,這個數據包含有設備的名稱、IP地址等資訊。 沒有對身份驗證,當TIA收到identify ok後就會與這個ok數據包中包含的ip地址進行連接。
目標:阻止TIA門戶到達遠程PLC,並將其連接到偽造的PLC。
做法: 在舊會話期間記錄了TIA門戶和遠程PLC之間的 「identify all」 和 「identify ok」 數據包,然後修改了真實PLC的響應數據包,將PLC的ip地址替換為192.168.0.1與假PLC的ip地址192.168.0.3。
-
首先,兩個遠程站之間傳輸的所有數據包都將首先通過 MITM 系統,然後構建攻擊 ARP 表(ARP 中毒攻擊)。
-
之後,MITM 系統通過網路發送一個「identify all」數據包(見圖 8a),遠程 PLC 通過將「identify ok」數據包發送給攻擊者以響應,如圖 8b 所示。
-
一旦 TIA Portal 通過網路發送一個新的「identify all」數據包以嘗試與遠程 PLC 連接,MITM 系統就會偵聽網路,識別請求並丟棄數據包,以防止真正的 PLC 響應此請求,然後將偽造的「identify ok」數據包發送回 TIA Portal,如圖 8c 所示。
(2)如何傳送原始控制邏輯給TIA才能不讓其對比發現異常?
如果管理員懷疑遠程PLC運行的控制邏輯程式不對,他將請求現在運行的邏輯程式的情況,然後進行對比。
欺騙方法如下:
先記錄一個TIA與遠程PLC之間的歷史上傳的session,然後修改安全檢查期間所抓取的數據包中的ip為假PLC的ip。
方式二 操作反編譯的程式碼以對S7PLC發起控制注入攻擊
攻擊方案的簡述:
本文討論了一種允許攻擊者以高級反編譯格式修改在 S7 PLC 中運行的控制邏輯程式的方法。
研究背景與動機
動機: 梯形圖程式LAD程式碼暴露了控制邏輯的結構和語義
背景一 PLC基本結構
-
每個供應商都有自己的專有韌體、編程、通訊協議和維護軟體。但是,基本的硬體和軟體架構是相似的,這意味著所有 PLC 都包含變數和控制其輸入和輸出的邏輯。
-
PLC程式碼是用供應商的控制邏輯語言在工程站上編寫的。然後將控制邏輯編譯為可執行格式,並下載到PLC。
-
PLC處於工業內網,攻擊PLC可以獲取內網拓撲資訊
背景二 相關工作
-
精心構造數據包,通過工作站或乙太網刪除控制邏輯程式
-
在運行時修改控制邏輯,損害韌體和身份驗證缺陷,並觸發PLC故障狀態
攻擊方案
攻擊者模型
-
無法訪問TIA Portal軟體
-
可以向/從目標PLC發送/接收消息
-
具備在TIA和PLC之間的中間人攻擊系統
攻擊流程
A.從PLC中竊取機器位元組碼
前提:
-
PLC只通過處理從工程站發送的上傳/下載請求來發送/接收控制邏輯程式
-
其中,上傳對應的協議欄位標識為0x1e,下載為0x1b。
-
位元組碼始終位於提取的原始數據中的兩個位元組碼開始鍵0x0082和結束鍵0x6500之間
依據前提,從TIA與PLC之間上傳/下載控制程式的數據流中過濾出控制程式的機器位元組碼
B.將機器位元組碼解編譯為梯形圖LAD
與方式一一樣的思路,構建一個位元組碼與指令的映射,然後設計一個自動化映射程式。
C.構建感染程式
依據人工經驗,構建惡意的LAD程式,然後形成最終的機器位元組碼格式,放入數據包中推給PLC,達到攻擊效果
方式三 使用TIME-OF-DAY塊攻擊S7系列PLC
研究背景
思路背景:
傳統的應用層控制邏輯攻擊需要在線進行,在線的將惡意程式碼注入到PLC中,方法三針對這個點,進行一場離線攻擊。
技術背景:
(1)西門子PLC執行環境
-
首先,CPU首先檢查所有輸入的狀態,即拍攝輸入的映像(例如感測器、開關等),並將其保存在I/O記憶體中。
-
之後,邏輯控制程式以持續時間約為1毫秒的時間片執行。每個時間片分為三個部分,按順序執行:作業系統、用戶程式和通訊。時間切片的數量在很大程度上取決於當前的用戶程式。
-
在程式執行結束後,CPU會更新所有輸出狀態,即更新保存在I/O記憶體中的輸出映像。
-
然後,CPU返回周期的開始,並重新啟動周期時間監控。
(2)西門子用戶程式
組織塊(OB)、函數(FC)、功能塊(FB)、數據塊(DB)、系統功能(SFC)、系統功能塊(SFB)和系統數據塊(SDB)
OB、FC和FB包含實際程式碼,而DB為數據結構提供存儲,並為當前PLC配置提供SDB。
一個簡單的PLC程式由至少一個名為OB1的組織塊組成,這與傳統C程式中的主要()函數相當。
在更複雜的程式中,工程師可以使用函數FC和函數塊FB來封裝程式碼。唯一的區別是額外的數據塊資料庫作為調用FB的參數。SFC和SFB內置在PLC中,作業系統周期性調用主塊(OB1)來執行用戶程式。
PLC周期時間
循環時間是作業系統運行主程式、所有中斷周期的程式部分、系統活動的和,每個周期時間長度不一樣,很大程度上取決於當前用戶程式的複雜性以及中斷用戶程式執行的事件次數。
即,如果主OB1中調用中斷OB次數過多,整個周期的時間變長,超過硬體配置的設置,則會產生軟體錯誤,將會調用OB8o來處理這個錯誤。如果沒有載入OB8o,PLC會轉向停止模式
PLC中有很多種中斷塊,如當天的時間中斷(OB10-OB17)、時延遲中斷(OB20至-OB23)、循環中斷(OB30-OB38)、硬體中斷(OB40-OB47)等,本文只對時間中斷塊OB10感興趣。
(3)時間中斷塊(OB10)
目的是達到time of day中斷,這種中斷取決於具體的需求,可以細化到發生一次中斷、一分鐘、一天、一個月等
三種方式能夠達到這個目的:
-
自啟動
-
配置設置TOD中斷,然後通過調用邏輯程式中的SFC30(ACT_TINT)指令來激活
-
通過調用SFC28(SET_TINT)指令來設置TOD中斷,然後調用SFC30來調用並激活他
本文選第三種
攻擊方案
簡述
首先設置兩個SFC命令的參數,然後注入PLC程式(OB1)中,如果到達了設定的攻擊時間,那麼產生中斷,跳轉到OB10,停止運行CPU
攻擊細節
A.準備(離線)
(1)設置SFC28的參數
(2)設置SFC30的參數
(3)配置TOD Oregnization Block(OB10)
攻擊者程式碼會被編程入OB10,OB10旨在將CPU置於停止模式。
這三步的實現可以參考西門子官網的資料
B.注入攻擊命令至PLC
使用作者開源的工具PLCinject
將指定的命令注入到PLC程式中。
C.攻擊(離線)
成功注入後,PLC中的CPU將會檢查每個執行周期中的中斷條件,當到達設置的攻擊時間,中斷將被激活,然後執行OB10,OB10功能為CPU中斷,中斷時間可由攻擊者任意設置設置。
總結
這三個工作有一個核心共同點,那就是都是PLC控制邏輯指令惡意利用,加上網路攻擊中的中間人攻擊方式,達到了對PLC應用層的攻擊。