寫(xiě)在前面
前面我們說(shuō)了工業(yè)控制系統(tǒng)的各種通訊協(xié)議,大家肯定會(huì)想到PROFINET、ETHERNET/IP、ETHERCAT等工業(yè)以太網(wǎng):
最詳細(xì)的工業(yè)網(wǎng)絡(luò)通訊技術(shù)與協(xié)議總結(jié)解讀(現(xiàn)場(chǎng)總線(xiàn)、工業(yè)以太網(wǎng)、工業(yè)無(wú)線(xiàn))
技術(shù)解讀PROFINET、Ethernet/IP等7種主流工業(yè)以太網(wǎng)
最全整理工業(yè)通訊上的領(lǐng)域各種總線(xiàn)+協(xié)議+規(guī)范+接口—數(shù)據(jù)采集與控制
對(duì)于工控協(xié)議,除了大家所熟知的modbus opcua等,西門(mén)子、施耐德等廠(chǎng)商也開(kāi)發(fā)了自己的私有協(xié)議,如大家所熟知的西門(mén)子S7comm/S7commPlus,施耐德的UMAS等,前面我們就詳細(xì)分析過(guò)S7以及Ethernet/IP等:
S7-1200+SCADA:詳解西門(mén)子S7協(xié)議與數(shù)據(jù)讀寫(xiě)
入門(mén)工業(yè)通訊之EtherNet/IP協(xié)議分析
基于S7協(xié)議對(duì)西門(mén)子PLC S7-1500的漏洞分析與復(fù)現(xiàn)(附演示視頻)
今天我們來(lái)聊一聊西門(mén)子S7 PLC漏洞攻擊實(shí)驗(yàn)~
近期關(guān)注了文章“Vulnerability analysis of S7 PLCs:Manipulating the security mechanism”,文章對(duì)Siemens PLC環(huán)境(特別是S7CommPlus 的通信協(xié)議)進(jìn)行了深入分析。研究人員使用WinDbg和Scapy工具,對(duì)協(xié)議中使用的反重放機(jī)制進(jìn)行了研究,包括創(chuàng)建有效網(wǎng)絡(luò)數(shù)據(jù)包所需的特定字節(jié)的標(biāo)識(shí),文章基于試驗(yàn)性分析方式,對(duì)新漏洞(包括對(duì)加密密鑰的操作)進(jìn)行了研究,演示了利用漏洞進(jìn)行通信會(huì)話(huà)session、使工程師無(wú)法配置PLC 、對(duì)PLC工作狀態(tài)進(jìn)行未經(jīng)授權(quán)的更改、以及其他對(duì)完整性和可用性的破壞。原文較長(zhǎng),本文僅對(duì)文章區(qū)別于當(dāng)前已有資料的獨(dú)到分析和總結(jié)之處進(jìn)行翻譯和概括,以饗讀者。
1、相關(guān)研究
前期已有對(duì)S7-1200/S7-1500 PLC的研究文章,對(duì)S7ComPlus協(xié)議的多個(gè)版本做了分析,下圖對(duì)此作了梳理:
S7-1200 和 S7-1500 PLC 協(xié)議和安全性比較的基本情況如下:
S7CommPlus協(xié)議在 TCP (TTPKT)和面向連接的傳輸協(xié)議 (COTP) 上運(yùn)行,用于在 PLC 和工程軟件之間傳輸關(guān)鍵的操作和配置信息、例如 PLC 邏輯、診斷信息、配置詳細(xì)信息和數(shù)據(jù)塊值。操作員從TIA Portal初始化到 PLC連接,例如,點(diǎn)擊TIA 門(mén)戶(hù)中的“ Go online ”按鈕,如下圖: 以下步驟將被執(zhí)行: 1、TIA Portal 向 網(wǎng)絡(luò)廣播 Profinet Discovery 和基本配置協(xié)議 (PN-DCP) “Identify All”數(shù)據(jù)包。 2、所有PLC或設(shè)備都使用PN-DCP “Identify OK” 數(shù)據(jù)包回復(fù) TIA Portal。 3、TIA Portal初始化與PLC的TCP握手,PLC將回復(fù)。 4、TIA Portal和PLC交換COTP連接信息。 5、TIA Portal發(fā)送第一個(gè)S7數(shù)據(jù)包。 6、PLC使用包含1字節(jié)和20字節(jié)反重放機(jī)制的數(shù)據(jù)包進(jìn)行回復(fù)。 7、TIA Portal 會(huì)回復(fù)一個(gè)包含反重播字節(jié)和 132 字節(jié)陣列的數(shù)據(jù)包、即反重放響應(yīng)。 8、TIA Portal將數(shù)據(jù)包連同請(qǐng)求的操作一起發(fā)送到PLC,并在每個(gè)數(shù)據(jù)包中進(jìn)行20字節(jié)的完整性檢查,其中包含特殊字節(jié),如果任何 S7CommPlus反重放字節(jié)數(shù)或完整性檢查值數(shù)據(jù)不正確,連接的另一端將發(fā)送TCP重置數(shù)據(jù)包,會(huì)話(huà)將終止。
圖4 S7CommPlus 會(huì)話(huà)和反重放機(jī)制
圖5 S7CommPlus (連接)請(qǐng)求(來(lái)自 TIA 門(mén)戶(hù))
圖6 S7 質(zhì)詢(xún)數(shù)據(jù)包(來(lái)自 PLC )
圖7 S7CommPlus 響應(yīng)數(shù)據(jù)包(來(lái)自 TIA 門(mén)戶(hù))(左:流量捕獲、右:字節(jié)位置表示)
1.1 抗重放字節(jié)
S7CommPlus協(xié)議在防重放機(jī)制中使用1個(gè)字節(jié)值,自S7-1200固件版本3開(kāi)始使用。當(dāng)TIA Portal初始化連接時(shí),PLC發(fā)送0x06至0x7F范圍內(nèi)的質(zhì)詢(xún)字節(jié),TIA Portal將向PLC回復(fù)一個(gè)響應(yīng),該響應(yīng)通過(guò)將值0x80添加到質(zhì)詢(xún)中來(lái)計(jì)算。例如,如果PLC質(zhì)詢(xún)?yōu)?x08,則TIA響應(yīng)將為0x08+0x80=0x88,如圖中的標(biāo)簽④所示。圖上質(zhì)詢(xún)位于第25個(gè)字節(jié)位置,響應(yīng)位于相應(yīng)數(shù)據(jù)包的第24個(gè)和第29個(gè)字節(jié)。在PLC固件版本3中,S7響應(yīng)數(shù)據(jù)包之后的后續(xù)功能數(shù)據(jù)包必須在第24個(gè)字節(jié)位置包含相同的防重放字節(jié);在固件版本4中,發(fā)現(xiàn)它是相關(guān)數(shù)據(jù)包的第57個(gè)字節(jié)或第62個(gè)字節(jié)。
1.2 響應(yīng)數(shù)據(jù)包中的加密
從固件版本4開(kāi)始,來(lái)自TIA Portal的響應(yīng)數(shù)據(jù)包必須包括除上述單個(gè)防重放字節(jié)之外的幾個(gè)字節(jié)。2017年,Cheng[6]發(fā)現(xiàn)了數(shù)據(jù)包中涉及的兩個(gè)16字節(jié)加密,其中第二個(gè)加密依賴(lài)于第一個(gè)加密。兩個(gè)16字節(jié)的值開(kāi)始于S7響應(yīng)包的第235和第291字節(jié),如上圖中的標(biāo)簽⑨和⑩所示。第一次加密是XOR運(yùn)算,而第二次加密是通過(guò)更復(fù)雜的算法生成的。
1.3 功能包“加密”
響應(yīng)數(shù)據(jù)包發(fā)送到PLC后,TIA Portal將開(kāi)始發(fā)送與TIA Portal功能相關(guān)的字節(jié),本文其余部分將其命名為“功能數(shù)據(jù)包”。所有這些分組必須包括32字節(jié)的“加密”值,如下圖的標(biāo)簽?所示。該“加密”被發(fā)現(xiàn)是由基于散列的消息認(rèn)證碼(HMAC)促進(jìn)的完整性檢查,并且與防重放字節(jié)有關(guān)。Cheng[6]提出了通過(guò)利用協(xié)議來(lái)啟動(dòng)和停止PLC的可能性,但沒(méi)有提供描述協(xié)議漏洞的詳細(xì)信息,只是指出數(shù)據(jù)包完整性檢查功能是一種“加密”。隨后,Biham將S7協(xié)議中使用的底層機(jī)制確定為HMAC,并發(fā)現(xiàn)HMAC的密鑰細(xì)節(jié)是通過(guò)橢圓曲線(xiàn)EL-Gamal類(lèi)密鑰交換來(lái)交換的。然而,沒(méi)有描述具體的協(xié)議機(jī)制,例如,反重放響應(yīng)的每個(gè)字段都用偽代碼松散地標(biāo)識(shí),而算法執(zhí)行細(xì)節(jié)缺失。類(lèi)似地,在函數(shù)分組HMAC計(jì)算中,發(fā)現(xiàn)先前未識(shí)別的具有兩個(gè)不同密鑰的兩組HMAC.因此,在第四節(jié)中對(duì)解決這些差距的研究進(jìn)行了調(diào)查,并與相關(guān)算法一起進(jìn)行了進(jìn)一步介紹,其中對(duì)協(xié)議和漏洞進(jìn)行了詳細(xì)分析,以提供支持加密的機(jī)制的更詳細(xì)視圖。
圖8 S7CommPlus功能包(來(lái)自TIA門(mén)戶(hù)) 如下表,對(duì)上述幾個(gè)圖中的標(biāo)號(hào)字段進(jìn)行了總結(jié):
2、脆弱性實(shí)驗(yàn)分析
實(shí)驗(yàn)環(huán)境包括運(yùn)行TIA Portal V14的工程站、兩個(gè)固件版本為V4.1.3和V4.2.3的S7-1211C PLC和一臺(tái)“受損”機(jī)器,所有這些都通過(guò)交換機(jī)連接到共享LAN。
2.1 TIAPortal分析
為了了解生成反重放響應(yīng)的算法,并探索可能的漏洞,使用WinDBG對(duì)TIA Portal進(jìn)行了分析。本節(jié)描述了在實(shí)驗(yàn)過(guò)程中進(jìn)行的逐步分析過(guò)程。出于實(shí)驗(yàn)?zāi)康模赥IA Portal中搜索可訪(fǎng)問(wèn)設(shè)備的功能用于生成S7CommPlus流量。在分析過(guò)程中發(fā)現(xiàn)的結(jié)果如圖所示。下圖中的標(biāo)簽A-F將在整個(gè)討論中被引用。圖中有兩個(gè)主要部分:如何處理挑戰(zhàn)數(shù)組(藍(lán)色框)和此后命名為“函數(shù)B”(黃色框)的進(jìn)程,該進(jìn)程是生成反重放機(jī)制的大多數(shù)字節(jié)的地方。
圖9 步驟A至F,用于分析TIA門(mén)戶(hù)流程。藍(lán)框顯示“挑戰(zhàn)陣列”。黃色框顯示“功能B ” 為了支持分析,在軟件和PLC之間的通信期間設(shè)置了幾個(gè)斷點(diǎn)。通過(guò)手動(dòng)分析發(fā)現(xiàn),每次TIA Portal發(fā)出請(qǐng)求時(shí),字節(jié)數(shù)組都會(huì)發(fā)生顯著變化。通過(guò)使用SCAPY向PLC發(fā)送完全相同的連接請(qǐng)求數(shù)據(jù)包,可以確認(rèn)該20字節(jié)塊與連接請(qǐng)求數(shù)據(jù)包的有效負(fù)載沒(méi)有明顯關(guān)系。從以前的工作來(lái)看,鑒于S7CommPlus協(xié)議的可用信息有限,從哪里開(kāi)始逆向工程過(guò)程并不明顯。因此,對(duì)于任何進(jìn)行這種分析的人來(lái)說(shuō),第一個(gè)挑戰(zhàn)是確定生態(tài)系統(tǒng)中易受攻擊的部分和分析的切入點(diǎn),如下所示。為了開(kāi)始分析,在沒(méi)有任何斷點(diǎn)的情況下使用一次TIA Portal的搜索功能,并生成一個(gè)完整的通信會(huì)話(huà)(由來(lái)自PLC的TCP重置數(shù)據(jù)包結(jié)束)。通過(guò)軟件上的WinDbg手動(dòng)啟動(dòng)中斷,然后使用命令“s”在存儲(chǔ)器中搜索來(lái)自PLC的20字節(jié),可以識(shí)別包含該20字節(jié)塊的存儲(chǔ)器地址。該存儲(chǔ)器地址可以?xún)H通過(guò)一次“s”搜索來(lái)定位,或者通常僅定位存儲(chǔ)整個(gè)接收到的S7詢(xún)問(wèn)分組的區(qū)域。進(jìn)一步的搜索必須通過(guò)使用訪(fǎng)問(wèn)時(shí)斷點(diǎn)來(lái)完成,并跟蹤該20字節(jié)數(shù)組被寫(xiě)入的特定地址。一旦確定了該地址,在重新啟動(dòng)TIA Portal之前,該地址不會(huì)更改。如標(biāo)簽所示,在該地址上設(shè)置訪(fǎng)問(wèn)時(shí)斷點(diǎn)“斷點(diǎn)A”。在使用TIA Portal初始化另一個(gè)S7通信后,發(fā)現(xiàn)斷點(diǎn)A是通過(guò)兩個(gè)不同的位置訪(fǎng)問(wèn)的,這兩個(gè)位置都是涉及將20字節(jié)塊復(fù)制到另一個(gè)地址的功能。第一個(gè)函數(shù)復(fù)制斷點(diǎn)A指向的地址,而第二個(gè)函數(shù)將字節(jié)復(fù)制到特定地址,如標(biāo)簽所示。因此,為了繼續(xù)調(diào)查,為兩個(gè)識(shí)別的地址中的每一個(gè)設(shè)置了另外兩個(gè)訪(fǎng)問(wèn)斷點(diǎn),即斷點(diǎn)B和斷點(diǎn)C。發(fā)現(xiàn)斷點(diǎn)B指向第3字節(jié)的地址,并且斷點(diǎn)C存儲(chǔ)20字節(jié)數(shù)組的第3到第18字節(jié)(圖6中的標(biāo)記⑤)。這個(gè)16字節(jié)值(字節(jié)3到18),或“挑戰(zhàn)數(shù)組”,已被發(fā)現(xiàn)在字節(jié)生成過(guò)程的其余部分起著重要作用。進(jìn)一步發(fā)現(xiàn),斷點(diǎn)B和C所指向的兩個(gè)存儲(chǔ)器位置分別涉及為s7commplus響應(yīng)和功能分組生成字節(jié)。 此時(shí),DLL“OMSP_core_managed.DLL”第一次出現(xiàn),斷點(diǎn)A、B和C指向的地址都在此DLL的范圍內(nèi)。在分析過(guò)程中,確認(rèn)該模塊(或DLL)是生成所有防重放字節(jié)的地方。下面將解釋S7響應(yīng)分組和S7功能分組中的防重放字節(jié)的生成。
2.1.1來(lái)自TIA Portal的S7響應(yīng)包
在訪(fǎng)問(wèn)質(zhì)詢(xún)數(shù)組的新S7會(huì)話(huà)中,通過(guò)跟隨斷點(diǎn)B,使用WinDbg中的“uf”命令識(shí)別來(lái)自模塊“ OMSP_core_ managed.dll”的“功能B”,如標(biāo)簽所示?.請(qǐng)注意,“uf”命令返回地址所屬的整個(gè)函數(shù)。在通過(guò)回溯函數(shù)B的調(diào)用堆棧進(jìn)行進(jìn)一步調(diào)查后,確認(rèn)其為生成S7CommPlus響應(yīng)數(shù)據(jù)包的位置,響應(yīng)數(shù)據(jù)包可以分為幾個(gè)部分,如下所述。
2.1.1.1可以操作的字節(jié)
在調(diào)查中發(fā)現(xiàn),至少使用了兩次哈希算法Sha-256。這些哈希的輸入由“CryptGenRandom” Windows API生成。生成的兩個(gè)哈希用作輸入的一部分,以生成響應(yīng)數(shù)據(jù)包中的字節(jié)。這些字節(jié)包括:9字節(jié)和8字節(jié)塊,(分別為⑥和⑦),132字節(jié)塊⑧的前76個(gè)字節(jié),以及加密1,⑨和加密2,⑩之間的字節(jié)。如所示,可以通過(guò)使用WinDbg更改哈希函數(shù)的輸入來(lái)操作這些字節(jié)塊,例如將輸入設(shè)置為全零,并且這些字節(jié)的輸出將在每個(gè)會(huì)話(huà)中保持不變。這可能是一個(gè)非常強(qiáng)大的漏洞,因?yàn)橐坏┥蛇@些字節(jié),就可以在不需要TIA Portal或WinDbg的情況下生成數(shù)據(jù)包。只要其他字節(jié)也是由適當(dāng)?shù)乃惴ㄉ傻模琍LC就會(huì)接受這些“特制的”數(shù)據(jù)包。該點(diǎn)說(shuō)明了如何將散列之一標(biāo)識(shí)為生成兩個(gè)16字節(jié)密鑰(圖1中的“密鑰1”和“密鑰2”)的過(guò)程的一部分。這些密鑰隨后用于S7CommPlus響應(yīng)中的兩個(gè)對(duì)稱(chēng)密鑰加密過(guò)程,特別是AES-128。這兩個(gè)過(guò)程將被稱(chēng)為“第一次加密”和“第二次加密”,如圖9右側(cè)所示。由于可以操縱這些哈希的輸入(見(jiàn)?),因此可以生成輸出哈希,從而生成兩個(gè)密鑰,并根據(jù)算法的輸入而改變。因此,標(biāo)簽?可以被認(rèn)為是一個(gè)黑盒子。還有一些值根據(jù)哈希算法的輸入而變化,這些值由另一組函數(shù)生成。為了所呈現(xiàn)的分析的目的,不需要知道這些功能的詳細(xì)操作,并且因此它們也可以被認(rèn)為是黑箱,其在上節(jié)圖中被標(biāo)記?,這將在適當(dāng)?shù)臅r(shí)候再次討論。目前認(rèn)為,如果不訪(fǎng)問(wèn)可編程邏輯控制器(PLC)的內(nèi)存或安裝了TIA Portal的上位機(jī),就不可能操作這些值。然而,攻擊者可能能夠使用中間人代理,例如在受危害的機(jī)器中以TIA Portal的形式,將密鑰更改為所需的密鑰。雖然Biham認(rèn)了操縱哈希輸入的可能性,但我們?cè)谶@里記錄并可視化(圖9)字節(jié)的操縱如何影響機(jī)制其余部分的安全性。從安全研究人員的角度來(lái)看,此信息非常重要,因?yàn)樗沂玖藢?zhuān)有協(xié)議的其他未知問(wèn)題,并突出了可能存在多個(gè)TIA門(mén)戶(hù)和PLC實(shí)例的安全限制。由于本研究是根據(jù)Cheng[6]的研究進(jìn)行的,因此分析的表述和術(shù)語(yǔ)與一致,即將主要組件確定為第一加密、第二加密和功能包完整性檢查。
2.1.1.2第一次加密
Cheng[6]首先提到了響應(yīng)數(shù)據(jù)包中使用的兩種加密,然而僅給出了它們?cè)贗P分組中的位置,并且很少給出關(guān)于這兩個(gè)加密的其他信息。比Biham隨后添加了額外的信息,記錄了用于生成這些字節(jié)的底層算法,這是橢圓曲線(xiàn)EL-Garmal密鑰交換的專(zhuān)有版本。作為進(jìn)一步的貢獻(xiàn),我們現(xiàn)在介紹低級(jí)字節(jié)操作和操作反重放機(jī)制所需的過(guò)程。如下圖所示,第一加密是位于先前識(shí)別的132字節(jié)塊的第77到第93字節(jié)中的16字節(jié)值。發(fā)現(xiàn)通過(guò)使用?中生成的132字節(jié)塊的第61到第76字節(jié)作為明文并使用“密鑰1”作為對(duì)稱(chēng)密鑰加密算法的加密密鑰來(lái)進(jìn)行加密。然后,該加密的輸出將與質(zhì)詢(xún)數(shù)組進(jìn)行異或運(yùn)算,并在發(fā)送到PLC之前存儲(chǔ)在處理通信的地址中。但是,由于明文和密鑰都與?中的操作哈希相關(guān),因此可以將此加密視為16字節(jié)常量和質(zhì)詢(xún)數(shù)組的簡(jiǎn)單XOR運(yùn)算。
圖10 第一次加密
2.1.1.3第二次加密
第二次加密使用與第一次加密相同的加密算法,然而,明文是由更復(fù)雜的算法生成的,該算法使用第一次加密作為輸入的一部分。完整算法的分析如下圖13所示。此外,還確定了生成明文所需的許多構(gòu)建模塊。下面以詳細(xì)的偽代碼的形式呈現(xiàn)這些低級(jí)字節(jié)操作。該偽代碼旨在幫助所提出的實(shí)驗(yàn)(以及[6]和[7])的再現(xiàn)性。(1)“有限域”增量算法(見(jiàn)圖11).有限域是具有有限階的元素的集合,并且乘法和加法的運(yùn)算應(yīng)該符合某些規(guī)則。域的階是域中元素的個(gè)數(shù),并且階應(yīng)該是素?cái)?shù)的冪。
圖11“有限域”增量算法 對(duì)于該遞增,字段的順序是2128,其可以由16字節(jié)值表示。在分析過(guò)程中,不可能找到廣義不可約多項(xiàng)式(有限域中的運(yùn)算規(guī)則),因此計(jì)算由一組運(yùn)算和一組常數(shù)來(lái)表示。要開(kāi)始操作,將16字節(jié)值乘以從0到255的所有整數(shù)。此16字節(jié)值是從與兩個(gè)加密密鑰相同的哈希生成的(請(qǐng)參閱標(biāo)簽)。它采用四個(gè)4字節(jié)小字節(jié)值的形式。計(jì)算如圖11所示。在乘法過(guò)程中,如果乘數(shù)的nTH根為2,其中n為正整數(shù),即乘數(shù)為2,4,8…,輸出將與特定值xpn進(jìn)行異或運(yùn)算,并存儲(chǔ)在具有256個(gè)元素的數(shù)組或數(shù)組“ value256[]”中,其中每個(gè)元素都是16字節(jié)值。由于值必須保持在“有限域”內(nèi),乘法的其余部分不能簡(jiǎn)單地通過(guò)將輸入值乘以乘數(shù)來(lái)實(shí)現(xiàn)。通過(guò)首先以其二進(jìn)制形式表示乘數(shù)來(lái)完成計(jì)算。然后從最高有效位讀取乘法器的二進(jìn)制。如果是“ 0 ”,則沒(méi)有進(jìn)一步的操作。但是如果它是'1',例如,如果乘數(shù)是“9”,其在二進(jìn)制中是“1001”,則value256[23]和value256[20]將被異或在一起,并且輸出被存儲(chǔ)在value256中。
圖12算法a480
圖13 第二次加密(2) 算法A480。該算法以地址的存儲(chǔ)器偏移量命名為“算法A480 ”,取圖11中的“值256[]”。“有限域”增量算法的輸出,以及作為輸入的16字節(jié)值。16字節(jié)輸入“ B_輸入”被分成四個(gè)4字節(jié)數(shù)組,它們以小端格式表示。圖12示出了算法A480的偽代碼,算法的第一部分在循環(huán)中執(zhí)行,將依次讀取4字節(jié)值的每個(gè)字節(jié)位置。通過(guò)從B_輸入的第一元素中的第一字節(jié)位置開(kāi)始讀取,到第二元素中的第一字節(jié)位置,等等。(即B_輸入[0][0],然后B_輸入[1][0],等等)。與十六進(jìn)制中的任何值一樣,它可以是0x00到0xFF,這對(duì)應(yīng)于value256[]中16字節(jié)值的不同256個(gè)元素。16字節(jié)值(第一個(gè)讀取值為value256[B_input[0][0]])將附加零,零的長(zhǎng)度取決于它當(dāng)前所在的元素。例如,對(duì)于元素0或B_INPUT[0],追加了16個(gè)零。類(lèi)似地,對(duì)于B_輸入[1]到B_輸入[3],將分別添加12、8或4個(gè)零。結(jié)果將被存儲(chǔ),并與添加了零的下一個(gè)值進(jìn)行異或運(yùn)算。(例如,經(jīng)XOR運(yùn)算的前兩個(gè)值是Value256[B_輸入[0][0]]和Value256[B_輸入[1][0]],兩者都添加了零)。在進(jìn)行到下一字節(jié)位置(例如,從B_輸入[X][0]到B_輸入[X][1])之前,每一遞增的結(jié)果將被轉(zhuǎn)換成大端字節(jié)序,向右移位1個(gè)字節(jié),并且再次被轉(zhuǎn)換回小端字節(jié)序值。對(duì)于最后一個(gè)位置,不是將32字節(jié)值向右移動(dòng)1個(gè)字節(jié),而是執(zhí)行更復(fù)雜的操作。操作從偽代碼中語(yǔ)句的左側(cè)開(kāi)始。該操作包括:“<<”二進(jìn)制左移、“>>”二進(jìn)制右移和“^”逐位異或。在移位期間,任何方向上超過(guò)16字節(jié)限制的字節(jié)都將被丟棄。生成的32字節(jié)值將被劃分為8個(gè)不同的4字節(jié)值用于操作。在算法結(jié)束時(shí),通過(guò)將四個(gè)4字節(jié)數(shù)組連接成字節(jié)串來(lái)獲得16字節(jié)串。(3) 明文生成。如圖13所示,在用于第二加密的明文生成過(guò)程中有五個(gè)不同的輸入。這五個(gè)輸入是:1)16字節(jié)值;2)第一次加密的結(jié)果(圖13中的紅框);3)16字節(jié)密文(圖13中的綠色框);4)從另一個(gè)密文縮減的8字節(jié)值(圖13中的藍(lán)框);以及5)用零填充的4字節(jié)計(jì)數(shù)器值。實(shí)驗(yàn)已經(jīng)表明,除了第一次加密的結(jié)果之外,所有這些輸入相對(duì)于點(diǎn)?處標(biāo)識(shí)的兩個(gè)散列是恒定的。明文生成過(guò)程的每一步都涉及對(duì)兩個(gè)輸入進(jìn)行XOR運(yùn)算,并通過(guò)“算法A480”運(yùn)行結(jié)果。(4) 完成第二次加密。在生成明文之后,使用“密鑰2 ”對(duì)其進(jìn)行加密(參見(jiàn)圖9),使用與第一加密相同的對(duì)稱(chēng)密鑰加密。密文將用作132字節(jié)塊的最后16個(gè)字節(jié),即來(lái)自TIA Portal的反重放響應(yīng)。圖13示出了“有限域”增量算法、算法A480和明文生成是如何相互關(guān)聯(lián)的。輸入在132字節(jié)數(shù)組中的字節(jié)位置以及如何生成第二次加密也可以在圖中找到。與Cheng[6]的工作相比,對(duì)S7響應(yīng)數(shù)據(jù)包的生成提供了更完整的描述,兩個(gè)加密的細(xì)節(jié)也提供了Biham后來(lái)工作之外的額外信息。值得注意的是,算法A480先前已被簡(jiǎn)要地呈現(xiàn)為制表散列,但沒(méi)有圍繞用于生成第二加密的步驟的細(xì)節(jié)。由于先前描述的較低級(jí)字節(jié)計(jì)算,現(xiàn)在呈現(xiàn)該進(jìn)一步分析。這允許對(duì)修補(bǔ)可能的操縱提出初步建議。
2.1.2來(lái)自TIA Portal的功能包
在交換S7詢(xún)問(wèn)和響應(yīng)數(shù)據(jù)包之后,將發(fā)送S7功能數(shù)據(jù)包。這些數(shù)據(jù)包包括通信的目的和細(xì)節(jié),圖8顯示了其中一個(gè)數(shù)據(jù)包,該數(shù)據(jù)包包含由第III.B節(jié)中給出的示例中的TIA Portal發(fā)送的控制信息。每個(gè)數(shù)據(jù)包都必須在有效載荷之前包括32字節(jié)“加密”(如Cheng[6]所稱(chēng)),如同一圖中的輪廓字節(jié)所示。在該分析中發(fā)現(xiàn),該32字節(jié)塊實(shí)際上是對(duì)分組的HMAC完整性檢查。這種完整性檢查有兩個(gè)目的:確保有效載荷不被操縱;以及驗(yàn)證發(fā)送方(因?yàn)橹挥羞B接中涉及的主機(jī)才知道HMAC的密鑰)。為了生成這個(gè)32字節(jié)值,需要進(jìn)行兩次HMAC計(jì)算。第一個(gè)用于生成所有后續(xù)HMAC的密鑰。第二個(gè)用于對(duì)所有功能包進(jìn)行簽名。兩個(gè)HMAC都基于與其余機(jī)制相同的哈希算法。圖14顯示了兩個(gè)HMAC如何生成完整性字節(jié)。
圖14 完整性檢查
圖15.用于生成8字節(jié)塊的偽代碼,它是第一個(gè)HMAC明文的一部分
2.1.2.1第一次HMAC
第一次HMAC的計(jì)算在S7響應(yīng)分組被發(fā)送到PLC之前完成。HMAC的明文由從斷點(diǎn)C讀取的8字節(jié)值和16字節(jié)質(zhì)詢(xún)數(shù)組組成(參見(jiàn)圖9).圖15示出了用于8字節(jié)生成的偽代碼,該偽代碼對(duì)于S7函數(shù)完整性檢查是關(guān)鍵的,但是在文獻(xiàn)中先前沒(méi)有描述。該算法未被識(shí)別為標(biāo)準(zhǔn)化算法,因此偽代碼是通過(guò)分析匯編代碼生成的。由于8字節(jié)生成算法是完整性字節(jié)生成的基本部分,因此從安全角度來(lái)看,該分析具有指導(dǎo)意義。然后,使用在圖9中標(biāo)簽?處的黑盒中生成的24字節(jié)密鑰來(lái)對(duì)組合的24字節(jié)值進(jìn)行簽名。32字節(jié)的HMAC輸出將被縮減為24字節(jié)值,該值將被存儲(chǔ)并用作第二個(gè)HMAC的密鑰。
2.1.3.2第二個(gè)HMAC
第二個(gè)HMAC用于生成實(shí)際的完整性校驗(yàn)字節(jié),這些字節(jié)被插入到雙方發(fā)送的功能包中。這里已經(jīng)首次識(shí)別了第二次HMAC的密鑰如何是第一次HMAC的結(jié)果,并且進(jìn)一步識(shí)別了S7功能分組有效載荷的哪一部分被用作第二HMAC的輸入。函數(shù)數(shù)據(jù)包的長(zhǎng)度并不總是相同的,但數(shù)據(jù)包中的32字節(jié)HMAC總是從數(shù)據(jù)包的第13個(gè)字節(jié)開(kāi)始。該HMAC的輸入包括分組中HMAC之后的所有字節(jié),即從第45個(gè)字節(jié)開(kāi)始,不包括分組的頁(yè)腳,該頁(yè)腳通常是最后四個(gè)字節(jié)(例如,8在數(shù)據(jù)包的末尾是“72 03 00 00”)。由于每個(gè)數(shù)據(jù)包的長(zhǎng)度和所包含的信息可以變化,因此頁(yè)腳的長(zhǎng)度和內(nèi)容也會(huì)相應(yīng)變化。然而,為了重放分組,由于密鑰是已知的,簡(jiǎn)單的試錯(cuò)法可以識(shí)別需要什么字節(jié)作為HMAC的輸入。
2.1.3總結(jié)和討論
本節(jié)記錄了獲取有關(guān)S7CommPlus協(xié)議中使用的反重放機(jī)制的信息所需的方法和實(shí)驗(yàn)過(guò)程。這些新發(fā)現(xiàn)的信息,包括使用的標(biāo)準(zhǔn)化哈希和加密算法,以及用于明文和密鑰生成的專(zhuān)有算法,可能會(huì)被利用來(lái)創(chuàng)建生成“合法”S7通信的工具。 基于上述實(shí)驗(yàn),現(xiàn)在將討論一些有趣的實(shí)踐方面,旨在為該領(lǐng)域的未來(lái)研究人員提供指導(dǎo),以幫助重現(xiàn)類(lèi)似的實(shí)驗(yàn)結(jié)果。
盡管在本次調(diào)查中未使用“IDA Pro”或新的開(kāi)放式軟件“Ghidra”,但它們可能會(huì)顯著加快調(diào)查速度,尤其是發(fā)現(xiàn)軟件各個(gè)部分中使用特定功能的位置。
在存在質(zhì)詢(xún)和響應(yīng)機(jī)制的情況下,跟隨或回溯存儲(chǔ)器中質(zhì)詢(xún)的存儲(chǔ)器位置可以為反向工程過(guò)程提供入口點(diǎn)。
在WinDbg中記錄“ta”(trace to address)命令的輸出提供了一種查找生成特定字節(jié)的位置的方法。雖然在這項(xiàng)工作中沒(méi)有使用,但自定義腳本可能有助于在跟蹤期間轉(zhuǎn)儲(chǔ)額外信息。
當(dāng)發(fā)現(xiàn)內(nèi)存中使用或存儲(chǔ)的各種字節(jié)是密碼函數(shù)使用的常量時(shí),該研究中的大多數(shù)重大突破都出現(xiàn)了。例如,AES的S盒和Sha-256的初始哈希值。因此,當(dāng)執(zhí)行類(lèi)似的分析時(shí),當(dāng)僅有匯編代碼可用時(shí),搜索存儲(chǔ)器中使用的密碼學(xué)常數(shù)可以提供識(shí)別特定算法的簡(jiǎn)單方式。
在找到要使用的標(biāo)準(zhǔn)算法(例如AES)之后,在存儲(chǔ)器中的搜索和對(duì)父函數(shù)的回溯可以提供揭示使用該算法的多個(gè)實(shí)例的信息。
如果僅從通信的一方生成密碼密鑰,而沒(méi)有來(lái)自另一方的輸入,則可以操縱該密鑰
審核編輯 :李倩
-
通信協(xié)議
+關(guān)注
關(guān)注
28文章
879瀏覽量
40297 -
西門(mén)子
+關(guān)注
關(guān)注
94文章
3034瀏覽量
115780 -
S7-1200
+關(guān)注
關(guān)注
11文章
331瀏覽量
17957
原文標(biāo)題:西門(mén)子S7 1200/1500通信協(xié)議分析與漏洞攻擊實(shí)驗(yàn)
文章出處:【微信號(hào):智能制造之家,微信公眾號(hào):智能制造之家】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論