驅動提取軟件_深入分析施耐德工控軟件代碼執行漏洞

更多全球網絡安全資訊盡在邑安全

簡介

在本文中,我們將為讀者詳細介紹Claroty Research團隊的Amir Preminger和Sharon Brizinov是如何組合利用兩個漏洞,來觸發施耐德工控軟件EcoStruxure Operator Terminal Expert的代碼執行漏洞,從而在首屆舉辦的Pwn2Own邁阿密大賽上贏得了2.5萬美元獎金。這里所述的漏洞存在于施耐德電氣公司的EcoStruxure Operator Terminal Expert軟件的V3.1.100.267(SP 1)和之前版本(以前稱為Vijeo XD)中。

實際上,攻擊者只要引誘受害者打開(雙擊)EcoStruxure Operator Terminal Expert軟件的項目文件,就能夠利用默認配置發動相應的漏洞。這時,將觸發應用程序上下文中的代碼執行漏洞。總的來說,要想成功利用這個代碼執行漏洞,需要組合利用下文描述的兩個已知的漏洞。在本文中,我們先按照漏洞被發現的順序來描述其詳細信息,然后,給出組合運用這些漏洞并實現命令執行攻擊所需的具體步驟。下面,我們先給出相應的演示視頻的地址:https://youtu.be/SAmhljE9ZlE。

漏洞詳情

EcoStruxure Control Terminal Expert是一個軟件環境,用于設計人機界面(HMI)設備的圖形用戶界面。這些用戶界面用于控制工業部署中可編程邏輯控制器 (PLC) 的操作。

51b74beab4cdec5731eda865d77ed11e.png

圖1 使用EcoStruxure Control Terminal Expert設計水流控制

在這里,所有的項目信息,包括各種設置和圖形組件的信息,都會被保存到一個后綴為.VXDZ的EcoStruxure Control Terminal Expert項目文件中。實際上,.VXDZ項目文件就是一個存放各種文件的壓縮目錄,這些文件包含了程序還原項目所需的全部信息,以便工程師在以后可以繼續工作。項目文件主要包括以下幾種文件類型:

  • .db:SQLite3數據庫文件,包括各種項目配置和設置。

  • .inf/.dat:JSON文件,用于存儲數據和設置。例如,每個屏幕及其圖形組件都是用JSON表示的。

eca234091e450f801a548acb4cbb5563.png

圖2 項目目錄

當工程師打開項目文件時,壓縮后的目錄會被解壓到一個臨時目錄下,路徑如下所示:

C:\users\USER\AppData\Local\EcoStruxure\Temp\Schneider\CURRENT_VERSION_FULL\GUID\ProjectFiles

為了便于后面進行參考,我們將路徑中與環境有關的組件用紅色進行了相應的標記。另外,橙色顯示的是GUID,它是在每次打開一個項目時隨機生成的,即使這個項目之前已經打開過,亦是如此。這意味著這個路徑無法提前預測,因為它取決于當前登錄的用戶、當前具體的版本名以及一次性隨機生成的GUID。例如,下面就是我們打開一個項目文件時生成的一個有效的路徑:

C:\Users\Administrator\AppData\Local\EcoStruxure\Temp \Schneider\Imagine3.1ServicePack\A1A98F0B-9487-41B3-84A2-2195ECAA11F5\ProjectFiles

此外,由于所使用的.NET zip庫能夠防止路徑遍歷企圖,因此,只能提取隨機生成的目錄。

高級功能

與任何安全研究一樣,我們需要盡量熟悉目標產品,并尋找那些可能沒有被廠商深入檢查過的復雜/先進功能。在把玩一陣EcoStruxure Control Terminal Expert后,我們發現了一個名為“Drivers”的功能。由于HMI是智能屏幕,呈現的數據是從工廠內的現場控制器收集的,所以必須具備查詢功能,才能從PLC中獲取數據。為了達到這個目的,施耐德提供了這樣一種機制,即在項目中添加一個特定廠商的驅動程序,該驅動程序能夠查詢PLC以獲取所需數據。我們知道,PLC有許多不同的型號,并且每個PLC都是通過自己的協議進行通信的。正因為如此,施耐德提供了許多的驅動程序,工程師可以根據他們需要集成的PLC自行選用。

2ab52242d8807d6f5df6afa82bac8612.png

圖3 驅動程序是幫助HMI與所需控制設備(PLC)進行通信的組件。每個供應商及其特定設備(生態系統、協議棧等)都會提供許多不同的驅動程序。

有關特定項目文件使用的驅動程序的所有信息都位于一個名為DriverConfig.db的SQLite3數據庫文件中,我們可以在項目目錄中找到這個文件。我們在項目中添加了一個新的驅動程序,并檢查了DriverConfig.db文件,發現其中有三個數據表:

  • Driver_X:空表。

  • Driver_X_Configuration_X:關于驅動程序的詳細信息,如設置和元數據。這其中包括將要加載的驅動程序/模塊名稱。

c34eac651e0a08b9160933269bd39d00.png

圖4 DriverConfig.db的內容

  • Driver_X_Equipment_X:關于HMI將與之通信的PLC的詳細信息。其中,會包括與PLC相關的信息,如IP地址、型號、協議等。

其中,X代表驅動索引,由于我們只添加了一個驅動,所以在我們的例子中X為0。

通過.NET反射器,我們研究了相關的中間語言(IL)代碼。我們發現,ModuleName字段實際上就是驅動程序DLL,它將從預定義的目錄中進行加載,并處理HMI和PLC之間的通信。例如,如果我們有一個Rockwell Automation公司的PLC,我們就需要加載Rockwell公司相應的驅動程序——它通過EtherNet/IP+CIP協議與PLC進行通信。具體這里來說,需要加載驅動程序RockwellEIP.dll。為此,我們可以在該項目中的SQLite3數據庫文件DriverConfig.db中的Driver_0_Configuation_0表的ModuleName列(字段)中加以指定。

f81f0a289788a7fcc2a9c5b7652b5c8e.png

圖5 打開DriverConfig.db數據庫的SQLite3查看器。ModuleName字段是驅動DLL的名稱,它將被加載并處理HMI和PLC之間的通信。

Bug No. 1:通過路徑遍歷以獲取DLL加載原語

為了更好地理解如何從DriverConfig.db數據庫中提取信息,我們鉆進了一個“兔子洞”:DriverConfig.db的連接。我們可以看到,這里的代碼會查詢并提取Driver_x_configuration_0表中的所有屬性。然后,它將一個新的Driver對象實例化,并根據表中找到的相應值設置ModuleName字段。最后,它使用 ModuleName字段指定的路徑加載相應的驅動程序DLL文件。

由于數據庫(包括ModuleName字段)在我們的掌控之下,我們可以提供一個帶有一些 ../../../字符的自定義ModuleName,以便從包含合法驅動程序的應用程序定義目錄中導航出來。換句話說,我們能夠從系統中加載任意DLL。

cf2132eb1d762d1c1f21e69da13e5931.png

圖6 我們將ModuleName字段改為../../../../claroty.dll,并使用procmon來監控系統。

然而,我們的攻擊要想成功,必須滿足下面兩個條件:

  1. 如果一個名為driver.xml的文件沒有出現在將要加載的DLL旁邊,那么該DLL將不會被加載。

  2. 加載的DLL必須位于同名的目錄中。

例如,如果我們將ModuleName改為Claroty,軟件將進入預定義的驅動程序目錄C:\Program Files\Schneider Electric\EcoStruxure Operator Terminal Expert 3.1 Service Pack\Drivers\Drivers,并尋找名為Claroty的目錄,然后在該目錄中搜索Claroty.dll和Driver.xml。如果這兩個文件都找到了,就會加載里面的DLL,在本例中就是C:\Program Files\Schneider Electric\EcoStruxure Operator Terminal Expert 3.1 Service Pack\Drivers\Drivers\Claroty\Claroty.dll。

我們通過目錄遍歷實現了加載任意DLL的原語,這真是太棒了。但是,現在面臨的問題是,我們如何才能提供自己的DLL,并使其運行呢?

好吧,在一定程度上說,我們還需要一個具有“任意文件寫入”功能的原語。回想一下,我們的項目文件實際上就是一個包含文件和目錄的壓縮容器。也就是說,我們可以添加我們的文件和目錄,然后再重新打包項目文件。當軟件打開項目文件并提取所有文件時,我們添加的文件也會和其他文件一起被提取出來(并保存到臨時目錄中)。現在唯一的問題是:我們如何才能提前知道我們的文件會被解壓到哪里,這樣我們就可以在DriverConfig.db數據庫下的ModuleName屬性中設置相應的路徑了。

下面,我們來總結一下:我們可以利用目錄遍歷漏洞來跳出正常的驅動程序的目錄,同時,我們也可以在我們的項目文件被提取的時候,把一些文件和目錄保存到硬盤上。但是,這些文件會被提取到一個隨機的臨時目錄,我們無法提前預知,因為GUID每次都是隨機生成的。

Bug No. 2:未進行嚴格安全過濾導致敏感數據信息泄露

我們對這些問題思考了很久,后來終于想到了一個解決方案。這個解決方案來自于一個意想不到的領域:SQLite的魔術!我們使用SQL pragma和SQL views數據庫功能實時生成提取目錄的完整路徑。因此,我們可以讓Terminal Expert軟件直接找到我們的惡意DLL。我們之所以能夠做到這一點,是因為Terminal Expert軟件加載了我們所控制的項目文件中提供的數據庫,并在沒有對數據進行適當安全過濾的情況下查詢表格。

什么是PRAGMA?

PRAGMA語句是一個依賴于具體實現的SQL擴展。它可以用來修改SQLite庫的操作,或者查詢SQLite庫的內部(非表)數據。例如,pragma database_list命令將返回當前連接數據庫的列表。

而SELECT file FROM pragma_database_list命令則會產生當前加載數據庫的完整路徑。

dbb4c5e7721818f3c6b37c2288d905c5.png

圖7 顯示當前加載的數據庫的完整路徑

這意味著我們可以在實時加載數據庫之后生成數據庫的完整路徑。同樣,這也是在將數據庫保存到新建的、具有隨機路徑的臨時目錄之后完成的。現在,我們只需要一種方法來獲取該查詢的結果,并將其插入到軟件即將查詢的ModuleName屬性中即可。

什么是視圖?

為了達到上述目的,我們使用了數據庫的一個不太常用的功能:視圖。在數據庫中,視圖是一個存儲查詢的結果集。換句話說,視圖就像一個動態創建的表,它是在客戶端查詢時實時生成的。當客戶端查詢視圖時,數據庫會查詢為視圖定義的實際表,并根據視圖的設置對生成的數據進行重組,最后將完整的結果反饋給客戶端——整個過程對客戶端而言是透明的。從客戶端的角度來看,似乎正在查詢數據庫中找到的常規表。

97acf509827055fdbeaf6c84430de402.png

圖8 數據庫視圖和我們實時影響查詢的抽象方案

在我們的案例中,客戶端是EcoStruxure Operator Terminal Expert軟件,它查詢驅動程序數據庫以獲取ModuleName屬性,從而可以加載驅動程序DLL。我們的計劃是在數據庫被提取到臨時位置后,實時修改ModuleName屬性,最終讓ModuleName保存我們數據庫的實際路徑。

1+2=RCE:組合兩個漏洞,實現代碼執行攻擊

在項目文件中,我們需要準備一個名為ClarotyModule的目錄,其中含有如下所示的兩個文件:

  • Driver.xml

  • ClarotyModule.dll

我們將按照以下步驟準備DriverConfig.db:

  1. 我們將原來的Driver_0_Configuration_0表重命名為Driver_0_Configuration_0_ORIG。

  2. 我們將創建一個名為Driver_0_Configuration_0的VIEW表。

當客戶端查詢“原來的”表Driver_0_Configuration_0時,實際上會查詢我們新建的VIEW表。在查詢到ModuleName字段后,我們將VIEW表的內部處理設置為返回SELECT file FROM pragma_database_list的結果,并對其進行必要的修改,以構成正確的目錄遍歷語法。通過這種方式,我們可以在文件夾結構中向上、向下導航,直到抵達當前的臨時目錄中,也就是我們的payload DLL所在的位置。

7320c7bc1d4b3569864be2116f7f9037.png

圖9 精心構造一個驅動數據庫,使其實時包含我們DLL的路徑。

最后,我們把所有的部分重新打包成一個VXDZ項目文件。當受害者雙擊該文件時,我們的DLL將被加載,之后,我們的代碼也將被執行。

47310fb8b6708e073338f508194e58a7.png

圖10 POC運行時,會打開項目文件,并執行相應的代碼

小結

在本文中,我們為讀者詳細介紹了如何利用EcoStruxure Operator Terminal Expert讀取給定項目文件的方式,通過執行一些SQL backflips操作,誘導軟件加載我們提供的DLL,從而在打開項目文件時發動任意代碼執行攻擊。施耐德電氣公司已經修復了這些漏洞,并將其分配了相應的編號:CVE-2020-7494與CVE-2020-7496。

轉自先知社區

歡迎收藏并分享朋友圈,讓五邑人網絡更安全

fac23bc039f6ced75514477405a077e4.png

歡迎掃描關注我們,及時了解最新安全動態、學習最潮流的安全姿勢!

推薦文章

1

新永恒之藍?微軟SMBv3高危漏洞(CVE-2020-0796)分析復現

2

重大漏洞預警:ubuntu最新版本存在本地提權漏洞(已有EXP) 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260204.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu 網卡突然無法連接

今天要用到VM BT的Namp掃描服務器端口,發現橋接后無法使用。ifconfig 只看到 lo地址,看不到以太網網卡地址使用lspci 查看是否安裝了以太網網卡驅動lscpi | grep Ethernet02:01.0 Ethernet controller: Advanced Micro Devices [AMD] 79c970 [PCnet32 LA…

atitit.表單驗證 的dsl 本質跟 easyui ligerui比較

atitit.表單驗證的dsl 本質跟 easyui ligerui比較 1. DSL 聲明驗證 1 2. 自定義規則 1 3. 正則表達式驗證,可以擴展實現 2 4. 犯錯誤消息提示,generic canBeEmpty is good 3 5. Prevent the form to submit when invalid 3 6. 為空則不驗證,不為空則驗證&#xff0…

StartActivityForResult

StartActivity 用startActivityForResult(intent, requestcode);啟動子功能模塊activity onActivityResult(int requestCode, int resultCode, Intent data)對子activity返回進行判斷處理 public class StartActivity extends Activity implements OnClickListener {private Bu…

micropython 串口寫文件_MicroPython通過2G模塊串口收發短信

集成2G通信、定位模組,賦予物聯網特性。本例使用M6220,它是一款基于eSIM技術的2G模組,支持GSM/GPRS,提供GPS北斗雙模定位功能,并具備一定的數據處理能力,其2G工作頻段有GSM850、GSM900、DCS1800和PCS1900&a…

洛谷P1130 紅牌

題目描述 某地臨時居民想獲得長期居住權就必須申請拿到紅牌。獲得紅牌的過程是相當復雜 ,一共包括N個步驟。每一步驟都由政府的某個工作人員負責檢查你所提交的材料是否符合條件。為了加快進程,每一步政府都派了M個工作人員來檢查材料。不幸的是&#xf…

GPS坐標換算

30.8872 》——>300.8872*60 53.232 ——>530.232*60 13.9230: 53 13.92"30: 53 13.92"》3053/6013.92/360030.887199同經度兩點之間距離dla30.887m * [差值/(1/3600)] 30.887m * 差值 *3600 111193.2m * 差值 同緯度兩點之間距離dlo30.887m * [差值/(1…

企業級應用框架(五)IOC容器在框架中的應用

前言 在上一篇我大致的介紹了這個系列所涉及到的知識點,在本篇我打算把IOC這一塊單獨提取出來講,因為IOC容器在解除框架層與層之間的耦合有著不可磨滅的作用。當然在本系列前面的三篇中我也提供了一種基于反射的解耦方式,但是始終不是很優雅&…

后端開發需要學什么_都2020年了,還在糾結學什么語言?| 后端篇

幾個禮拜前,一個學弟問我:“Ray,我打算之后要找工作了,不過現在自己沒有特別深入的語言,最近想找一門好好學一下,你覺得學什么語言好呀?”我表示:“這個要看你求職方向、個人喜好、市…

python掃描ip的端口打開情況

我們的韓國bss系統上線之后,要求對主機的端口、資源使用進行統計,端口每個主機去看,太費勁了,所以,就寫了這樣一個小程序,不是很完美但是,可以用啊!哈哈哈,別噴&#xff…

flash java 通信,Flash到JavaScript的通信實例

從HTML可以發送數據到Flash,反過來也可以. 這個例子演示了如何應用Flash的Fscommand來發送數據到Javascript.簡要步驟:Flash中新建一個文件,保存為flash_to_javascript.fla創建一個文本域,設置成輸入文本(Input Text),選擇"border"以便我們能看到他,指定他的變量為in…

10個非常有用的CSS hack和技術

轉自&#xff1a;http://www.qianduan.net/10-useful-css-hacks-and-technique.html 1 – 跨瀏覽器的inline-block <style>li {width: 200px;min-height: 250px;border: 1px solid #000;display: -moz-inline-stack;display: inline-block;margin: 5px;zoom: 1;*display:…

Java的遞歸算法

遞歸算法設計的基本思想是&#xff1a;對于一個復雜的問題&#xff0c;把原問題分解為若干個相對簡單類同的子問題&#xff0c;繼續下去直到子問題簡單到可以直接求解&#xff0c;也就是說到了遞推的出口&#xff0c;這樣原問題就有遞推得解。 關鍵要抓住的是&#xff1a; &…

python list遍歷定位元素_python for循環,第二遍定位不到元素?

ycyzharry: 也不行&#xff0c;我的代碼import unittestimport timeimport xlrdfrom selenium import webdriverimport seleniumdef open_excel(filefile.xls):try:data xlrd.open_workbook(file)return dataexcept Exception as e:print(str(e))def excel_table_byindex(file…

發現Java程序中的Bug

昨天在CSDN上閱讀 "Java中十個常見的違規編碼"這篇文章時&#xff0c;無意中找到了3個 "發現Java程序中的Bug"工具。 文章地址&#xff1a;http://www.csdn.net/article/2012-09-11/2809829-common-code-violations-in-java其中&#xff0c; FindBugs? - …

原生php登錄注冊,原生php登陸注冊

本以為一個登陸注冊功能十來分鐘就寫好了&#xff0c;沒想到thinkPHP用久了&#xff0c;原生的php不會寫了最開始我直接寫了類和方法&#xff0c;在前臺傳遞參數給類的login方法(action"index.php/login"),嘗試幾次發現無法訪問&#xff0c;這才意識到&#xff0c;這…

SpringMVC REST 風格靜態資源訪問配置

1 在web.xml中使用默認servlet處理靜態資源&#xff0c;缺點是如果靜態資源過多&#xff0c;則配置量會比較大&#xff0c;一旦有遺漏&#xff0c;則會造成資源無法正常顯示或404錯誤。 <!-- 靜態資源訪問控制 --><servlet-mapping><servlet-name>default<…

生成對象

var c[name,age,city]; var d[xiaogang,12,anhui]; var a{}; for(var i0;i<3;i){a[c[i]]d[i]; } console.log(a); //返回 {name: "xiaogang", age: "12", city: "anhui"} 轉載于:https://www.cnblogs.com/xiaozhumaopao/p/6046823.html

3.寄存器(內存訪問)

CPU中&#xff0c;用16位來存儲一個字。高8位存放高位字節&#xff0c;低8位存放低位字節。內存存儲中&#xff0c;內存單元是字節單元&#xff08;1單元1字節&#xff09;&#xff0c;則一個字要用兩個地址連續的內存單元存放。內存存儲中&#xff0c;高位字節&#xff0c;和低…

shiro前后端分離_為什么要前后端分離?前后端分離的優點是什么?

隨著互聯網的高速發展以及IT開發技術的升級&#xff0c;前后端分離已成為互聯網項目開發的業界標準使用方式。在實際工作中&#xff0c;前后端的接口聯調對接工作量占HTML5大前端人員日常工作的30%-50%&#xff0c;甚至會更高。接下來千鋒小編分享的廣州HTML5大前端學習就給大家…

POJ 2152 Fire

算是我的第一個樹形DP 的題&#xff1a; 題目意思&#xff1a;N個城市形成樹狀結構。現在建立一些消防站在某些城市&#xff1b;每個城市有兩個樹形cost&#xff08;在這個城市建立消防站的花費&#xff09;&#xff0c;limit &#xff1b; 我們要是每個城鎮都是安全的&#xf…