S7Comm-Plus協(xié)議分析之?dāng)?shù)據(jù)區(qū)訪問
2021-04-22
來源: 關(guān)鍵基礎(chǔ)設(shè)施安全應(yīng)急響應(yīng)中心
概述:西門子PLC使用私有協(xié)議進(jìn)行通信,端口為102。西門子PLC協(xié)議有3個版本,S7Comm協(xié)議,早期S7CommPlus協(xié)議和最新的S7CommPlus協(xié)議。S7-200、S7-300、S7-400系列的PLC采用早期的西門子私有協(xié)議S7comm進(jìn)行通信,S7-1200系列v3.0版本之前的通信協(xié)議采用早期S7Comm-Plus協(xié)議,S7-1200系列v4.0版本、S7-1500系列采用了最新的S7Comm-Plus協(xié)議,最新的S7Comm-Plus協(xié)議引入了會話ID來防止重放攻擊,且對關(guān)鍵流量有加密處理,該部分的內(nèi)容從2017年以來就有多名研究員進(jìn)行了闡述,網(wǎng)絡(luò)上相關(guān)的文章也比較多。但對S7Comm-Plus協(xié)議在工控環(huán)境下使用最多的業(yè)務(wù)流量分析較為缺乏,本文以工控常見業(yè)務(wù)場景為例,分析Wincc V7.4作為上位機(jī)對PLC數(shù)據(jù)區(qū)的訪問操作,現(xiàn)實(shí)場景中工控流量占比最大的也是上位機(jī)的SCADA環(huán)境對下位機(jī)PLC數(shù)據(jù)區(qū)的一些讀寫操作,而非組態(tài)軟件對PLC的啟停、下裝上載操作,只有在調(diào)試運(yùn)維過程中才會使用組態(tài)軟件。
1
環(huán)境配置
整個協(xié)議分析的基本環(huán)境配置如下:Win7 x64虛擬機(jī):
PLC:S7-1200,6ES7214-1AG40-0XB0
Firmware: V4.2.3
Software:Wincc V7.4
S7Comm-Plus Wiresharkdissector plugin: V0.0.8
配置環(huán)境搭建的框架圖如下所示,通過交換機(jī)連接SCADA上位機(jī)與S7-1214C的PLC,wireshark安裝在連接鏡像端口的PC機(jī)中,wireshark中導(dǎo)入S7Comm-Plus的解析插件。
2
對數(shù)據(jù)區(qū)的讀變量操作
本文所述的數(shù)據(jù)區(qū)特指S7系列PLC中的DB塊、M區(qū)(I區(qū)、Q區(qū)與M區(qū)類似)。Wincc對PLC的讀變量操作,首先需要組態(tài)Wincc V7.4在畫面中建立輸出控件,關(guān)聯(lián)上PLC的對應(yīng)地址變量,運(yùn)行系統(tǒng)后在控件中就可讀取對應(yīng)變量的值,如下所示:
組態(tài)讀取MD92地址處的變量值,讀取變量的操作碼Opcode為0X31,F(xiàn)unction為CreateObject(0x04ca),尋找第7個Attribute屬性中ID Number字段SubscriptionReferenceList。
展開SubscriptionReferenceList的詳細(xì)描述,在SubscriptionList下包含了具體的訪問區(qū)域與詳細(xì)地址信息,Accessbase-area區(qū)域顯示M區(qū)(0x52),Blob startoffset為92,表示M區(qū)中的訪問地址,讀取字節(jié)數(shù)Blob bytecount為2,表示讀取兩個字節(jié)長度。
組態(tài)讀取DB59999.DBW6地址處的變量值(wincc對于DB塊進(jìn)行讀取操作必須不加入優(yōu)化,DB塊中的變量必須有確定分配的地址),讀取變量的操作碼Opcode為0X31,F(xiàn)unction為CreateObject(0x04ca),尋找第7個Attribute屬性中ID Number字段SubscriptionReferenceList。
展開SubscriptionReferenceList的詳細(xì)描述,在SubscriptionList下包含了具體的訪問區(qū)域與詳細(xì)地址信息,Accessbase-areaa區(qū)域經(jīng)過算法解析后得到0x8a0eea5f,表示DB59999(原始數(shù)據(jù)幀中字節(jié)為0x88 d0 bb d4 5f),Blob startoffset為6,表示DB5999中的訪問地址,讀取字節(jié)數(shù)Blob bytecount為2,表示讀取兩個字節(jié)長度。
備注:VLQ相關(guān)編碼算法可參考S7Comm-plus wireshark插件的源碼,源碼地址https://sourceforge.net/p/s7commwireshark/code/HEAD/tree/trunk/src/
3
對數(shù)據(jù)區(qū)的寫變量操作
Wincc對PLC的寫值操作一般會在畫面中建立輸入控件,關(guān)聯(lián)上PLC的對應(yīng)地址變量,在控件中寫值,按enter鍵后寫入成功,如下所示:
在MD92寫入變量過程中抓取到請求數(shù)據(jù)幀
寫入變量的操作碼Opcode為0X31,F(xiàn)unction為SetMultiVariables(0x0542),Access base-areaa字段顯示為M區(qū)(0x52),寫入地址Blob startoffset為92,寫入字節(jié)數(shù)Blob bytecount為4,寫入的值為value:0x0001046a。
在DB59999.DBW6地址處寫入變量過程中抓取到請求數(shù)據(jù)幀,(Wincc寫DB塊必須保證DB塊不優(yōu)化,有自己的實(shí)際地址)
寫入變量的操作碼Opcode為0X31,F(xiàn)unction為SetMultiVariables(0x0542),Access base-areaa字段顯示為DB59999(0x8a0eea5f),寫入地址Blob startoffset為6,寫入字節(jié)數(shù)Blob bytecount為2,寫入的值為value:0x8235。
4
流量中關(guān)鍵點(diǎn)提取
從以上的分析中可以總結(jié)如下表格,不論是工業(yè)防火墻還是審計系統(tǒng),均需要將關(guān)鍵字段識別并加入至白名單中,在S7Comm-plus協(xié)議的流量中,識別表格中的關(guān)鍵信息就能命中各種業(yè)務(wù)操作,比如讀M區(qū)變量、寫Q區(qū)變量等。但是想和實(shí)際工藝場景結(jié)合,比如命中流量中對污水處理加藥間加藥量閥門的操作需要做進(jìn)一步的工作。
5
總結(jié)
本文以Wincc V7.4作為上位機(jī),調(diào)用S7Comm-plus的驅(qū)動訪問S7-1200系列PLC,具體訪問了PLC的DB塊、M區(qū)等,在訪問過程中通過wireshark抓取對應(yīng)報文,并做了簡單分析,并通過表格形式總結(jié)出S7Comm-plus訪問西門子系列PLC常用數(shù)據(jù)區(qū)的關(guān)鍵字段,在工業(yè)安全產(chǎn)品中要解析或者捕獲流量是需要命中這些字段,通過這些字段關(guān)聯(lián)到對應(yīng)的操作區(qū)域。但如果想再次區(qū)分流量中對M區(qū)的哪個地址寫入了什么數(shù)據(jù)還需要深入解析后續(xù)的value字段。如若需要和工藝流程聯(lián)動,還需要將工程點(diǎn)表和安全產(chǎn)品中的命中規(guī)則聯(lián)動和融合,這樣才能更接近工業(yè)現(xiàn)場。