http://bfqmb.cn 2016-09-21 15:27 來源:
隨著“互聯(lián)網(wǎng)+制造”的工業(yè)4.0概念的提出,獨(dú)立、隔離的傳統(tǒng)工控領(lǐng)域迎來了新的大數(shù)據(jù)互聯(lián)時代。與此同時,工控安全的問題,也隨著互聯(lián),被更廣泛的暴露在了Internet中。在Shodan、ZoomEye等搜索網(wǎng)站中,可以很容易的搜索到真實工控現(xiàn)場工控設(shè)備的IP地址,并且可以利用組態(tài)軟件訪問到對應(yīng)的設(shè)備。近幾年來,越來越多的工控設(shè)備被暴露在了互聯(lián)網(wǎng)上。
在Black Hat2011,Dillon Beresford等人在他們的報告《Exploiting Siemens Simatic S7 PLCs》中演示了如何通過西門子S7Comm協(xié)議的權(quán)限缺失漏洞來遠(yuǎn)程操作PLC。在Black Hat2015,Johannes Klick 等在他們的報告《Internet-facing PLCs – A New Back Orifice》中演示攻擊者如何通過代理,來發(fā)現(xiàn)內(nèi)網(wǎng)中更多的PLC設(shè)備。本文將展示的是一種新型的PLC蠕蟲病毒,該病毒可以不借助上位PC機(jī),僅通過PLC之間進(jìn)行互相傳播。該病毒的實現(xiàn)思路,適用于多個廠家的PLC設(shè)備,并且可以在一定規(guī)則范圍內(nèi)相互進(jìn)行傳播。本文采用西門子PLC舉例進(jìn)行說明。
西門子PLC簡介
PLC全稱為Programmable Logic Controller,即可編程邏輯控制器,是一種采用一類可編程的存儲器,用于其內(nèi)部存儲程序,執(zhí)行邏輯運(yùn)算、順序控制、定時、計數(shù)與算術(shù)操作等面向用戶的指令,并通過數(shù)字或模擬式輸入/輸出控制各種類型的機(jī)械或生產(chǎn)過程。西門子作為全球PLC市場占有率最高的PLC設(shè)備廠家,其產(chǎn)品系列主要包括S7-200、S7-300、S7-400、S7-1200、S7-1500等。其中S7-200、S7-300、S7-400系列的PLC采用早期的西門子私有協(xié)議S7Comm進(jìn)行通信。S7Comm協(xié)議已被研究者完全掌握,并且在github上可以下載到該協(xié)議的插件。S7-1200系列固件版本為V3.0以下的PLC采用西門子新一代的S7Comm-Plus協(xié)議進(jìn)行通信。該協(xié)議采用了一些特殊編碼規(guī)范,并且做了抗重放攻擊的防護(hù)。但是其安全防護(hù)仍然較弱,已被基本破解。S7-1200系列固件版本為V3.0以上,以及S7-1500系列的PLC,采用了最新的S7Comm-Plus協(xié)議,該協(xié)議對比之前S7Comm-Plus協(xié)議,采用了加密算法,目前仍未被研究透徹。
西門子PLC通過Step7以及WinCC軟件進(jìn)行組態(tài),目前最新版本為TIA Portal V13。其中使用Step7進(jìn)行下位機(jī)組態(tài),WinCC進(jìn)行上位機(jī)組態(tài)。
在Step7組態(tài)軟件中,用戶通過編寫POU程序塊來完成工業(yè)現(xiàn)場的控制以及工藝流程的實現(xiàn)。西門子POU程序塊包括:
OB(Organization Block ):組織塊,為用戶程序的入口程序塊
FB(Function Block):功能函數(shù)塊,實現(xiàn)一些封裝好的函數(shù)功能
FC(Function):函數(shù)塊,為用戶編寫的程序
DB(Data Block):數(shù)據(jù)塊,用來存放全局變量
SFB(System Function Block):系統(tǒng)功能函數(shù)庫,系統(tǒng)內(nèi)部封裝的函數(shù)塊
SFC(System Function):系統(tǒng)函數(shù)庫,系統(tǒng)內(nèi)部封裝的函數(shù)
Step7程序塊的組態(tài)語言包括LD(梯形圖),F(xiàn)BD(功能塊圖)、SCL(結(jié)構(gòu)化控制語言)、STL(語句列表)。
西門子PLC在進(jìn)行程序下裝的過程中,首先會在下裝前停止PLC的運(yùn)算,下裝程序完成后再重新啟動PLC。
病毒的實現(xiàn)
對于病毒的實現(xiàn)流程,首先選擇IP嘗試建立連接,如果連接建立成功,則檢查目標(biāo)PLC是否已被感染。如連接未建立成功,或目標(biāo)PLC已被感染,則選擇新IP重新嘗試建立連接。如目標(biāo)PLC未被感染,則停止目標(biāo)PLC,下裝病毒程序,最后重新啟動目標(biāo)PLC。流程如圖1所示。
病毒實現(xiàn)流程
尋找目標(biāo)
所有的西門子PLC通過102端口進(jìn)行TCP通信,因此可以通過嘗試建立102端口的TCP通信來進(jìn)行目標(biāo)的尋找。Step7組態(tài)軟件中提供了兩個FB塊,TCON以及TDISCON,如圖2所示。TCON用來建立TCP連接,其中REQ輸入管腳通過上升沿信號觸發(fā),CONNECT輸入管腳配置TCON建立連接的如對端IP、對端端口號,本機(jī)端口號,通信方式等相關(guān)參數(shù)。TDISCON用來斷掉TCP連接,REQ上升沿觸發(fā)。
圖3為嘗試建立連接的FC塊,首先使用TCON塊建立連接,如果建立成功,即輸出管腳DONE為TRUE時,則置狀態(tài)字con_state為20,繼續(xù)下一步病毒的傳播感染操作。如連續(xù)200次建立連接不成功,則置狀態(tài)字con_state為0。
使用TCON塊嘗試建立連接
如連接未成功建立或病毒傳播完成,即狀態(tài)字con_state為0時,則使用TDISCON做斷開連接操作,如果輸出管腳ERROR或輸出管腳DONE為TRUE時,將TCON輸入管腳CONNECT中的對端IP末位加一,并使用該新IP再次嘗試建立連接。實現(xiàn)過程如圖4所示。
使用TDISCON進(jìn)行連接的斷開并更改IP
成功建立連接后,首先判斷目標(biāo)PLC是否已經(jīng)感染該病毒,通過TSEND功能塊發(fā)送相關(guān)數(shù)據(jù)報文,并對返回的報文進(jìn)行判斷,如未被感染,則繼續(xù)執(zhí)行病毒的傳播過程,如已感染,則置狀態(tài)字con_state為0,重新更換IP嘗試建立連接。
檢測目標(biāo)PLC是否已感染病毒
傳播感染
正常情況下,博途軟件會對PLC進(jìn)行程序的下裝操作,而下裝過程正式利用了西門子私有的S7協(xié)議。在西門子PLC簡介章節(jié)中提到西門子S7Comm協(xié)議以及早期的S7Comm-Plus協(xié)議已可以被研究者熟悉利用。因此在傳播感染階段,可以根據(jù)S7協(xié)議的內(nèi)容,通過偽造博途軟件下裝程序的報文,可以實現(xiàn)PLC到PLC的程序傳輸操作。也就是說已感染病毒的PLC向目標(biāo)PLC發(fā)送下裝程序塊的報文,而目標(biāo)PLC識別到報文后,誤以為是博途軟件對其進(jìn)行下裝,最后會將報文中的相關(guān)功能塊存儲在PLC中。
Step7組態(tài)軟件中使用TSEND功能塊進(jìn)行數(shù)據(jù)的發(fā)送,使用TRCV功能塊進(jìn)行數(shù)據(jù)的接收,如圖6所示。在TSEND塊中,REQ輸入管腳上升沿觸發(fā),DATA為需要發(fā)送的數(shù)據(jù)區(qū)。在TRCV中,EN_R上升沿觸發(fā),DATA為接收數(shù)據(jù)的存儲區(qū),RCVD_LEN為實際接收到數(shù)據(jù)的長度。
發(fā)送及接收數(shù)據(jù)功能塊
在程序的發(fā)送過程中,需要滿足S7協(xié)議的相關(guān)通信時序以及報文格式。圖7所示為S7建立連接的過程。首先是TCP的三次握手,接下來建立COTP連接,建立完成后進(jìn)行S7協(xié)議的連接建立。建立成功后可以使用S7協(xié)議進(jìn)行啟停PLC、下裝程序、PLC中數(shù)據(jù)讀寫等正常操作。
S7協(xié)議通信時序
S7通信協(xié)議應(yīng)用層數(shù)據(jù)封裝模型如圖8所示,其中:
TCP:即傳輸控制協(xié)議,是一種面向連接(連接導(dǎo)向)的、可靠的、基于IP的傳輸層協(xié)議,在IETF的RFC 793標(biāo)準(zhǔn)中進(jìn)行定義。
ISO-ON-TCP:即基于TCP的ISO傳輸服務(wù),在在IETF的RFC1006標(biāo)準(zhǔn)中進(jìn)行說明。
ISO Transport protocol:即ISO傳輸協(xié)議,在ISO8073中進(jìn)行說明。
S7協(xié)議應(yīng)用層數(shù)據(jù)分布
圖9為下裝程序塊的S7Comm數(shù)據(jù)報文,其中0x32為S7Comm協(xié)議標(biāo)識符,Protocol Data Unit Reference為協(xié)議數(shù)據(jù)單元標(biāo)識符,在S7Comm協(xié)議中用作通信過程的時序標(biāo)記。Function標(biāo)識了該數(shù)據(jù)報文的功能。Data報文區(qū)為所對應(yīng)功能塊的內(nèi)容。
功能塊下裝數(shù)據(jù)報文
在博途軟件中,使用FC功能塊實現(xiàn)連接的建立,尋找新的目標(biāo)IP,判斷目標(biāo)PLC是否已被感染病毒,并進(jìn)行病毒程序的傳播等功能。使用一個DB數(shù)據(jù)塊存放FC功能塊中所用到的所有全局變量,使用另外一個DB數(shù)據(jù)塊存放病毒感染全部過程所需要的報文內(nèi)容。
激活
建立調(diào)用病毒程序的OB塊OB9999,并將其存植入到目標(biāo)PLC中,用以激活病毒,并進(jìn)行新的病毒傳播感染。西門子PLC在運(yùn)行時,會按照從OB1到OB9999的順序進(jìn)行調(diào)用。如圖10所示。
西門子PLC程序調(diào)用步驟
惡意功能的實現(xiàn) C&C服務(wù)器 一旦PLC被感染病毒,會基于TCP主動去連接C&C服務(wù)器。通過C&C服務(wù)器,可以遠(yuǎn)程控制PLC,包括PLC的啟停,輸出值的改變等。 Socks4代理 一旦PLC被病毒感染,在局域網(wǎng)中的其他PLC,可以通過Socks4代理連接到C&C服務(wù)器。 拒絕服務(wù)攻擊 可以向PLC中下裝例如死循環(huán)、除零或者負(fù)數(shù)開方的程序,讓PLC停止工作。 改變輸出值 可以通過編寫正常的PLC程序,來改變輸出值,進(jìn)而影響現(xiàn)場設(shè)備的正常運(yùn)行。
檢測與防護(hù)病毒的檢測 利用博途軟件 博途軟件提供了PLC程序在線與離線差異的檢測功能,如圖11所示。程序塊后面的綠色圓圈表示在線程序與離線程序一致,藍(lán)色與橘黃色組成的圓形表示在線程序與離線程序不一致。
博途軟件對程序在線離線一致性的檢測
觀察PLC的狀態(tài)燈 下裝程序的過程中會導(dǎo)致PLC的停止與啟動,在此期間,所有模擬量數(shù)值與開關(guān)量狀態(tài)會保持不變。然后該時間僅有幾秒鐘,操作員可能會忽視該細(xì)節(jié)。 使用工控漏掃設(shè)備 使用工控漏掃設(shè)備對PLC進(jìn)行掃描,由于病毒程序必須利用較大編號的OB塊。因此掃描較大編號的OB塊可以對病毒進(jìn)行檢測。 檢測網(wǎng)絡(luò) 在病毒進(jìn)行傳播的過程中,網(wǎng)絡(luò)中會出現(xiàn)PLC與PLC通信的數(shù)據(jù)報文,根據(jù)該異常報文可以檢測出病毒測存在。 病毒的存活性 重啟PLC 病毒為正常的程序塊,因此重啟PLC后,該病毒仍存在于PLC中,并且正常運(yùn)行。 恢復(fù)到出廠設(shè)置 恢復(fù)到出廠設(shè)置會清空PLC中的所有程序,因此病毒程序連同正常程序一起會被清空。 下裝程序
如果有正常的OB9999組織塊,或者與病毒同編號的FC塊、DB塊的下裝,則病毒會被新下裝的程序覆蓋,并且不會再次被感染
病毒的防護(hù) 設(shè)置權(quán)限密碼 工控廠商對于自己產(chǎn)品,在協(xié)議層設(shè)置權(quán)限密碼,沒有密碼的清空下,不可以利用協(xié)議來與PLC建立通信連接。 在工控系統(tǒng)中布置IDS/審計系統(tǒng) 布置IDS/審計系統(tǒng),通過工控協(xié)議特征值的采集、分析與識別,如發(fā)現(xiàn)異常數(shù)據(jù)包,則記錄日志或報警 布置工控防火墻 通過工控防火墻,對異常數(shù)據(jù)包進(jìn)行檢測以及隔離防護(hù)