您所在的位置: 首頁 >
新聞資訊 >
技術(shù)前沿 >
一種新的針對S7-1500 PLC注入攻擊
可編程邏輯控制器(PLC)越來越多地連接和集成到工業(yè)物聯(lián)網(wǎng)(IIoT)中,以實(shí)現(xiàn)更好的網(wǎng)絡(luò)連接和更簡化的控制流程。但事實(shí)上,這也給其帶來了安全挑戰(zhàn),并使其面臨各種針對此類設(shè)備所控制的物理過程的網(wǎng)絡(luò)攻擊。在這項(xiàng)工作中,我們調(diào)查了最新的S7 PLC是否在設(shè)計(jì)上易受攻擊,是否可以被利用。與研究界中存在的典型控制邏輯注入攻擊不同,該攻擊要求對手在攻擊過程中保持在線,本文介紹了一種新的漏洞利用策略,該策略旨允許攻擊者既不連接到目標(biāo)也未連接到目標(biāo)所在網(wǎng)絡(luò)中的情況下,仍然可以破壞PLC所控制的物理過程。攻擊方法由兩個(gè)步驟組成:1)一旦攻擊者獲得對暴露的PLC的訪問權(quán)限,就用惡意的ToD(Time-of-Day)中斷塊篡改PLC;2)當(dāng)攻擊者斷開與系統(tǒng)網(wǎng)絡(luò)的連接時(shí),在稍后的時(shí)間觸發(fā)中斷。
2022年,德國研究機(jī)構(gòu)IHP的Wael Alsabbagh研究員發(fā)表了一篇文章,介紹針對當(dāng)時(shí)較新固件版本v2.9.2的S7-1500PLC的ToD注入攻擊,對文章了進(jìn)行閱讀并分將精華部分享之,有誤之處請指正。
0x01 概述和相關(guān)工作
最近針對ICS系統(tǒng)的威脅之一是控制邏輯注入攻擊,這種攻擊涉及通過使用其工程軟件修改目標(biāo)PLC上運(yùn)行的原始控制邏輯,通常采用中間人方法,這類攻擊中利用的主要漏洞是PLC協(xié)議中缺少身份驗(yàn)證措施。ICS供應(yīng)商通過為其PLC提供密碼來應(yīng)對這種威脅,以保護(hù)控制邏輯免受未經(jīng)授權(quán)的訪問,即,每當(dāng)ICS管理員試圖訪問在PLC中運(yùn)行的控制邏輯時(shí),設(shè)備首先需要認(rèn)證以允許他讀/寫代碼。這通常是通過專有認(rèn)證協(xié)議完成的。但是,這種解決方案并不能完全防止控制器受到損害。先前的學(xué)術(shù)成果已成功地繞過了身份驗(yàn)證,并訪問了不同密碼保護(hù)的PLC中的控制邏輯。上述論文的作者討論了繞過身份驗(yàn)證的兩種主要方法:一種是提取密碼的哈希,然后將其推回PLC(稱為重放攻擊),另一種是使用“純文本密碼、編碼文本密碼”對的代表性列表對每個(gè)字節(jié)進(jìn)行離線暴力破解??偟膩碚f,僅通過密碼驗(yàn)證來保護(hù)控制邏輯失敗了,攻擊者仍然能夠訪問PLC的程序并操縱由暴露的設(shè)備控制的物理進(jìn)程。
控制邏輯注入攻擊有兩種類型:傳統(tǒng)的控制邏輯注入攻擊和固件注入攻擊。然而,在真實(shí)的ICS環(huán)境中,感染PLC固件將是一項(xiàng)具有挑戰(zhàn)性的任務(wù),因?yàn)榇蠖鄶?shù)PLC供應(yīng)商通過加密方法(如數(shù)字簽名)或僅允許通過本地訪問(如SD卡和USB)進(jìn)行固件更新來保護(hù)其PLC免受未經(jīng)授權(quán)的固件更新。本文不涉及固件注入,只關(guān)注傳統(tǒng)的控制邏輯注入攻擊。在下文中,我們將現(xiàn)有的旨在破壞物理過程的注入攻擊分為兩類:
A、在線攻擊物理過程
該組的攻擊旨在通過使用其工程軟件來修改原始控制邏輯程序。惡意代碼成功注入后,受感染設(shè)備控制的物理進(jìn)程立即受到影響。下圖示意了攻擊順序:
最著名的此類攻擊是2010年對伊朗核設(shè)施進(jìn)行的一次攻擊,名為“震網(wǎng)”(Stuxnet),目的是破壞鈾濃縮工廠的離心機(jī)。Stuxnet攻擊使用Windows PC攻擊連接到變頻驅(qū)動器的西門子S7-300和S7-400 PLC,它會感染PLC的控制邏輯,以監(jiān)控所連接電機(jī)的頻率,如果頻率在一定范圍內(nèi)(即807 Hz和1210 Hz),則會發(fā)起攻擊。2015年,克里克等人在不中斷服務(wù)的情況下,將惡意軟件注入SIMATIC PLC的控制邏輯。作者表明,只要代碼由MC7字節(jié)碼組成,有權(quán)訪問PLC的攻擊者就可以下載和上傳代碼。在后續(xù)工作中,Spenneberg等人介紹了一種PLC蠕蟲,蠕蟲在內(nèi)部從一個(gè)PLC傳播到其他目標(biāo)PLC.在感染階段,蠕蟲會掃描網(wǎng)絡(luò)以尋找新的目標(biāo)PLC。另一論文中介紹了用梯形邏輯或兼容語言之一編寫的梯形邏輯炸彈惡意軟件,這種惡意軟件由攻擊者插入到PLC上的現(xiàn)有控制邏輯中。一組研究人員演示了對PLC控制邏輯的遠(yuǎn)程攻擊。他們能夠感染PLC,并將感染隱藏在控制中心的工程軟件中。他們對施耐德電氣Modicon M221及其供應(yīng)商提供的工程軟件SoMachine-Basic實(shí)施了攻擊。Lei等人演示了一種攻擊,它可以繞過西門子SIMATIC S7-1200 PLC使用的S7CommPlus協(xié)議的安全機(jī)制。作者首先使用Wireshark軟件分析了TIA Portal軟件與S7 PLC之間的通信,然后使用反向調(diào)試軟件WinDbg4破解了S7CommPlus協(xié)議的加密機(jī)制。之后,他們演示了兩次攻擊。首先,執(zhí)行重放攻擊以遠(yuǎn)程啟動和停止PLC.在第二個(gè)攻擊場景中,作者操縱受害者的輸入和輸出值,對受感染PLC控制的物理進(jìn)程造成嚴(yán)重破壞。2021年,研究人員表明S7-300 PLC易受此類攻擊,并證明利用PLC中運(yùn)行的控制邏輯是可行的。在他們破壞了PLC的安全措施后,他們進(jìn)行了一次成功的注入攻擊,并通過使用一個(gè)假冒的PLC來模擬真正的受感染設(shè)備,從而使工程軟件無法發(fā)現(xiàn)他們的攻擊。Rogue7背后的研究能夠創(chuàng)建一個(gè)仿冒的工程站,該工程站可以偽裝成S7 PLC的TIA門戶,并注入任何對攻擊者有利的消息。通過了解加密消息是如何交換的,他們設(shè)法將代碼隱藏在用戶內(nèi)存中,這對TIA門戶工程來說是不可見的。
上面提到的所有攻擊都是有限的,其要求攻擊者能夠連接到目標(biāo)PLC,這增加了被ICS操作員事先發(fā)現(xiàn)或被安全措施檢測到的可能性。
B、離線攻擊物理過程
這一類中的攻擊與前一類中提到的攻擊非常相似,不同之處在于,攻擊者的目標(biāo)不是在獲得對目標(biāo)設(shè)備的訪問后立即攻擊物理進(jìn)程。這意味著,一旦他獲得了暴露PLC的訪問權(quán)限,便可立即向PLC中注入惡意代碼,然后關(guān)閉與目標(biāo)的任何實(shí)時(shí)連接,將他的代碼保留在PLC的內(nèi)存中,處于空閑模式。之后,激活他的程序并在他希望的稍后時(shí)間甚至在沒有連接到系統(tǒng)網(wǎng)絡(luò)的情況下?lián)p害現(xiàn)場物理過程,如下示意圖:
我們所知,只有少數(shù)討論這一新威脅的學(xué)術(shù)成果發(fā)表。Serhane等人專注于梯形邏輯代碼漏洞和不良代碼實(shí)踐,這些漏洞和不良代碼實(shí)踐可能成為錯(cuò)誤的根本原因,并隨后被攻擊者利用。他們表示,攻擊者可以生成不確定的波動輸出變量,例如,執(zhí)行兩個(gè)計(jì)時(shí)器來控制相同的輸出值可能會導(dǎo)致競爭條件。這種情況可能會對受控設(shè)備造成嚴(yán)重?fù)p壞,類似于Stuxnet作者指出的另一種情況是,高級的攻擊者也可以繞過某些函數(shù),手動將某些操作數(shù)設(shè)置為所需的值,并應(yīng)用空分支或跳轉(zhuǎn)。為了實(shí)現(xiàn)隱秘的修改,攻擊者可以使用數(shù)組指令或用戶定義的指令,來記錄插入的關(guān)鍵參數(shù)和值。他們還討論了攻擊者可以通過跳轉(zhuǎn)應(yīng)用無限循環(huán),并使用嵌套計(jì)時(shí)器和跳轉(zhuǎn)僅在特定時(shí)間觸發(fā)攻擊。在我們的前一篇論文中,我們提出了一種新的方法,該方法基于向目標(biāo)PLC注入時(shí)間中斷代碼,它在攻擊者設(shè)置的時(shí)間中斷控制邏輯的執(zhí)行序列。我們的評估結(jié)果證明,即使與目標(biāo)系統(tǒng)斷開連接,攻擊者也可以混淆物理過程。雖然我們的研究工作只在一臺舊的S7-300 PLC上進(jìn)行了測試,并且只是為了迫使PLC進(jìn)入停止模式,但攻擊是成功的,并設(shè)法中斷了在修補(bǔ)的PLC中運(yùn)行的原始控制邏輯代碼的執(zhí)行。這種攻擊比在線攻擊更嚴(yán)重,因?yàn)镻LC在數(shù)小時(shí)、數(shù)天、數(shù)周、數(shù)月甚至數(shù)年內(nèi)一直正確執(zhí)行原始控制邏輯,而不會被中斷,直到攻擊者設(shè)定的那一刻攻擊才會發(fā)生。揭露這種攻擊的唯一現(xiàn)實(shí)方法是,ICS操作員從PLC請求程序,并將受感染設(shè)備中運(yùn)行的在線代碼與他在工程站上的離線代碼進(jìn)行比較。
0x02 S7 PLC
西門子生產(chǎn)SIMATIC S7系列中的多條PLC產(chǎn)品線,例如S7-300、S7-400、S7-1200和S7-1500。它們都具有相同的體系結(jié)構(gòu)。下圖描繪了S7 PLC的標(biāo)準(zhǔn)架構(gòu),其包括輸入和輸出模塊、電源以及諸如隨機(jī)存取存儲器(RAM)和電可擦除可編程只讀存儲器(EEPROM)的存儲器。稱為操作系統(tǒng)(OS)的固件以及用戶專用程序存儲在EEPROM中。傳感器、開關(guān)、繼電器、閥門等輸入輸出設(shè)備與輸入輸出模塊連接。
PLC連接到物理過程,輸入設(shè)備將進(jìn)程的當(dāng)前狀態(tài)提供給PLC,PLC通過其控制邏輯對其進(jìn)行處理,并通過輸出設(shè)備相應(yīng)地控制物理過程。S7 PLC運(yùn)行的控制邏輯被編程并編譯為代碼的較低表示,即分別為S7-300/S7-400或S7-1200/S7-1500 PLC的MC7或MC7+字節(jié)碼。工程師站編譯代碼后,通過西門子S7-300/S7-400或S7-1200/S71500 PLC的S7Comm或S7CommPlus協(xié)議,將MC7/MC7+格式的代碼塊下載并安裝到PLC中。然后,S7 PLC中的MC7/MC7+虛擬機(jī)將分配代碼塊,解釋并執(zhí)行字節(jié)碼。
西門子PLC運(yùn)行實(shí)時(shí)操作系統(tǒng),啟動周期時(shí)間監(jiān)控,此后,OS循環(huán)通過如下圖所示的四個(gè)步驟。在第一步中,CPU將輸出的過程圖像的值復(fù)制到輸出模塊;在第二步中,CPU讀取輸入模塊的狀態(tài)并更新輸入值的過程圖像。在第三步驟中,用戶程序在持續(xù)時(shí)間為1ms(毫秒)的時(shí)間片中執(zhí)行。每個(gè)時(shí)間片分為三個(gè)部分,依次執(zhí)行:操作系統(tǒng)、用戶程序和通信。時(shí)間片的數(shù)量取決于當(dāng)前用戶程序的復(fù)雜性和中斷程序執(zhí)行的事件。
在正常操作中,如果事件發(fā)生,則當(dāng)前正在執(zhí)行的塊在命令邊界處被中斷,并且被分配給特定事件的不同組織塊被調(diào)用。一旦執(zhí)行了新的組織塊,循環(huán)程序就在其被中斷的點(diǎn)重新開始。這適用于未超過最大允許周期時(shí)間(默認(rèn)為150 ms)的情況。換句話說,如果在主OB1中調(diào)用了太多的中斷OB,則整個(gè)周期時(shí)間可能會比PLC硬件配置中設(shè)置的時(shí)間更長。超過最大允許執(zhí)行周期會產(chǎn)生軟件錯(cuò)誤,并且PLC調(diào)用特定塊來處理該錯(cuò)誤,即OB80。有兩種方法來處理此錯(cuò)誤:1)如果OB80未加載到主程序中,則PLC轉(zhuǎn)到停止模式;2)PLC執(zhí)行OB80編程的指令,例如警報(bào)。
西門子為開發(fā)PLC程序的工程師提供其Total Integrated Automation(TIA)門戶軟件。它由兩個(gè)主要部分組成。STEP 7作為PLC和WinCC的開發(fā)環(huán)境,用于配置人機(jī)界面(HMI)。工程師能夠使用以下編程語言之一對PLC進(jìn)行編程:梯形圖(LAD)、功能塊圖(FBD)、結(jié)構(gòu)化控制語言(SCL)和語句表(STL)。S7 PLC程序分為以下單元:組織塊(OB)、功能(FC)、功能塊(FB)、數(shù)據(jù)塊(DB)、系統(tǒng)功能(SFC)、系統(tǒng)功能塊(SFB)和系統(tǒng)數(shù)據(jù)塊(SDB)。
OBs、FCs和FBs包含實(shí)際代碼,而DBs為數(shù)據(jù)結(jié)構(gòu)提供存儲,SDB為當(dāng)前PLC配置提供存儲。前綴M(存儲器)用于尋址內(nèi)部數(shù)據(jù)存儲器。一個(gè)簡單的PLC程序至少包含一個(gè)名為OB1的組織塊,相當(dāng)于傳統(tǒng)C程序中的main()函數(shù)。在更復(fù)雜的程序中,工程師可以通過使用函數(shù)和功能塊來封裝代碼。唯一的區(qū)別是額外的DB作為調(diào)用FB的參數(shù)。SFC和SFB內(nèi)置在PLC中。然而,操作系統(tǒng)循環(huán)地調(diào)用OB,并且通過該調(diào)用開始用戶程序的循環(huán)執(zhí)行。
時(shí)間(TOD)中斷
根據(jù)中斷的需要(例如每分鐘、每小時(shí)、每天、每月、每年和月末),一天中的時(shí)間(TOD)中斷在配置的時(shí)間執(zhí)行一次或定期執(zhí)行。CPU 1500提供具有編號OB10至0B17以及OB 123之后的共計(jì)的20個(gè)組織塊用于處理TOD中斷。
要啟動TOD中斷,用戶必須首先設(shè)置啟動時(shí)間,然后激活中斷。他可以進(jìn)行這兩種活動。分別在塊屬性中自動配置,或同時(shí)配合系統(tǒng)功能;手動配置:激活塊屬性意味著時(shí)間中斷自動啟動。簡要地說明了這兩種方式:
1) 自動配置:用戶使用事件類Time-of-Day添加組織塊,并輸入名稱、編程語言和編號。他用中斷發(fā)生時(shí)要執(zhí)行的所需指令對OB10進(jìn)行編程。
2) 手動配置:在這種方法中,用戶使用系統(tǒng)功能塊來設(shè)置、取消和激活時(shí)間中斷。他通過使用系統(tǒng)功能塊在主OB1中設(shè)置中斷的必要參數(shù),同時(shí)在OB10中對要執(zhí)行的中斷指令進(jìn)行編程。
0x03 攻擊執(zhí)行
正如在任何典型的注入攻擊中一樣,我們在目標(biāo)PLC的原始控制邏輯中植入我們的惡意代碼,時(shí)間中斷塊OB10。CPU在每個(gè)單獨(dú)的執(zhí)行周期中檢查是否滿足中斷的條件。這意味著,攻擊者的中斷塊將始終被檢查,但只有在CPU時(shí)鐘的日期和時(shí)間與攻擊者設(shè)置的日期和時(shí)間匹配時(shí)才會執(zhí)行。因此,我們有兩種情況:
1) CPU時(shí)鐘的日期與OB10中設(shè)置的日期(攻擊日期)匹配。CPU立即停止執(zhí)行OB1,將斷點(diǎn)的位置存儲在專用寄存器中,并跳轉(zhuǎn)到執(zhí)行相應(yīng)的中斷塊OB10的內(nèi)容。
2) CPU時(shí)鐘的日期與OB10中設(shè)置的日期不匹配。CPU在檢查中斷條件之后恢復(fù)執(zhí)行OB1,而不激活中斷并且不執(zhí)行OB10中的指令。
我們在本文中提出的攻擊方法由兩個(gè)主要階段組成:注入階段(在線階段)和攻擊階段(離線階段)。
A、注入階段
下圖顯示了此階段的基本過程。我們的目標(biāo)是向PLC注入我們在中斷塊OB10中編程的惡意指令。此階段包括四個(gè)步驟:
a) 上傳和下載用戶程序。
b) 修改和更新控制邏輯程序。
c) 制作s7CommPlus下載消息。
d) 將攻擊者的消息推送給受害者PLC.
為了篡改目標(biāo)PLC,我們利用我們的MITM站,它有兩個(gè)主要組件:
1) TIA門戶:用于檢索和修改PLC運(yùn)行的當(dāng)前控制邏輯程序。
2) PLC注入器:將攻擊者的代碼下載到PLC.在這項(xiàng)工作中,我們?yōu)榇碎_發(fā)了一個(gè)基于Scapy的Python腳本。對于實(shí)際情況,攻擊者在訪問網(wǎng)絡(luò)后可能會遇到兩種情況。
案例_1:非活動S7會話
在這種情況下,合法的TIA門戶處于脫機(jī)狀態(tài),并且僅在需要上傳過程時(shí)才與PLC通信。步驟1.上傳下載用戶程序:此步驟的目的是獲取PLC運(yùn)行的反編譯的控制邏輯程序,以及TIA Portal發(fā)送的S7CommPlus消息,將原用戶程序下載到PLC中。為了實(shí)現(xiàn)這些目標(biāo),我們首先打開攻擊者的TIA門戶,并直接與受害者PLC建立連接。這是可能的,因?yàn)镾7-1500 PLC設(shè)計(jì)上存在安全漏洞。事實(shí)上,可編程邏輯控制器沒有引入任何安全檢查,以確保當(dāng)前通信的TIA門戶與其在早期會話中通信的TIA門戶相同。為此,任何在其機(jī)器上提供TIA門戶的外部對手都可以輕松地與S7 PLC通信,而無需任何努力。成功建立通信后,我們將控制邏輯程序上傳到攻擊者的TIA門戶。然后,我們再次將其重新下載到PLC,并使用Wireshark軟件嗅探攻擊者的TIA門戶和受害者PLC之間交換的整個(gè)S7CommPlus消息流。在此步驟結(jié)束時(shí),攻擊者在其TIA門戶上安裝了程序,并將所有捕獲的下載消息保存在PCAP文件中以供將來使用。
步驟2.修改和更新PLC的程序:在檢索目標(biāo)PLC運(yùn)行的用戶程序后,攻擊者的TIA門戶將以一種高級編程語言(如SCL)顯示該程序。基于我們對PLC控制的物理過程的理解,我們配置并編程了我們的時(shí)間中斷塊OB10,以強(qiáng)制系統(tǒng)的某些輸出在中斷被激活時(shí)關(guān)閉,盡管我們的惡意代碼與原始代碼的不同之處僅在于一個(gè)額外的小尺寸塊(OB10),但它足以混淆我們實(shí)驗(yàn)設(shè)置的物理過程。更新PLC中運(yùn)行的程序的最簡單方法是使用攻擊者的TIA門戶。當(dāng)我們下載修改后的控制邏輯時(shí),PLC成功更新了其程序。但是,ICS操作員可以很容易地通過從受感染的PLC上傳程序來發(fā)現(xiàn)篡改,并且比較分別在其合法TIA門戶和遠(yuǎn)程PLC上運(yùn)行的離線和在線程序。
步驟3.制作s7CommPlus下載消息:為了向合法用戶隱藏我們的感染,我們首先記錄了下載修改程序時(shí)攻擊者的TIA門戶和PLC之間交換的s7CommPlus消息。步驟4.將特制的消息推送到PLC:特制的S7CommPlus下載消息包含以下屬性:攻擊者程序的對象MAC和對象代碼屬性,以及用戶程序的源代碼屬性。由于S7CommPlusv3在TIA門戶和PLC之間交換共享會話密鑰以防止執(zhí)行重放攻擊,因此我們首先需要將數(shù)據(jù)包與正確的密鑰捆綁在一起,然后才能將精心編制的消息推送到PLC.然而,利用共享密鑰(不在本文的范圍內(nèi)),一旦惡意密鑰交換完成,我們就可以輕松地將密鑰字節(jié)碼與精心編制的消息捆綁在一起。考慮到對會話ID和完整性字段的適當(dāng)修改,我們將最終的S7消息(攻擊者的消息)存儲在PCAP文件中,以便將其作為重放攻擊推回到PLC。下述算法描述了PLCInjector工具的主要核心,該工具用于使用攻擊者的篡改PLC程序:
PLCInjector工具有兩個(gè)功能:第一個(gè)用于利用S7CommPlusV3使用的完整性保護(hù)會話密鑰。在TIA Portal和S7-1500 PLC之間的每個(gè)會話中交換的會話密鑰源自PLC的ServerSessionChallange的16個(gè)字節(jié),確切地說是位于字節(jié)2和18之間的那些,與TIA Portal選擇的隨機(jī)24字節(jié)KDK的組合。然后,在SessionKey計(jì)算中使用指紋函數(shù)f()。第5行生成24字節(jié)隨機(jī)量(M),并將其映射到作為預(yù)密鑰貢獻(xiàn)的橢圓曲線的域。根據(jù)隨機(jī)點(diǎn)預(yù)密鑰,我們使用密鑰推導(dǎo)函數(shù)(KDF)來推導(dǎo)如下標(biāo)識的3-16字節(jié)的量:密鑰加密密鑰(KEK)、校驗(yàn)和種子(CS)和校驗(yàn)和加密密鑰(CEK)。在第7行中,CS生成組織為四個(gè)256字的4096個(gè)偽隨機(jī)字節(jié),即LUT.此LUT用于計(jì)算KDK和PLC_質(zhì)詢的校驗(yàn)和。從第8行到第13行描述了橢圓曲線密鑰交換方法,類似于TIA Portal用于加密隨機(jī)生成的預(yù)密鑰的方法。之后,我們用隨機(jī)選擇的20個(gè)字節(jié)(在算法中貢獻(xiàn)給X)來屏蔽橢圓曲線計(jì)算。第19行為加密的KDK提供認(rèn)證的加密。這里,計(jì)算非加密校驗(yàn)和,然后由AES-ECP函數(shù)加密。最后,我們添加包括密鑰指紋的2個(gè)報(bào)頭字段,即,具有一些附加標(biāo)志的相關(guān)密鑰的8字節(jié)截?cái)嗟腟HA256散列(見第20行)。
在與受害者成功建立會話后,PLC與攻擊者機(jī)器交換惡意生成的Session_Key以及當(dāng)前通信會話。在下一步中,我們的工具將執(zhí)行函數(shù)2,向攻擊者發(fā)送精心編制的S7消息,其中包含惡意代碼以及生成的Session_Key。我們的攻擊工具也可以用于攻擊所有共享相同固件的S7-1500 PLC.這是因?yàn)槲鏖T子設(shè)計(jì)了新的S7密鑰交換機(jī)制,假設(shè)所有運(yùn)行相同固件版本的設(shè)備也使用相同的公鑰-私鑰對機(jī)制。成功注入后,PLC更新其程序,處理攻擊者程序的目標(biāo)代碼,同時(shí)將用戶程序的源代碼保存在其內(nèi)存中。因此,每當(dāng)用戶從受感染的PLC上傳程序時(shí),TIA Portal都會調(diào)用、反編譯并顯示原始程序。這使得我們的注入隱藏在PLC內(nèi)部,用戶無法檢測到在線和離線程序之間的任何差異。
案例_2:活動的S7會話
在這種情況下,在篡改期間,合法的TIA門戶和PLC之間有一個(gè)正在進(jìn)行的活動S7會話。默認(rèn)情況下,S7 PLC只允許一個(gè)活動的在線會話,因此攻擊者無法與PLC通信。它將立即拒絕任何建立連接的嘗試,因?yàn)樗呀?jīng)在與用戶通信。在這種情況下,攻擊者首先需要關(guān)閉當(dāng)前合法用戶和PLC之間的在線會話。通過啟用TIA門戶軟件中的“在線”功能,用戶可以與S7 PLC建立在線會話。然后他可以控制,監(jiān)控,診斷,下載,上傳遠(yuǎn)程啟動和停止CPU。一旦用戶與PLC建立了在線連接,雙方(TIA門戶和PLC)就開始定期在會話中交換特定消息。此消息稱為S7-ACK,負(fù)責(zé)保持會話活動。TIA門戶必須始終使用S7-ACK重放消息響應(yīng)PLC發(fā)送的任何S7-ACK請求。因此,為了關(guān)閉當(dāng)前的在線會話,我們運(yùn)行我們的MITM站,它允許我們通過執(zhí)行眾所周知的ARP中毒方法來攔截和丟棄從TIA門戶發(fā)送的所有數(shù)據(jù)包。如果PLC在發(fā)送確認(rèn)請求后沒有立即收到來自TIA門戶的響應(yīng),它將關(guān)閉與已連接的TIA門戶的連接,并且兩者都將離線。值得一提的是,攻擊者還可以使用不同的方式來關(guān)閉連接,例如端口竊取、使用“離線”數(shù)據(jù)包進(jìn)行重放攻擊等。在合法的TIA門戶和受害者PLC都脫機(jī)后,攻擊者可以使用自己的TIA門戶輕松地與PLC建立新的會話。然后,他按照前面案例中解釋的相同四個(gè)步驟修補(bǔ)受害者設(shè)備。對于這種情況,我們的攻擊方法有局限性。合法的TIA門戶被迫關(guān)閉與PLC的會話。這意味著,用戶可以清楚地看到他失去了與遠(yuǎn)程設(shè)備的連接。
成功注入后,攻擊者離線并關(guān)閉與目標(biāo)PLC的當(dāng)前通信會話。在下一個(gè)執(zhí)行周期中,攻擊者的程序?qū)⒃赑LC中執(zhí)行。這意味著,惡意中斷塊OB10的中斷條件將在每個(gè)執(zhí)行周期中被檢查。只要不滿足中斷條件,該塊就保持在空閑模式,并隱藏在PLC的存儲器中。一旦配置的攻擊日期和時(shí)間與CPU的日期和時(shí)間匹配,中斷代碼將被激活,即主程序(OB1)的執(zhí)行過程被暫停,CPU跳轉(zhuǎn)到執(zhí)行攻擊者用來編寫OB10的所有指令。在我們的應(yīng)用示例中,我們對OB10進(jìn)行了編程,當(dāng)我們與目標(biāo)網(wǎng)絡(luò)完全斷開連接時(shí),強(qiáng)制某些電機(jī)在特定時(shí)間和日期關(guān)閉。攻擊實(shí)驗(yàn)中所使用到的惡意OB10如下圖所示:
0x04 總結(jié)
本文介紹了最新的SIMATIC PLC面臨的新威脅。我們的攻擊方法是基于一旦攻擊者獲得目標(biāo)網(wǎng)絡(luò)的訪問權(quán)限,就注入攻擊者的惡意代碼,但稍后激活其注入程序,而無需在攻擊時(shí)連接。我們的調(diào)查發(fā)現(xiàn)了S7-1500 PLC使用的新完整性方法中的一些設(shè)計(jì)漏洞。根據(jù)我們的發(fā)現(xiàn),我們成功地進(jìn)行了注入攻擊,通過篡改測試PLC的TOD中斷塊(OB10)。這個(gè)塊允許我們激活我們的程序,并隨后影響物理過程,而不是攻擊者連接PLC后便立即攻擊。我們的實(shí)驗(yàn)結(jié)果表明,當(dāng)PLC運(yùn)行攻擊者的程序時(shí),原始的控制邏輯程序總是顯示給用戶。此外,我們的注入不會增加控制邏輯的執(zhí)行次數(shù)。因此,當(dāng)我們的注入處于空閑模式時(shí),物理進(jìn)程不會受到影響。
0x05 彩蛋
本文針對S7-1500 PLC v2.9.2固件所研究的注入攻擊,實(shí)際上仍然是基于S7commPlus協(xié)議實(shí)現(xiàn)的,但西門子從TIA Portal V17開始已經(jīng)啟用更加安全的S7commPlus_TLS協(xié)議,且在對PLC進(jìn)行配置時(shí),默認(rèn)選擇的即這種安全通信協(xié)議,關(guān)于此協(xié)議,安全專家已在參考資料5中詳述,除非人為特意選擇使用傳統(tǒng)的S7commPlus協(xié)議,如下圖所示選擇/配置:
不過即便是S7commPlus_TLS安全協(xié)議,仍然存在相應(yīng)的漏洞,參考資料6中講述了對該協(xié)議的fuzzing并且發(fā)現(xiàn)了多個(gè)漏洞?;谖恼碌乃悸?,仍然可以對S7-1500(V2.9.4)PLC實(shí)施CPU啟停攻擊,如下視頻所示:
(略)
參考資料:
1. A New Injection Threat on S7-1500 PLCs - Disrupting the Physical Process Offline W. Alsabbagh, P. Langend?rfer IEEE Open Journal of the Industrial Electronics Society 3, 146 (2022)
2.W. Alsabbagh and P. Langend?rfer, “A stealth program injection attack
against S7-300 PLCs,” in Proc. 22nd IEEE Int. Conf. Ind. Technol.,
2021, pp. 986–993
3. W. Alsabbagh and P. Langend?rfer, “Patch now and attack later—
exploiting S7 PLCs by time-of-day block,” in Proc. 4th IEEE Int. Conf.
Ind. Cyber-Phys. Syst., 2021, pp. 144–151
4. W. Alsabbagh and P. Langend?rfer, “A control injection attack against
S7 PLCs—manipulating the decompiled code,” IECON 2021 Proc.
47th Annu. Conf. IEEE Ind. Electron. Soc., Toronto, ON, Canada,
Oct., 2021, pp. 1-8
5. http://blog.nsfocus.net/s7-commplus/
6. https://www.freebuf.com/articles/ics-articles/352497.html
原文來源:博智非攻研究院