01概述
AdvantechWebAccess(前稱BroadWin-WebAccess)是研華(Advantech)公司的一套基于瀏覽器架構的HMI/SCADA軟件。該軟件支持動態圖形顯示和實時數據控制,并提供遠程控制和管理自動化設備的功能,在工業領域有者廣泛的應用。
AdvantechWebAccess軟件一直是漏洞挖掘者的最愛,ZDI的一篇報告中指出曾經一天內收到100個關于AdvantechWebAccess軟件漏洞的上報,ICS-CERT中亦有大量相關漏洞紕漏。最近關注了該軟件的CVE-2017-16720/ CNVD-2018-00670漏洞,有的地方描述該漏洞為路徑遍歷漏洞,有的描述為RCE漏洞,且給出了不同的評分。那么其到底是以什么漏洞?深入分析一下便可知曉。
02初步分析
很顯然ZDI對該漏洞做了更加詳細的紕漏,一眼看過去0x2711IOCTL?IOCTL是設備驅動程序中對設備的I/O通道進行管理的函數,難道這個漏洞與驅動有關?經過大量資料查閱,最終找到了相關解釋:
原來是AdvantechWebAccess軟件中該服務的函數調用形式與Windows設備IO控制函數調用非常相似,故沿用了該叫法。從這段解釋中,同時也可以發現該服務默認運行于TCP4592端口,可基于RPC協議進行遠程訪問控制。納尼?和RPC扯上關系了?到底是一個什么洞?先搭環境跑PoC再說。
03漏洞調試分析
下載AdvantechWebAccess V.8.0(該漏洞在<=8.3.2中均存在)在Win7x64虛擬機中安裝,相應端口開放情況如下圖所示:
既然漏洞與RPC協議相關,使用RpcView對該進程進行查看:
選取webvrpcs.exe進程,可以很方便的獲取到RPC服務端口(TCP592)、接口的uuid和version信息。
在https://www.exploit-db.com/exploits/44278獲取PoC代碼并執行,靶機中的Calc.exe成功運行,可發現存在RPC協議交互數據:
對目標文件(webvrpcs.exe)進行IDA逆向查看,由于該服務(webvrpcs.exe)使用了RPC協議,啟用IDA插件mIDA提取代碼中的RPC接口并重建相關的IDL(Interface Definition Language)文件,在IDA中得到以下結果:
對PoC代碼進行走讀,第一步為連接建立,三次RPC call中第三次需要用到第二次的返回的context handle,作為第三次call的參數,RPC協議正是利用這種模式在Server與Client之間建立穩定連接的:
由此可以看到第一個Call似乎沒有太多用處(最后可以作驗證)。由于漏洞函數指向0×2711 IOCTL,且在Call的過程中使用的opcode為1,因此在mIDA的輸出中,首先選擇opcode 0×01,右擊Decompile,得到函數原型如下:
可見該函數有5個參數,與最終傳入Call的stubdata相對應:4個數字型和一個string型參數。
開啟IDA調試器,從sub_401260入手進行單步調試,發現從開始到最終calc.exe得到執行,整個過程中函數調用順序為:
1、webvrpcs.exe:sub_401260
2、webvrpcs.exe:sub_402c60
3、webvrpcs.exe:sub_4046D0
4、drawsrv.dll:DsDaqWebService
5、drawsrv.dll:sub_100017B0
對于第4個函數DsDaqWebService需要對drawsrv.dll進行檢查,可見EDX中保存了IOCTL的值,在IDA把代碼進行縮小,可發現有非常多的分支/跳轉,而EAX的值最終決定了函數的下一步跳轉到哪個分支:
進過幾步跳轉,最終來到問題函數,查看偽代碼如下:
函數sub_100017B0起了一個新進程,且帶有參數lpCommandLine,函數中調用了Windows API CreateProcessA,且將參數lpCommandLine直接傳入,對于函數CreateProcessA的詳細使用方式可查閱Windows API,同時結合Windows在系統中搜索文件的規則,該參數可以使用類似PoC中使用的形式
command ="....windowssystem32calc.exe"
同時亦可直接使用:
command = "calc.exe"
對上述想法進行驗證:首先注銷第一個RPC Call, 其次將Payload中的command換成如上所示,再次執行仍然可以成功彈出計算器。
04總結
從對漏洞整個分析以及PoC分析來看,此漏洞應定性為遠程代碼執行漏洞而非路徑遍歷漏洞,且漏洞具有非常大的危害,此前研華公司先后聲稱在V8.3、V8.3.1等版本中已經修補此漏洞,但實際漏洞均存在,當前最新版本的V8.4.0中漏洞已經得到修復。另外,從IDA分析中可以發現問題函數附近存在大量跳轉,這意味者漏洞的觸發可能存在多種方式(于是就是多個不同的CVE了),而從以往已公開的漏洞情況來看,有大量漏洞與本文分析的CVE-2017-16720相似的,小伙伴們,擼起袖子加油干,大量CVE等待收割。