工控PLC蠕蟲的實現(xiàn)

發(fā)布時間:2024-04-11
眾說周知,工業(yè)生產(chǎn)過程是通過可編程邏輯控制器(plc)來控制的。 現(xiàn)在市場上許多plc 都配置了以太網(wǎng)口并且可以用 ip 進行通信。 我們將以西門子 simatic s7-1200 機器為例展示一個蠕蟲范例。此蠕蟲不需要依賴 pc 電腦去擴散。該蠕蟲僅僅活躍并運行在 plc 當中。它可以通過網(wǎng)絡掃描來尋找新的目標(新的 plc),然后攻擊這些目標并將自身拷貝到這些新的 plc 中,而且目標 plc 上運行原主程序不會發(fā)生任何改變。這些 plc 目標一旦感染該蠕蟲后會再次進行掃描感染。我們將分析蠕蟲對目標的影響以及提出可能的緩解技術(shù)。
1. 介紹
it 系統(tǒng)在當今工業(yè)生產(chǎn)發(fā)展至關(guān)重要的一部分。 可以說,沒有現(xiàn)代化的通信網(wǎng)絡,就不可能有現(xiàn)代化的工業(yè)生產(chǎn)。然而不幸的是,正由于工業(yè)系統(tǒng)對當今 it 系統(tǒng)和通信網(wǎng)絡的依賴,使得用戶也暴露于被攻擊的危險之中,而這早已是 it 界久知的問題。it 黑客攻擊可能對工業(yè)系統(tǒng)造成多種傷害。比如他們可以造成工業(yè)生產(chǎn)的中斷以及高額的經(jīng)濟損失,與此同時還可能對生活環(huán)境以及生命健康造成負面影響。其攻擊的威力在 stuxnet 蠕蟲上得到了充分的展示。西門子的可編程控制器(plc)受到惡意篡改以阻礙伊朗核燃料鈾濃縮。通過利用微軟操作系統(tǒng)漏洞,該蠕蟲感染進入到鈾濃縮工廠的電腦當中,plc 的軟件被惡意篡改以摧毀鈾濃縮離心機。該蠕蟲需要一臺 pc 電腦來進行傳播并且通過 pc 電腦來攻擊 plc。這篇文章將將闡述一種可以在 plc 之間傳播的蠕蟲。不需要任何 pc 電腦。蠕蟲可能通過一個已經(jīng)被感染過的 plc 而被引入到工業(yè)工廠中,蠕蟲接下來便會通過自我復制來感染到其他 plc 中,并且在修改目標 plc 并執(zhí)行感染時添加到 plc 用戶程序中…。這篇文章描述的蠕蟲是基于西門子 simatic s7-1200v3,該蠕蟲通過結(jié)構(gòu)化文本(st)編寫而成,該語言是一種用于開發(fā) plc 軟件的編程語言。
2. 相關(guān)工作
2015 年在美國 blackhat 大會上,klick 公司展示了一款在 plc 上運行的惡意軟件。他們使用plc 的一個通信特征實現(xiàn)了代理服務。我們將用同樣的通信特性來實現(xiàn)了一個可以傳送一個蠕蟲程序的協(xié)議。通過使用該協(xié)議,該蠕蟲可以從一個 plc 直接傳到另一個 plc 中。這個蠕蟲不需要更多系統(tǒng)去支持。我們沒有用更加聞名的 simatic s7-300,取而代之的是,我們的工作成果基于新的 s7-1200v3。plc 使用的協(xié)議也與舊版不同。該文章也將會介紹這種新型的協(xié)議。
3. plc 體系結(jié)構(gòu)
plc 使用簡單系統(tǒng)結(jié)構(gòu)構(gòu)建而成。他們基于中央處理器(cpu)模塊,加上數(shù)字輸入和輸出的模塊組成。cpu 處理 plc 操作系統(tǒng)以及運行用戶程序。此外 cpu 還負責與其他設(shè)備通訊以及管理過程圖(process image)。
過程圖(process image)儲存著所有的輸入和輸出的狀態(tài)。用戶程序不能直接操作物理的輸入輸出,而是通過操作過程圖像而實現(xiàn)的。用戶程序的運行是一個循環(huán)。每次循環(huán)的起始和結(jié)束的時候,cpu 會刷新過程圖像。循環(huán)上限指的是循環(huán)時間。如果(一個循環(huán)運行的時間)超過循環(huán)上限時,plc 會停止用戶程序運行并拋出一個異常。
figure 1. zyklus eines plcs
用戶程序通過pou(程序組織單元)構(gòu)造而成。這些單元(程序組織單元)包含了控制plc的使用說明,因而可控制工業(yè)生產(chǎn)。simatic s7-1200支持以下的pou:
organisation block (ob): 用戶程序主入口
data block (db): 全局存儲器
function (fc): 功能
function block (fb): 有穩(wěn)固局部儲存器的功能
此外有幾個西門子提供的給用戶自定義的pou功能也可找到。這篇文章運用了系統(tǒng)pou tcon和tdiscon。使用這些pou,plc可以初始化或者銷毀任意系統(tǒng)的tcp連接。也可以通過trcv和tsend來接收和發(fā)送緩沖區(qū)數(shù)據(jù)。
4. 電腦蠕蟲
電腦蠕蟲從1988年就已經(jīng)出現(xiàn)并且是惡意軟件中有名的一種。蠕蟲多種但都基本架構(gòu)相同。所有的蠕蟲攻擊都可以歸為一下幾個階段:可能目標的搜索,感染目標,在目標上執(zhí)行,添加惡意功能。在plc上蠕蟲也同樣支持這些工功能。這篇文章將展示每個必須組件的實現(xiàn)方法。
5. 在 s7 1200 上實現(xiàn)一個蠕蟲
5.1 體系結(jié)構(gòu)
這個蠕蟲的編寫與其他限制性蠕蟲軟件一樣。在開發(fā)過程中,必須滿足特定的plc的限制條件,尤其是循環(huán)上限。蠕蟲每幾微秒就必須中斷其執(zhí)行,并在接下來的每次循環(huán)中能夠繼續(xù)執(zhí)行。為了滿足這個要求,我們通過狀態(tài)機來設(shè)計該蠕蟲。當前的狀態(tài)被存在全局變量里面,在每次循環(huán)開始開始時,蠕蟲的相關(guān)代碼將會被調(diào)用。所以永遠不會超過循環(huán)上限的時間。
如圖2中所展示的步驟,蠕蟲首先初始化一個連接來連接可能目標。一旦建立了連接,蠕蟲會檢測目標是否已經(jīng)被感染,如果沒有感染,蠕蟲將暫停目標機上的用戶主程序的執(zhí)行,使其能夠傳輸自己的代碼。用戶程序暫停后蠕蟲將自己復制到目標plc上,完成后啟動目標plc,接下來蠕蟲再測試下一個可能的目標。
figure 2. execution sequence of the worm
5.2 目標偵查
蠕蟲先掃描可能的目標,西門子的plc可以通過102/tcp端口來識別。這個端口僅僅能夠被外部防火墻關(guān)閉,并且其他普通的服務不會使用這個端口。
s7-1200用pou tcon管理tcp連接。這個pou的的用法在圖3的第3行進行了展示。任意一個ip地址和端口在第9行代碼中被傳遞。一旦pou被調(diào)用,plc會試圖建立連接,并且這兩者是異步發(fā)生的。在之后的循環(huán)當中會對當前的連接狀態(tài)進行驗證。返回值done(zeile 5)信號表示該連接是否被建立,如果為true,繼續(xù)感染。如果ip地址和端口無法找到是不會有錯誤提示的。蠕蟲需要在每次循環(huán)中通過遞增計數(shù)器來檢測超時。
1 if data.con_state = 10 then
2
3 tcon_db(req:=data.action,
4 id:=1,
5 done=>data.con_done,
6 busy=>data.con_busy,
7 error=>data.con_error,
8 status=>data.con_status,
9 connect:=data.con_param);
10
11 if data.con_done = true then
12 // connection open
13 data.con_state := 20;
14 else
15 // connection not open
16 data.con_timeout := data.con_timeout + 1;
17 // connection timeout?
18 if data.con_timeout > 200 then
19 data.con_state := 0;
20 end_if;
21 end_if;
22
23 goto cycle_end;
24 end_if;
figure 3. target detection using scl
如果在200個循環(huán)后沒有建立連接,蠕蟲會繼續(xù)執(zhí)行在圖4當中的代碼。最然沒有建立任何連接,但為了下一次連接的建立,必須調(diào)用pou tdiscon來釋放資源。在第13行中,ip地址是遞增的,因而所有的/24子網(wǎng)ip都會進行掃描并找到開放的102/tcp端口。
1 if data.con_state = 0 then
2
3 tdiscon_db(req:=data.action,
4 id:=1,
5 done=>data.con_done,
6 busy=>data.con_busy,
7 error=>data.con_error,
8 status=>data.con_status);
9
10 if data.con_error = true or
11 data.con_done = true
12 then
13 data.con_param.rem_staddr[4] :=
14 (data.con_param.rem_staddr[4] + 1) mod 255;
15 data.con_timeout := 0;
16 data.con_state := 10;
17 end_if;
18
19 goto cycle_end;
20 end_if;
figure 4. target detection in scl
5.3 感染
在感染階段,蠕蟲拷貝自身到目標plc中。正常情況下軟件通過西門子tia-portal(端口)傳輸?shù)絧lc中。蠕蟲模仿tia-portal并實現(xiàn)了私有的siemens協(xié)議。當我們在自己系統(tǒng)上分析這個協(xié)議時,發(fā)現(xiàn)thomas wiens的wireshark plugin是可以解析這種協(xié)議的。
5.3.1 傳輸協(xié)議
文章的剩下部分主要講解這種被稱為s7commplus的私有協(xié)議。這是一個使用tpkt [6] 和iso8073 [7]標準制定的一個二進制協(xié)議。正常情況下這兩個協(xié)議都使用 102/tcp端口。
s7commplus主要特性:
plc的配置
啟動和停止plc
讀寫過程變量
程序傳輸(上傳和下載)
調(diào)試
提供調(diào)試信息
警告
5.3.2. 消息
s7commplus所使用的每個消息都有著相似的結(jié)構(gòu)。圖5展示了連接中的第一個消息。tia端口通過發(fā)送該消息來初始化一個連接。通用的結(jié)構(gòu)接下來會進行解。前兩個域表示的是tpkt和iso8073協(xié)議。他們的內(nèi)容在相應的文檔中都有解釋。之后的0x72字節(jié)表示s7commplus信息的起始,不同的協(xié)議會有不同的版本號,長度域不受幀邊界的限制。如果幀的邊界丟失,更多的信息會附在附加的信息的后面。緊跟長度域后面的是類型域,子類型字段進一步指定了該消息。序列號是隨著每個消息增加而遞增的。其他的數(shù)據(jù)是在特定屬性塊中傳輸?shù)摹?br>figure 5. s7commplus message structure
5.3.3. 屬性塊
真正的數(shù)據(jù)是在屬性塊中。圖6展示了上面例子中的第一個標志塊。每個屬
性塊都是以0xa3開始,該塊包含一個字符串。完整的字符串包含長度和字符串值。
figure 6. attribute block
5.3.4. 數(shù)字編碼
屬性塊中的數(shù)字通過一種特別的方式進行了編碼。數(shù)字的長度是可變的,數(shù)
字的每一個字節(jié)的 第一個位決定了之后是否還有字節(jié)數(shù)據(jù)。圖7解釋了上一個例子當中的屬性id和長度字段。此外,屬性塊中的值數(shù)據(jù)是不需要編碼的。
figure 7. encoding of numbers
5.3.5. 反回放機制
s7commplus協(xié)議可以檢查到回放攻擊。為了發(fā)現(xiàn)回放攻擊,plc所發(fā)送響應消息的第25個字節(jié)是一個隨機數(shù)字,該字節(jié)數(shù)據(jù)用于檢測回放攻擊(圖8)。隨機數(shù)值在0x06和0x7f之間變化,這個字節(jié)稱為anti-replay challenge。tia portal會基于該challeng數(shù)值做一次響應,響應的數(shù)據(jù)包通過第24、29個字節(jié)來指定檢查值。檢查值的計算公式如下:
antireplaybyte = challenge + 0x80
figure 8. anti replay mechanim
之后所有的從tia端口發(fā)送給s7-1200的消息都需要在消息的第24位字使用anti-replay-byte。下圖灰色的屬性塊部分也需要出現(xiàn)在這些消息中。
figure 9. anti replay mechanism
5.3.6. 程序傳輸
為了傳輸用戶程序,需要使用到一種特定的消息(圖10)。每個消息傳輸一個pou。pou的類型也會因pou的不同而不同。塊號(the block number)指定了該pou的plc內(nèi)存位置。
figure 10. transferring the user program
此外,消息頭后面還會有幾個屬性塊。在s7上存儲有確切的字節(jié)碼元信息,這個元信息詳細說明需要的內(nèi)存空間、創(chuàng)建日期、塊號(block number)、所用語言、源代碼和保護屬性。tia portal也許會使用這些信息來驗證代碼的有效性。
5.3.7. 確定所需的消息
在用戶程序傳輸?shù)倪^程中,有幾個消息會進行交換,不過這個交換對于蠕蟲來說并不是強制的。這些無關(guān)的消息會增加蠕蟲的儲存空間,因此被忽略。圖11展示了一次有效感染所需的消息。通訊首先被初始化,為了避免重復的感染,蠕蟲首先測試目標并試圖下載一個自己的拷貝。在上傳代碼之前,需要暫停plc,然后傳遞程序,最后重啟plc。
figure 11. messages exchanged during infection
5.3.8. 實現(xiàn)
基于以上協(xié)議的分析,傳輸程序可能會在plc上被記錄、修改和重放。到此,所有所需的消息都已知曉。為了在蠕蟲中儲存消息,需要使用到靜態(tài)db pou,額外的dbs用來儲存臨時變量和收發(fā)緩沖區(qū)。
靜態(tài)db必須儲存感染所需所有消息。該db塊無法通過tia portal來生成,需要手動進行構(gòu)造。
figure 12. manual generation of the db
6. 啟動蠕蟲
當被傳達的蠕蟲代碼加入到運行于目標plc中的用戶程序中時。額外ob和所需的
dbs也需要加入。目標上的原始代碼是不能夠操作的,ob會被plc自動發(fā)現(xiàn)并且執(zhí)行。
figure 13. the worm is run as normal code
7. 惡意功能
根據(jù)蠕蟲的功能特性,我們可以實現(xiàn)一些不同的蠕蟲功能來闡述可能的危害性
7.1 c&c服務器
我們的蠕蟲需要連接到c&c 服務器。通信協(xié)議是基于tcp的,蠕蟲的各種功能可以通過c&c 服務器來觸發(fā)。
7.2 socks4代理服務
我們的蠕蟲可以作為一個socks4代理服務。一旦蠕蟲連接上了c&c 服務器,在plc網(wǎng)絡中任何新的客戶端的連接都通過的內(nèi)嵌sock4代理服務來啟動。
7.3 dos
plc執(zhí)行的時間超出循環(huán)上線,便會停止執(zhí)行。蠕蟲可以實現(xiàn)一個無線循環(huán)觸發(fā)這樣一種錯誤條件來達到dos的效果。
7.4 操作輸出
蠕蟲可以操控plc的任何輸出,利用pou poke,過程鏡像中的任何值都可以進行篡改。
8. 蠕蟲的探測、持久性與資源
8.1. 蠕蟲的探測
8.1.1. tia portal
tia portal可以驗證plc上的用戶程序,并且可以偵測到被篡改和被加入的pou(圖14)。被紅線框起來的是蠕蟲所用的pou。因為tia portal僅僅分析xml的源代碼,所以對pou的分析是不可能的。此外通過利用tia portal的bug中,蠕蟲會導致應用崩潰。
figure 14. tia portal exposes the worm
8.1.2. 停止plc
plc會在感染期間有大概10秒左右的時間是不工作的。在此期間原始的用戶程序不會運行。這種plc中斷可能會引起注意并且被記錄在plc之中。
8.1.3. 網(wǎng)絡流量
蠕蟲會在ics環(huán)境中產(chǎn)生不正常的流量。在掃面和感染階段,會發(fā)送很多可疑的數(shù)據(jù)包。
8.2. 持久性
8.2.1. 重新啟動與重新引導
蠕蟲是被儲存在plc中的。它成了用戶程序的一部分,所以即使在重啟和甚至是拔除電源的情況下都會存在。
8.2.2. 恢復出廠設(shè)置
tia端口可以觸發(fā)plc恢復出廠設(shè)置。這種情況下,所有的設(shè)置和用戶程序包括蠕蟲都會被清除。
8.2.3. 程序傳輸
我們的蠕蟲存儲在ob9999里面。如果這個pou被覆蓋住了,蠕蟲也就從plc上被刪除了。
8.3. 資源
8.3.1. 循環(huán)時間
循環(huán)上限是固定的,默認限制時間是150微秒。蠕蟲一定不能超過這個限制。在沒有用戶程序的情況下我們測量的plc循環(huán)時間是0微秒。在我們用蠕蟲感染了s7后,再測量了一遍得到最大的循環(huán)時間是7微秒(ms),這是循環(huán)上限的4.7%。
8.3.2. 儲存器
蠕蟲需要38.5kb的ram來存儲蠕蟲代碼和數(shù)據(jù)。其中9.0kb(23.3%)是惡意功能代碼。此外,還需要216.6kb的flash。表格1當中展示了不同型號機的儲存器可用空間。
table 1. memory footprint
9. 保護機制
plc s7-1200v3提供三種保護機制。我們會依次分析這些機制并確定這些機制是否能夠保護plc免收蠕蟲感染。這個分析報告是基于tia portal v11 sp2 update 5 和使用
firmware 3.0.2的s7-1200
9.1 專有技術(shù)保護(knowhow protection)
專有保護技術(shù)保護用戶程序不被未授權(quán)訪問。用密碼可以禁止非授權(quán)訪問和pou
篡改。專有保護技術(shù)通過屬性塊兒實現(xiàn)的,該塊在程序傳輸?shù)臅r候被寫入到plc中。在圖15中展示了該塊。flag表示該技術(shù)是否啟用。password hash 是基于密碼p使用如下公式產(chǎn)生的:
h = sha-1(encode_utf-16le(p))
figure 15. attribute block: knowhow protection
tia端口獲取該屬性塊。如果flag被設(shè)置了,tia portal在密碼不正確的情況下會禁止讀和寫相關(guān)程序塊。密碼是通過hash進行比對的。
為了避免代碼被訪問,plc上xml的源代碼是通過aes128-cbc加密的。圖16展示
了加密的源代碼。
figure 16. encrypted source code
9.1.1. 薄弱點
完整性保護缺失
即使在專有保護技術(shù)的存在下,塊還是有可能被讀取和修改。該保護特征是在tia portal中實現(xiàn)的,而不是在plc里面。使用自寫工具在plc中進行塊的讀寫是可以的,plc中擁有絕對的權(quán)限。甚至能夠直接重置專用保護技術(shù)flag,以至于可以通過tia portal來實現(xiàn)完全訪問。
aes-key可能被衍生
aes加密key可能來自于 password hash。 password hash可以通過自寫入軟件來讀取。key是采用如下公式計算得到的:
9.1.2. 從蠕蟲的角度分析保護功能
該特性不能夠防止蠕蟲攻擊
9.2. 防拷貝保護
防拷貝保護禁止將用戶程序拷貝到另外一個plc中。目標plc的序列號是存在于用戶程序中,以此防治tia portal將用戶程序傳輸?shù)狡渌鹥lc中。序列號被儲存在幾個獨立的屬性塊當中。
9.2.1. 更多薄弱點
完整性保護缺失(供應商在ssa-833048中已經(jīng)修復)指的是屬性塊的完整性未經(jīng)任何保護。存儲其中的序列號可能被修改甚至刪除。plc本身并不會檢查序列號,這種保護特性僅僅是在tia portal中實現(xiàn)的。
9.2.2. 蠕蟲的角度來分析防拷貝保護機制
該(防拷貝特性)特性也不能防止該蠕蟲的攻擊
9.3. 訪問保護
訪問保護可以防止用s7commplus協(xié)議軟件實現(xiàn)無密碼訪問plc。其有三種保護級別,表格2列出了不同的級別。
table 2. access based on the protection level
這些級別的驗證采用的是challenge響應機制。
9.3.1. 從蠕蟲的角度分析訪問保護機制
該訪問保護機制可以保護plc免受蠕蟲的攻擊。寫保護可以防止任何人篡改plc中的代碼。使用challenge響應機制來鑒定應該說是安全的。如果蠕蟲不知道密碼,那么就無法感染plc。但是在默認情況下訪問保護都是關(guān)閉的。
10. 結(jié)論
在這篇文章中我們闡述了plc蠕蟲實現(xiàn)的可行性。該蠕蟲代表了工控行業(yè)中的一種新型威脅。這樣的網(wǎng)絡在傳統(tǒng)觀念里都很好地受到保護而難以受外部攻擊。通過引入plc蠕蟲,plc成為了攻擊源,而不只是攻擊目標。受感染的plc可能通過工控組件提供商或者在組件傳輸過程中被摻入其中而進入到工控系統(tǒng)中。蠕蟲之后便可以在工控網(wǎng)絡內(nèi)部進行擴散,且不需要任何標準電腦和服務器。因此它不會被任何殺毒軟件做偵測到。此外工廠操作員也只有很少選擇來識別plc上的惡意軟件。
上一個:忘記win11開機密碼怎么辦(忘記win11開機密碼怎么辦恢復)
下一個:iphone14多少錢(蘋果iphone14大概價格)

隧道式單凍機的主要特點
中華茶道美學
怎樣用花卉美化大門
AC0603DR-071KL,國巨車規(guī)電阻0603 1KΩ ±0.5% 1/10W
IFM流量傳感器SA5000現(xiàn)貨銷售
你家的茶還好嗎
憑口感如何鑒別古樹茶?
茶葉在人體內(nèi)過程
分析FLIR工業(yè)相機的應用、特點及使用區(qū)別
超過質(zhì)保期的三偏心蝶閥售后維修-
十八禁 网站在线观看免费视频_2020av天堂网_一 级 黄 色 片免费网站_绝顶高潮合集Videos