在工業控制系統中,各種不同的型號系列的PLC除了使用公開的工業控制協議(例如 modbus,opcua等),還使用了廠家自己開發的私有協議(例如施耐德的UMAS,西門子的S7comm/S7commPlus等),這一系列協議主要用于和自家的組態軟件進行通信來執行一些高權限的操作,例如啟動停止,工程的上載和下裝等。這些操作無疑會給工業現場造成巨大的安全隱患,對工業控制私有協議分析也成了工業控制系統安全的重點和難點。本文通過分析如今的PLC私有協議的現狀,提出一些研究思路和安全建議。
私有協議實例
施耐德UMAS
施耐德UMAS協議是施耐德M340/M580和上位組態軟件Unity Pro通信使用的一種私有協議,由于其下層協議使用的modbus 90功能碼,所以服務端口也是502端口。通過閱讀isf(https://github.com/dark-lbp/isf/)工業控制系統漏洞利用框架的源碼找到針對施耐德系列PLC的啟停腳本源碼可以分析該協議的基本流程,如下:
該攻擊腳本先是通過0x10功能碼獲取UMAS的會話key,再通過0x40(啟動功能碼)/0x41(停止功能碼)來控制PLC設備的啟動停止。如下即為Wireshark抓取到的數據包,UMAS協議解析插件可以自己編寫。
通過協議分析可以知道,該協議是未加密的狀態,可以使用簡單的重放進行PLC攻擊,該種私有協議相對簡單,沒有加密流量以及完整性校驗,安全性相對不足。
西門子S7comm系列
S7comm是S7-300/S7-400和上位組態軟件TIA通信的私有協議,下層協議為COTP,使用的服務端口號為102。通過閱讀isf框架源碼可以知道到該協議也沒有加密,也沒有完整性校驗。
抓取到的數據流量如下所示,這種類型的協議也可以通過的簡單的重放來控制PLC。
但是S7-1200/S7-1500使用的是S7協議加強版S7commPlus,該協議握手階段使用了一系列復雜的算法來建立安全的會話鏈接,同時為接下來的每一個操作數據包都加上了完整性校驗。
如下選中的地方即為完整性校驗字段:
針對這類復雜的算法協議可以通過逆向關鍵的dll或者直接調用核心的dll來完成對PLC的攻擊。下圖為針對S7commPlus攻擊工具。
密碼設置
通過上面的分析可以知道,現在的工業控制私有協議安全性還有很大的不足,為了在工業系統中限制其他人使用私有協議執行高權限的操作,可以使用組態軟件給PLC加上保護密碼。
施耐德unitypro設置如下:
西門子TIA可以進行如下設置:
在設置密碼后,可以有效保護PLC,阻止利用私有協議發起的惡意操作。
密碼繞過
密碼繞過屬于工業控制系統安全里面的高級技術,只要繞過PLC中的密碼,基本上就可以讓PLC執行惡意操作,比如替換一個惡意工程等。在今年的看雪峰會上,已經有工控安全研究員著手這方面的研究,通過包括物理接觸和非物理接觸方式突破了施耐德,西門子,羅克韋爾等多個PLC的密碼保護機制。總結如下兩點:
1. 不正確的校驗方式,包括把密碼從PLC讀到組態軟件進行比較的設計。
2. 廠商留下的后門,包括未文檔化的PLC內存讀寫功能。
詳情請參考
https://zhuanlan.kanxue.com/article-14166.htm
總結
通過分析可以看出,工業控制系統上私有協議有復雜的、也有簡單的,種類繁雜。不同的廠商有不同的私有協議,這對工控安全研究人員的協議逆向分析能力提出了較大的要求。同時本文還提到了通過設置密碼來阻止私有協議的濫用,然而設置PLC密碼不是萬能的,它依賴于工業控制系統廠商在密碼保護機制實現上的安全性。為了限制私有協議的訪問,最好還是在工業現場部署專門針對工業控制業務環境的IDS/IPS,最大程度的提高工業現場的安全性。