作為工控系統種類之一,集散控制系統(DCS)多用於控制關鍵基礎措施,分佈在石油、化工、冶金、水泥、水系統中,是工藝操作人員的“大腦”。其重要性更是不言而喻。
上世紀70年代中期,出現了以微處理器為基礎的分散式控制系統,經過30多年的發展,DCS已經綜合了計算機、通訊、顯示和控制等4C技術,在功能日益健全的同時也面臨著越來越多的安全風險。
下面就讓我們來回顧看雪2019安全開發者峰會上《工業集散控制系統的脆弱性分析》的精彩內容。
編輯按
crownless:在工業生產進入資訊化、數字化時代後,其安全問題越來越受到人們的重視。如果系統被入侵,不僅可能造成生產被迫停止,甚至還可能產生爆炸等事故。工控安全在技術上難度較低,但反而很脆弱。這就要求我們投入更多的資源在工控安全上。
嘉賓介紹
劍思庭,復旦大學軟體工程碩士,暗影安全團隊工控安全高階研究員,中國自動化協會常任理事,Kcon 2018講師,開發Ethernet/IP協議裝置嗅探工具。
大會上講師為大家介紹了工業集散系統架構、工業網拓撲以及脆弱性分析,為大家開啟了風控領域的新視野。
演講具體內容
以下為速記全文:
大家好!我現在就職於工業自動化廠商側,來負責工控滲透及防禦工作,也承擔了暗影安全、破曉安全和米斯特安全的工控研究。
接下來我給大家分享的題目是“工業集散系統的脆弱性分析”。
在工控系統裡有很多種類,除了PLC還有一個大種類是DCS工業集散控制系統,它和PLC在架構和應用上的區別,這種領域裡存在哪些脆弱性而帶來系統不穩定的狀態呢?接下來和大家簡單分享。
使用者方使用一套這樣DCS的系統,使用者通過非授權的USB的使用,這個USB的使用是由業主供應商帶過來的,不慎把它的上位機感染了wannacry變種,造成了它的上位機藍屏,使用者找到我們團隊幫助它解決病毒的問題。
通過這個引發了什麼事情?我們做完HMI的防護後,讓我們幫助檢查除此之外工業控制網路DCS系統有沒有相應脆弱性,基於此就產生了今天的這個議題。
大家看到的結構就是我們經常會碰到的DCS的標準架構,下一側灰顏色的地方就是所謂控制器,在DCS裡它叫“單元控制器”,它是控制什麼?它是控制化工、石油以及水行業裡的閥門和感測器。
自動化設計的初衷是代替手動製造,不需要人為參與工業生產,它就是幹這個的,它有不同種類的控制器。再往上一層,通過乙太網的形式是它的監控系統。
大家可以看到那個控制器是一個盒子一樣的東西,它通過訊號線連線了外側的感測器和執行器,作為總控室操作人員,如何能夠第一時間知道現場狀態,通過什麼樣的互動介面呢?將通過上面這一層,我們叫監控系統。
再往上一層就是所謂的管理系統,在管理系統裡會提取你監控的資訊以及管理資訊,綜合起來再去分析你的生產狀況。下面那層只是純監控、監視和控制,上面那層會有分析。這是標準的DCS系統。
它和PLC工控系統有什麼區別?PLC是以下面灰顏色控制器為主,上面的監控軟體和下面的控制器可以是兩個不同的廠商、可以是兩個不同的軟體,甚至可以是一個PLC上面掛一個開發的應用軟體,但是DCS裡永遠不會出現這樣的情況,DCS都是一個廠商,而且走的協議也是私有協議。
我們測試的主要是紅框這個地方,這個地方是安全儀表系統,比如我假設一個場景,因為大家可能都不是在做製造業的,很難在腦中復現這個畫面。
舉個例子,大家都開車,車裡的汽油是怎麼產生的?由三大油廠商把地下石油提煉出來,經過練化、裂解才變成我們使用的石油,過程中它會經過高度加溫,經過離心高速旋轉,但是這兩項行為是很危險的。
紅顏色的系統是什麼意思?比如它設定一個溫度超高比如1200度如何,如果罐裡液體少於10%又如何,離心超快達到幾萬轉又如何,它為了保證安全性會設立這個控制器,一旦超出設立指標馬上停止,以確保裝置安全和人的安全。
這是傳統資訊保安和工業安全的本質區別,傳統資訊其他更多保護的是知識資產、資訊資產,但是工控安全不是這樣的,資訊資產也很多,但是更重要的是人和裝置。
我們曾經出現過一件事情,大家都知道鍋爐,北方冬季取暖都用到暖器,暖器是由供熱公司送過來的,它有一個專門產生蒸氣的鍋爐把蒸氣送過來,如果水在鍋爐液位超低的話,再燒就會炸了,這個控制器就是確保水不能燒乾了。
就像大家在家裡燒水一樣。在鍋爐系統裡,一旦水燒乾了,鍋爐就會被炸掉,因為裡面的熱氣沒有辦法被釋放出來。這個控制器就是確保裝置和人身的安全。
這個場景有幾部分組成?有2臺思科2960二層交換機組成它的網路結構,另外有兩臺DCS控制器,另外有兩臺server裡面執行server2003,還有4臺client,XPSP3的,為什麼我把這側面標灰了,是因為我們要去打補丁和安全防護的,客戶讓我們測試的裡面不包括這兩臺裝置,另外,我們使用1臺kali機器。
這個圖就是網路架構,中間兩臺是2960交換機,下面2臺是冗餘控制器,上面兩臺是server是2003,還有4臺client。每臺機器上都有兩條線,一個黃的,一個綠的,它是保證單網路不要出現中斷的情況,雙網下來。
但是它為了保證網路冗餘性,它不僅僅保證雙網,還保證瞭如果交換機壞掉也不影響使用。這裡它就構成了STP,生成數的這樣一個環境。
仔細去看,會發現這裡是有環的,如何確保沒有環,這是DCS廠商自己解決在通訊上的問題,既保證鏈路是冗餘的,又要保證不要形成環路。就像一個小區一樣,路由很多,怎麼確保不要打轉呢,這由廠商去解決。
每臺計算機後面的介面都是這樣的,一塊網路卡上有兩個口。廠商把它做成了橋接模式,傳統來講這應該是2個不同的網段,但把它做成了同一網段,這種模式下它就形成了環。
如何破解這個環路,不讓它對環路形成干擾?廠商自己開發了二層的容錯乙太網協議,這個協議10年前就開發出來了,是非常優秀的乙太網冗餘的協議。
左側圖是把兩口的網路卡協議層時加了自己的驅動軟體,把它做成了橋接,橋接這個模式時又遮蔽了STP可形成環的檢測,這是它做得很高明的地方。同時,它在這裡面開通路由功能。
再往上是協議層,它要跑自己的工業協議,這裡面跑的什麼協議從後面可以看到。這張圖是一個基於二層高可靠性的網路,另外的圖片是每一個節點狀態是不是正常的,到任何一個節點都有4條鏈路可以走,任何一條鏈路壞掉都沒有影響,但同時它只走了1條鏈路。
大家可以看下面的圖,雖然它有4條,最後會把2條堵上,哪條最優是它自己做計算的。
我們團隊接到滲透任務這個時候首先看到的是2960交換機,首先去看能不能找到和2960以及這個廠商相關的資訊。我們找到了這個廠商的配置檔案,標紅的地方是什麼意思?它不讓你在DCS網路裡形成環,並啟用MSTP協議,保證只有單鏈的通訊,同時又可以實現多路徑的冗餘。
在此基礎上,STP有什麼特點?它是為破解環路而設計的一個網路。STP有一種沒有使用的狀態,第二種是轉發的狀態,第三種是把這個關口關閉掉,為了防止形成環路,還有一種是在學習,還有一種是在監聽,這5個狀態是在迴圈的,交換機的這個埠的狀態是這樣的迴圈。
每一個狀態的切換都需要5-15秒,這5-15秒之間是不做任何資料轉發的,也就是說資料是中斷的。另外一個圖,當形成三角、形成環路時,它會把埠阻塞掉,雖然外形很像環性,但其實它是line形。
我們採用什麼工具去做這個破壞性實驗?我們嘗試一下,如果我們對這個STP做攻擊會有什麼結果。我們採用了一個工具,這個工具是專門攻擊工業乙太網二層協議的工具,大家使kali 2007版以前的都有這個工具。
我們當時選擇了BPDU連續傳送,什麼意思?在剛才看到的3臺交換機裡形成環網時,永遠有一個管理者來決定哪個埠是關閉的、哪個埠是開放的。怎麼選擇這個管理者?就是我想如果、地址最低的那個裝置視為管理者。
我們就模仿了一下,如果我們對這個交換機發大量mac地址肯定有地址比你低,會不會造成它的鏈路震盪?這個視訊是我們做的,DCS系統上位機,可以看到攻擊狀態,它輸入使用者名稱和密碼,輸入進去之後我們選擇線上監控圖,這張圖是客戶線上的生產狀態,我切到這個系統裡,針對那臺2960 mac地址做一次hack,目標mac一定是交換機的我想如果、不是埠mac,因為它是二層的,埠上沒有mac。
我們先發一個BPDU一次震盪,告訴它會產生震盪,這時它開始學習了,然後我們發個連續讓它震盪不停,mac地址在狂傳送。這時我們切換到平臺上,這時畫面還是有的,但是資料已經不重新整理了,畫面為什麼還有?它有一個和自己控制器重連的時間,這個重連時間有3次裡面定義的時間,現在看來所有的都還是可以的。
這時資料已經不重新整理了,我們再想回到介面時發現它已經報錯了,“timeout”控制器已經全部斷開連線了。這是我們的一個演示,造成DCS上位系統和它的控制器連線斷開了。
DCS有個最大的不同,一旦上位機斷開,下面的控制器裝置自動進入保護狀態,不會自己持續,間接把控制器做成了hold的狀態,所有埠都會保持上一時間的狀態,不再做任何變化。
另外,當我們發現這個之後,嘗試想看到控制器跑了什麼協議,我們採取了什麼辦法?大家有沒有人知道CVE-2018-0171,是一個安全團隊發現思科的漏洞,也就是說在4786埠上如果發一個畸形資料包時會把交換機打死,甚至會拿到root許可權。
我們之所以用這個CVE打這個交換機,是想做個埠映象,把上位機到控制器的流量引出來。因為交換機不像集線器,它不是全埠轉發,你根本看不到它們倆的流量。
這段是我們的攻擊程式碼,最下面的一個是傳送了,在tv1和tv2那兩個地方如果裝了特殊字元就會引起2960交換機直接當機了。當時我們是想能夠獲得root,但是沒有成功,很不幸直接把交換機打死了。
而且客戶當時只給我們1天時間,沒有辦法再修改程式碼去找到錯誤的地方獲取root。我們採取了另外一個比較粗暴的方式,就是Mac泛洪,2960交換機的mac地址表大概是4K,我們測試只要超過了4K多之後,它就會變成一個hub。
因為它自己找不到那些需要做轉發的埠,因為mac地址表,哪個埠對應哪個,會把原來真實mac地址沖掉了,裡面都是虛假的,交換機發現沒有了對應mac怎麼辦?做廣播。做廣播時我們可以抓到上位機到控制器的清晰流量。
下面它跑了一個Modbus-TCP,這是工業乙太網裡一個非常常見的工業協議,但是它不僅僅跑了這個Modbus-TCP,還同時跑了一個組播協議,224的組播段上把通訊服務跑在組播上,把資料跑在tcp這個協議上,這是它的設計方法,我們也是通過mac泛洪的方式抓到這個流量。
Modbus-TCP埠是502,有哪些家會採用Modbus-TCP?市面上國產的DCS系統都具備這個介面,而且這個協議有先天性不足。
但是為什麼很多人要使用這個Modbus-TCP?因為Modbus-TCP是工業乙太網的協議,在工業環境裡還沒有談及安全時,只談功能、只談業務時它已經產生了,它是第一代的工業乙太網協議,所以它更關注的是怎麼實現業務,卻沒有考慮安全。
這是它的報文,它是一個7層協議,最下面有一個Modbus-TCP的站地址,這個站地址不是TCP的地址,它認為TCP裡的節點從0開始,也就是說站裡有多少個裝置,它就有多少地址。後面有一個功能碼,發進去這個資料流到底要做什麼,是被這個功能碼定義的。
另外還有地址,後面就是資料,但它這裡面沒有校驗,校驗那兩個地方是空的,因為它用了TCP的校驗,在協議裡沒加校驗。Code碼有1、2、3、4、5、6等很多種,最多有16個code,是裡有讀、寫、批量讀、批量寫。但是這裡面它沒有對身份驗證,所以做重放也好,任意接入也好,對它來講都是有效的,這是Modbus-TCP自身存在的協議上的一個缺陷。
我們針對協議上的缺陷寫了這段程式碼,目標地址是10.1.1.35,埠是502。我們對地址“000”做一次hack,行為是讓它產生一次“01”的跳變,這個跳變在我們資訊保安的人看來只是一次數值的變化,沒有什麼意義。
但是在工業領域裡不是這樣的,如果這個位置對應的是你的一個24v的蒸氣閥門,這個蒸氣閥門是關閉的,你讓它產生一次跳變時,它就會開一次再關一次,例如40噸的蒸氣瞬間會在管道里湧出來,也就是說附近以內的人沾上就死掉了,是看不見的那種蒸氣,可能是一層白煙,過去的時候身體連原形都沒有,這是我們曾經在現場出現一次事故,程式寫錯了把40噸蒸氣開啟了,現場維修的工程師連衣服都沒有剩下。
整個程式碼就是這樣的,前面那幾個字元都是標準固定的,後面是計算協議的字長,然後放哪個功能碼,功能碼放的是“1”。如何去寫資料?最後那個地方是ff,那個ff就是致1。000是致0。中間做了個延時,經過這樣一個跳變之後就實現了標誌位的0到1的跳變。我給客戶做了這樣一個展示。
這個視訊就是介紹這段程式的執行,另外,大家可以看到那一側,是一個模擬的現場控制器,大家眼睛可以關注第一位的那個“0”,一旦這個程式執行之後就會產生這樣一個跳變。
這個程式碼其實非常簡單,就是我們要去做地址唯一的off,位置在哪?就是地址為“1”的這個地方。大家可以看一下那個地方,它變1了,又變0了,僅僅是這樣一個動作,你可以對一個位,也可以對所有的位,讓計算器裡所有的狀態跑的不是它原來程式所要的狀態,這都是可以的。
我們講了這麼多,最關鍵的PPT是這一頁,面對這樣的問題,我們怎麼去防護它?
第一,交換機一定要增加埠的安全策略。就像現在工業使用者的交換機埠不是敞開就是預設的狀態,這是不可以的。如果不用一定把這個斷口堵掉,這樣可以確保埠的安全。
第二,增加工業防火牆的隔離。因為協議本身並不安全,怎麼確保是非法攻擊呢?通過過濾防火牆確保原mac以及攻擊向量踢出去。同時,網路裡一定要監控主機。
第三,使用者側原來在計算機上沒有安裝防火牆,也沒有安裝殺軟。這次我們幫助使用者安裝了殺軟,開了防火牆,並做了基線安全,同時裝了白名單的防護,因此防止其他惡意把木馬傳上來去做執行。整體在這方面的防護。
非常感謝大家,這是我的個人資訊,有二維碼、郵箱和三個團隊:暗影、破曉和米斯特,如果大家有對公共安全感興趣的可以跟我進行私下交流。
工控安全在技術上沒有什麼難點,但反而很脆弱。但是國家之所以把基礎設施安全提到這樣的高度,因為它是由人員、裝置和資產三部分共同組成的安全等級,不是簡簡單單的資訊丟失,可能造成裝置的損傷、人員的傷亡。
公眾號ID:ikanxue
官方微博:看雪安全
商務合作:wsc@kanxue.com