PLC-導火線:工控PLC蠕蟲的實現
PLC-導火線:工控PLC蠕蟲的實現
原文:PLC-Blaster:A Worm Living Solely in the PLC
作者:Ralf Spenneberg, Maik Brüggemann, Hendrik Schwartke
翻譯:gjden
本文最初發表於看雪論壇、GDA公眾號,剛玩兒知乎沒多久,打算把一些覺得還不錯的文章轉移過來。
PLC-導火線:工控PLC蠕蟲的實現-GDA
PLC-導火線:工控PLC蠕蟲的實現-KANXUE
摘要:眾說周知,工業生產過程是通過可編程邏輯控制器(PLC)來控制的。 現在市場上許多PLC都配置了乙太網口並且可以用IP進行通信。 我們將以西門子 SIMATIC S7-1200機器為例展示一個蠕蟲範例。此蠕蟲不需要依賴PC電腦去擴散。該蠕蟲僅僅活躍並運行在PLC當中。它可以通過網路掃描來尋找新的目標(新的PLC),然後攻擊這些目標並將自身拷貝到這些新的PLC中,而且目標PLC上運行原主程序不會發生任何改變。這些PLC目標一旦感染該蠕蟲後會再次進行掃描感染。我們將分析蠕蟲對目標的影響以及提出可能的緩解技術。
1. 介紹
IT系統在當今工業生產發展至關重要的一部分。 可以說,沒有現代化的通信網路,就不可能有現代化的工業生產。然而不幸的是,正由於工業系統對當今IT系統和通信網路的依賴,使得用戶也暴露於被攻擊的危險之中,而這早已是IT界久知的問題。IT黑客攻擊可能對工業系統造成多種傷害。比如他們可以造成工業生產的中斷以及高額的經濟損失,與此同時還可能對生活環境以及生命健康造成負面影響。其攻擊的威力在STUXNET蠕蟲上得到了充分的展示。西門子的可編程式控制制器(PLC)受到惡意篡改以阻礙伊朗核燃料鈾濃縮。通過利用微軟操作系統漏洞,該蠕蟲感染進入到鈾濃縮工廠的電腦當中,PLC的軟體被惡意篡改以摧毀鈾濃縮離心機。該蠕蟲需要一台PC電腦來進行傳播並且通過PC電腦來攻擊PLC。這篇文章將將闡述一種可以在PLC之間傳播的蠕蟲。不需要任何PC電腦。蠕蟲可能通過一個已經被感染過的PLC而被引入到工業工廠中,蠕蟲接下來便會通過自我複製來感染到其他PLC中,並且在修改目標PLC並執行感染時添加到PLC用戶程序中…。這篇文章描述的蠕蟲是基於西門子 SIMATIC S7-1200v3,該蠕蟲通過結構化文本(ST)編寫而成,該語言是一種用於開發PLC軟體的編程語言。
2. 相關工作
2015年在美國BlackHat大會上,Klick公司展示了一款在PLC上運行的惡意軟體。他們使用PLC的一個通信特徵實現了代理服務。我們將用同樣的通信特性來實現了一個可以傳送一個蠕蟲程序的協議。通過使用該協議,該蠕蟲可以從一個PLC直接傳到另一個PLC中。這個蠕蟲不需要更多系統去支持。我們沒有用更加聞名的SIMATIC S7-300,取而代之的是,我們的工作成果基於新的S7-1200v3。PLC使用的協議也與舊版不同。該文章也將會介紹這種新型的協議。
3. PLC 體系結構
PLC使用簡單系統結構構建而成。他們基於中央處理器(CPU)模塊,加上數字輸入和輸出的模塊組成。CPU處理PLC操作系統以及運行用戶程序。此外CPU還負責與其他設備通訊以及管理過程圖(Process image)。
過程圖(Process image)儲存著所有的輸入和輸出的狀態。用戶程序不能直接操作物理的輸入輸出,而是通過操作過程圖像而實現的。用戶程序的運行是一個循環。每次循環的起始和結束的時候,CPU會刷新過程圖像。循環上限指的是循環時間。如果(一個循環運行的時間)超過循環上限時,PLC會停止用戶程序運行並拋出一個異常。
Figure 1.Zyklus eines PLCs
用戶程序通過POU(程序組織單元)構造而成。這些單元(程序組織單元)包含了控制PLC的使用說明,因而可控制工業生產。SIMATIC S7-1200支持以下的POU:
· Organisation block (OB): 用戶程序主入口
· Data block (DB): 全局存儲器
· Function (FC): 功能
· Function block (FB): 有穩固局部儲存器的功能
此外有幾個西門子提供的給用戶自定義的POU功能也可找到。這篇文章運用了系統POU TCON和TDISCON。 使用這些POU,PLC可以初始化或者銷毀任意系統的TCP連接。也可以通過TRCV和TSEND來接收和發送緩衝區數據。
4. 電腦蠕蟲
電腦蠕蟲從1988年就已經出現並且是惡意軟體中有名的一種。蠕蟲多種但都基本架構相同。所有的蠕蟲攻擊都可以歸為一下幾個階段:可能目標的搜索,感染目標,在目標上執行,添加惡意功能。在PLC上蠕蟲也同樣支持這些工功能。這篇文章將展示每個必須組件的實現方法。
5. 在S71200上實現一個蠕蟲
5.1 體系結構
這個蠕蟲的編寫與其他限制性蠕蟲軟體一樣。在開發過程中,必須滿足特定的PLC的限制條件,尤其是循環上限。蠕蟲每幾微秒就必須中斷其執行,並在接下來的每次循環中能夠繼續執行。為了滿足這個要求,我們通過狀態機來設計該蠕蟲。當前的狀態被存在全局變數裡面,在每次循環開始開始時,蠕蟲的相關代碼將會被調用。所以永遠不會超過循環上限的時間。
如圖2中所展示的步驟,蠕蟲首先初始化一個連接來連接可能目標。一旦建立了連接,蠕蟲會檢測目標是否已經被感染,如果沒有感染,蠕蟲將暫停目標機上的用戶主程序的執行,使其能夠傳輸自己的代碼。用戶程序暫停後蠕蟲將自己複製到目標PLC上,完成後啟動目標PLC,接下來蠕蟲再測試下一個可能的目標。
Figure 2. Execution sequence of theworm
5.2 目標偵查
蠕蟲先掃描可能的目標,西門子的PLC可以通過102/tcp埠來識別。這個埠僅僅能夠被外部防火牆關閉,並且其他普通的服務不會使用這個埠。
S7-1200用POU TCON管理TCP連接。這個POU的的用法在圖3的第3行進行了展示。任意一個IP地址和埠在第9行代碼中被傳遞。一旦POU被調用,PLC會試圖建立連接,並且這兩者是非同步發生的。在之後的循環當中會對當前的連接狀態進行驗證。返回值DONE(Zeile 5)信號表示該連接是否被建立,如果為true,繼續感染。如果IP地址和埠無法找到是不會有錯誤提示的。蠕蟲需要在每次循環中通過遞增計數器來檢測超時。
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個循環後沒有建立連接,蠕蟲會繼續執行在圖4當中的代碼。最然沒有建立任何連接,但為了下一次連接的建立,必須調用POU TDISCON來釋放資源。在第13行中,IP地址是遞增的,因而所有的/24子網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) MOD255;
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(埠)傳輸到PLC中。蠕蟲模仿TIA-Portal並實現了私有的Siemens協議。當我們在自己系統上分析這個協議時,發現Thomas Wiens的Wireshark plugin是可以解析這種協議的。
5.3.1 傳輸協議
文章的剩下部分主要講解這種被稱為S7CommPlus的私有協議。這是一個使用TPKT [6] 和ISO8073 [7]標準制定的一個二進位協議。正常情況下這兩個協議都使用 102/tcp埠。
S7CommPlus主要特性:
· PLC的配置
· 啟動和停止PLC
· 讀寫過程變數
· 程序傳輸(上傳和下載)
· 調試
· 提供調試信息
· 警告
5.3.2. 消息
S7CommPlus所使用的每個消息都有著相似的結構。圖5展示了連接中的第一個消息。TIA埠通過發送該消息來初始化一個連接。通用的結構接下來會進行解釋。前兩個域表示的是TPKT和ISO8073協議。他們的內容在相應的文檔中都有解釋。之後的0x72位元組表示S7CommPlus信息的起始,不同的協議會有不同的版本號,長度域不受幀邊界的限制。如果幀的邊界丟失,更多的信息會附在附加的信息的後面。緊跟長度域後面的是類型域,子類型欄位進一步指定了該消息。序列號是隨著每個消息增加而遞增的。其他的數據是在特定屬性塊中傳輸的。
Figure 5. S7CommPlus messagestructure
5.3.3. 屬性塊
真正的數據是在屬性塊中。圖6展示了上面例子中的第一個標誌塊。每個屬性塊都是以0xA3開始,該塊包含一個字元串。完整的字元串包含長度和字元串值。
Figure 6. Attribute block
5.3.4. 數字編碼
屬性塊中的數字通過一種特別的方式進行了編碼。數字的長度是可變的,數字的每一個位元組的 第一個位決定了之後是否還有位元組數據。圖7解釋了上一個例子當中的屬性ID和長度欄位。此外,屬性塊中的值數據是不需要編碼的。
Figure 7. Encoding of numbers
5.3.5. 反回放機制
S7CommPlus協議可以檢查到回放攻擊。為了發現回放攻擊,PLC所發送響應消息的第25個位元組是一個隨機數字,該位元組數據用於檢測回放攻擊(圖8)。隨機數值在0x06和0x7f之間變化,這個位元組稱為anti-replay challenge。
TIA portal會基於該challeng數值做一次響應,響應的數據包通過第24、29個位元組來指定檢查值。檢查值的計算公式如下:
antireplaybyte = challenge + 0x80
Figure 8. Anti replay mechanim
之後所有的從TIA埠發送給S7-1200的消息都需要在消息的第24位字使用anti-replay-byte。下圖灰色的屬性塊部分也需要出現在這些消息中。
Figure 9. Anti replay Mechanism
5.3.6. 程序傳輸
為了傳輸用戶程序,需要使用到一種特定的消息(圖10)。每個消息傳輸一個POU。POU的類型也會因POU的不同而不同。塊號(The block number)指定了該POU的PLC內存位置。
Figure 10. Transferring the userprogram
此外,消息頭後面還會有幾個屬性塊。在S7上存儲有確切的位元組碼元信息,這個元信息詳細說明需要的內存空間、創建日期、塊號(block number)、所用語言、源代碼和保護屬性。TIA portal也許會使用這些信息來驗證代碼的有效性。
5.3.7. 確定所需的消息
在用戶程序傳輸的過程中,有幾個消息會進行交換,不過這個交換對於蠕蟲來說並不是強制的。這些無關的消息會增加蠕蟲的儲存空間,因此被忽略。
圖11展示了一次有效感染所需的消息。通訊首先被初始化,為了避免重複的感染,蠕蟲首先測試目標並試圖下載一個自己的拷貝。在上傳代碼之前,需要暫停PLC,然後傳遞程序,最後重啟PLC。
Figure 11. Messages exchangedduring infection
5.3.8. 實現
基於以上協議的分析,傳輸程序可能會在PLC上被記錄、修改和重放。到此,所有所需的消息都已知曉。為了在蠕蟲中儲存消息,需要使用到靜態DB POU,額外的DBs用來儲存臨時變數和收發緩衝區。
靜態DB必須儲存感染所需所有消息。該DB塊無法通過TIA portal來生成,需要手動進行構造。
Figure 12. Manual generation of the DB
6. 啟動蠕蟲
當被傳達的蠕蟲代碼加入到運行於目標PLC中的用戶程序中時。額外OB和所需的DBs也需要加入。目標上的原始代碼是不能夠操作的,OB會被PLC自動發現並且執行。
Figure 13. The worm is run as normal code
7. 惡意功能
根據蠕蟲的功能特性,我們可以實現一些不同的蠕蟲功能來闡述可能的危害性
7.1 C&C伺服器
我們的蠕蟲需要連接到C&C 伺服器。通信協議是基於TCP的,蠕蟲的各種功能可以通過C&C 伺服器來觸發。
7.2 Socks4代理服務
我們的蠕蟲可以作為一個Socks4代理服務。一旦蠕蟲連接上了C&C 伺服器,在PLC網路中任何新的客戶端的連接都通過的內嵌Sock4代理服務來啟動。
7.3 DOS
PLC執行的時間超出循環上線,便會停止執行。蠕蟲可以實現一個無線循環觸發這樣一種錯誤條件來達到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 theworm
8.1.2. 停止PLC
PLC會在感染期間有大概10秒左右的時間是不工作的。在此期間原始的用戶程序不會運行。這種PLC中斷可能會引起注意並且被記錄在PLC之中。
8.1.3. 網路流量
蠕蟲會在ICS環境中產生不正常的流量。在掃面和感染階段,會發送很多可疑的數據包。
8.2. 持久性
8.2.1. 重新啟動與重新引導
蠕蟲是被儲存在PLC中的。它成了用戶程序的一部分,所以即使在重啟和甚至是拔除電源的情況下都會存在。
8.2.2. 恢復出廠設置
TIA埠可以觸發PLC恢復出廠設置。這種情況下,所有的設置和用戶程序包括蠕蟲都會被清除。
8.2.3. 程序傳輸
我們的蠕蟲存儲在OB9999裡面。如果這個POU被覆蓋住了,蠕蟲也就從PLC上被刪除了。
8.3. 資源
8.3.1. 循環時間
循環上限是固定的,默認限制時間是150微秒。蠕蟲一定不能超過這個限制。在沒有用戶程序的情況下我們測量的PLC循環時間是0微秒。在我們用蠕蟲感染了S7後,再測量了一遍得到最大的循環時間是7微秒(ms),這是循環上限的4.7%。
8.3.2. 儲存器
蠕蟲需要38.5KB的RAM來存儲蠕蟲代碼和數據。其中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 專有技術保護(Knowhow Protection)
專有保護技術保護用戶程序不被未授權訪問。用密碼可以禁止非授權訪問和POU篡改。
專有保護技術通過屬性塊兒實現的,該塊在程序傳輸的時候被寫入到PLC中。在圖15中展示了該塊。Flag表示該技術是否啟用。password hash 是基於密碼P使用如下公式產生的:
H = sha-1(encode_utf-16le(P))
Figure 15. Attribute block: knowhowprotection
TIA埠獲取該屬性塊。如果flag被設置了,TIA portal在密碼不正確的情況下會禁止讀和寫相關程序塊。密碼是通過hash進行比對的。
為了避免代碼被訪問,PLC上XML的源代碼是通過AES128-CBC加密的。圖16展示了加密的源代碼。
Figure 16. Encrypted source code
9.1.1. 薄弱點
完整性保護缺失
即使在專有保護技術的存在下,塊還是有可能被讀取和修改。該保護特徵是在TIA portal中實現的,而不是在PLC裡面。使用自寫工具在PLC中進行塊的讀寫是可以的,PLC中擁有絕對的許可權。甚至能夠直接重置專用保護技術flag,以至於可以通過TIA portal來實現完全訪問。
AES-key可能被衍生
AES加密key可能來自於 password hash。 password hash可以通過自寫入軟體來讀取。Key是採用如下公式計算得到的:
.
9.1.2. 從蠕蟲的角度分析保護功能
該特性不能夠防止蠕蟲攻擊
9.2. 防拷貝保護
防拷貝保護禁止將用戶程序拷貝到另外一個PLC中。目標PLC的序列號是存在於用戶程序中,以此防治TIA Portal將用戶程序傳輸到其他PLC中。序列號被儲存在幾個獨立的屬性塊當中。
9.2.1. 更多薄弱點
完整性保護缺失(供應商在SSA-833048中已經修復)指的是屬性塊的完整性未經任何保護。存儲其中的序列號可能被修改甚至刪除。PLC本身並不會檢查序列號,這種保護特性僅僅是在TIA portal中實現的。
9.2.2. 蠕蟲的角度來分析防拷貝保護機制
該(防拷貝特性)特性也不能防止該蠕蟲的攻擊
9.3. 訪問保護
訪問保護可以防止用S7CommPlus協議軟體實現無密碼訪問PLC。其有三種保護級別,表格2列出了不同的級別。
Table 2.Access based on the protection level
這些級別的驗證採用的是challenge響應機制【8】。
9.3.1. 從蠕蟲的角度分析訪問保護機制
該訪問保護機制可以保護PLC免受蠕蟲的攻擊。防寫可以防止任何人篡改PLC中的代碼。使用challenge響應機制來鑒定應該說是安全的。如果蠕蟲不知道密碼,那麼就無法感染PLC。但是在默認情況下訪問保護都是關閉的。
10. 結論
在這篇文章中我們闡述了PLC蠕蟲實現的可行性。該蠕蟲代表了工控行業中的一種新型威脅。這樣的網路在傳統觀念里都很好地受到保護而難以受外部攻擊。通過引入PLC蠕蟲,PLC成為了攻擊源,而不只是攻擊目標。受感染的PLC可能通過工控組件提供商或者在組件傳輸過程中被摻入其中而進入到工控系統中。蠕蟲之後便可以在工控網路內部進行擴散,且不需要任何標準電腦和伺服器。因此它不會被任何殺毒軟體做偵測到。此外工廠操作員也只有很少選擇來識別PLC上的惡意軟體。
參考:
[1] Eric ChienNicolas Falliere, Liam O Murchu. W32.Stuxnet Dossier. Last accessed
Forbidden - Symantec Corp.
security_response/whitepapers/w32_stuxnet_dossier.pdfon
06.02.2016,2011.
[2] JohannesKlick u.a. Internet-facing PLCs - A New Back Orifice.
https://www.blackhat.com/docs/us-15/materials/
us-15-Klick-Internet-Facing-PLCs-A-New-Back-Orifice-wp.
pdf, 2015.
[3]pressetext.deutschland. Malware-Jubil?um: 20 Jahre Internet-Würmer.http://www.
http://pressetext.com/news/20081101001,2008.
[4] NicholasWeaver u.a. A Taxonomy of Computer Worms. https://www1.icsi.
http://berkeley.edu/~nweaver/papers/2003-taxonomy.pdf,2003.
[5] thomas_v2.S7comm Wireshark dissector plugin. Download, Develop and Publish Free Open Source Software
projects/s7commwireshark/files/.
[6] Dwight E.Cass Marshall T. Rose. ISO Transport Service on top of the TCP. Last accessed
https://tools.ietf.org/html/rfc1006on21.02.2016, 1987.
[7]International Organization for Standardization. Connection oriented transportprotocol.
ISO Std. 8073,1988.
[8]SCADAStrangeLove. S4x13 Releases: S7 password offline bruteforce tool. http:
//http://scadastrangelove.blogspot.de/2013/01/s7brut.html,2013.
推薦閱讀:
※DataLogic掃碼槍的配置及如何連接PLC串口模塊?(內附圖紙)
TAG:可编程逻辑控制器PLC | 工控 | 计算机病毒 |