?
轉載請注明出處:信安科研人
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設定的原密碼
技術背景:

?編輯密碼寫入S7-300 PLC的本質是寫資料至SDB塊中,SDB被定義為一個靜態位元組:0x3042(這部分作者應該是想說是記憶體中SDB的段地址),具體的,寫到塊0000(0x30303030)中,綜合相加也就是地址0x304230303030處,
那么,有兩種操作:一種是從這個地址中獲取密碼;一種是直接洗掉這個資料(密碼),讓PLC不再受密碼保護,
作者選了第二種,
TIA修改通信密碼的流程:
怎么洗掉?從密碼更新的流程出發:更新或洗掉密碼時必須提供舊密碼;
-
更新新密碼時,PLC首先要清空塊SDB0的內容
-
然后將新的密碼寫入塊中
重放方法:
-
用TIA更新PLC配置的密碼,使用舊密碼更新,同時用wireshark記錄流量
-
只保留記錄流量中,洗掉SBD0塊操作對應的流量(?怎么找出來的?)
-
重放處理后的流量,發現PLC不再有密碼保護
B.從PLC中偷用戶程式位元組代碼
通信方式:用Python-snap7庫與PLC通信
通信目的:請求目標機器中的控制邏輯程式
使用工具:Python-snap7庫中的函式full_upload(type , block number),具體功能參考Search — python-snap7 0.0rc0 documentation
上傳方式:如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置于停止模式,
這三步的實作可以參考西門子官網的資料OB10
B.注入攻擊命令至PLC
使用作者開源的工具PLCinjectGitHub - SCADACS/PLCinject
將指定的命令注入到PLC程式中,
C.攻擊(離線)
成功注入后,PLC中的CPU將會檢查每個執行周期中的中斷條件,當到達設定的攻擊時間,中斷將被激活,然后執行OB10,OB10功能為CPU中斷,中斷時間可由攻擊者任意設定設定,
總結
這三個作業有一個核心共同點,那就是都是PLC控制邏輯指令惡意利用,加上網路攻擊中的中間人攻擊方式,達到了對PLC應用層的攻擊,
?
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/535213.html
標籤:訊息安全
上一篇:使用DAX,我只想為具有相同ID的多行獲取一個值,然后在其上運行IF陳述句
下一篇:PLC攻擊(一):應用層攻擊
