樣本概況
樣本信息
文件名:
3a6cc90db63a6d09721886b6e3f795e32f355d42e8faef560349ec068a9435f1.rar
Size: 185528 bytes
Modified: 2020年4月24日, 12:27:20
MD5: 314E8105F28530EB0BF54891B9B3FF69
SHA1: 8C9B88EE829B880E4AF8B7CD7DCCCC16FAA2E413
CRC32: CBD16AD2
測試環境及工具
運行平臺:Windows 7 X64
系統監控工具:火絨劍
分析工具:IDA,OD,010editor
功能分析
樣本綜述
利用WinRAR漏洞(CVE-2018-20250)針對中東地區的定向攻擊樣本。該惡意ACE壓縮包內包含一個以恐怖襲擊事件爲誘餌的Office Word文檔,誘使受害者解壓文件,當受害者在本地計算機上通過WinRAR解壓該文件後便會觸發漏洞,漏洞利用成功後將內置的後門程序(Telegram Desktop.exe)釋放到用戶計算機啓動項目錄中,當用戶重啓或登錄系統都會執行該遠控木馬,從而控制受害者計算機。
詳細剖析
樣本流程
首先觀察此rar中有
其中word文檔爲
記錄了一次恐怖事件,因其敏感性,提高了樣本在受害者方傳播性
然後使用winrar打開或者解壓,發現在下面目錄創建了開機啓動
樣本利用漏洞分析
樣本利用漏洞介紹
此樣本利用了ACE文件驗證邏輯繞過漏洞(CVE-2018-20250), 攻擊不能跨盤符,即受害者進行解壓文件觸發漏洞時,必須在系統盤,且在不知道計算機主機名的情況下,只能在主瀏覽器的默認下載路徑下(C:\Users\Administrator\Downloads)或者桌面進行解壓,或者多猜幾個啓動項路徑。產生漏洞的DLL文件:UNACEV2.DLL,不能識別相對路徑,文件名部分必須爲絕對路徑。
影響到全球5多億的WinRAR用戶。究其漏洞產生的根本原因,發現問題的關鍵在於5.70 Beta 1之前版本的WinRAR使用了陳舊的動態鏈接庫unacev2.dll。該動態鏈接庫的編譯時間爲2005年,在處理ACE格式文件過程中發揮作用,然而卻無任何的基礎保護機制(ASLR, DEP 等)。所以當使用WinRAR對惡意構造的ACE文件進行解壓操作時,由於沒有對文件名進行充分過濾,產生了“目錄穿越”現象,其中隱藏的惡意文件可以實現被寫入計算機的任意目錄下,甚至可以寫入開機啓動項中,導致惡意文件的執行。經研究發現這種漏洞的影響非常廣,其影響範圍包括:
發佈時間早於5.70 Beta 1版本的WinRAR軟件;
使用unacev2.dll動態共享庫的解壓、文件管理類工具軟件。
樣本利用漏洞分析
unacev2.dll任意代碼執行漏洞缺陷概述
惡意ACE文件-》用戶利用winrar解壓或打開-》惡意木馬-》受害者重啓電腦-》惡意木馬執行。
當被攻擊者在不知情的情況下對其解壓釋放時,解壓軟件需要對解壓目標的相對路徑進行解析。此時unacev2.dll中的CleanPath函數因存在過濾不嚴導致目錄穿越漏洞,隱藏其中的惡意木馬將被寫至開機啓動項,最終用戶重啓電腦時將促成惡意木馬的執行。
所以需要研究unacev2.dll,經過資料發現關鍵函數爲ACEInitDll和ACEExtract,但是ida逆向難以分析參數定義,於是通過開源項目FarManager,此項目也是winrar創建這,可以觀察ACEInitDll和ACEExtract申明。如下:
其中ACEInitDll的參數pACEInitDllStruc 指針結構體比較關鍵,如下
根據發現此漏洞的Check Point的漏洞原理解析文章,重點關注其中幾個函數:
CleanPath、GetDevicePathLen函數、WinRAR Validators/Callbacks回調函數以及觸發目錄遍歷漏洞的sprintf函數。
CleanPath函數:下面是僞代碼
1.如果Path的第2、3個字符爲“:”、“\”,那麼將Path第4個字符之前的部分清除。
2.如果Path的第2個字符爲“:”,第3個字符不爲“\”,那麼將Path第3個字符之前的部分清除。
3.在Path中尋找“..\”出現的位置,PathTraversalPos將指向此位置。若找到,執行4;否則執行7。
4.如果PathTraversalPos指向的位置正是Path開始的位置(e.g...\some_folder\some_file.ext)或者PathTraversalPos指向位置的前一個字符是“\”,執行5;否則,執行6。
5.將Path第4個字符之前的部分清除,繼續在Path中尋找“..\”出現的位置,若找到,執行4;否則,執行7。
6.在Path+1處向後尋找“..\”出現的位置,若找到則執行步驟4;否則執行7。
7.返回Path。
這段僞代碼的大概流程可描述爲:由分析可知該函數的作用爲過濾一定格式的路徑序列,如盤符名:\是在步驟1被清除掉的,盤符名:是在步驟2被清除掉的;盤符名:\盤符名:是通過步驟1和步驟2兩個步驟清除掉的;而\..\是在步驟5被清除掉的。
GetDevicePathLen函數:
大概流程可描述爲:
1.如果Path中第1個字符爲“\”,執行2;否則,執行7。
2.如果Path中第2個字符爲“\”,執行3;否則,執行6。
3.如果在Path第3個字符之後沒有找到“\”,返回0;否則將SlashPos指向此位置。
4.如果在SlashPos+1之後沒有找到“\”,返回0;否則將SlashPos指向此位置。
5.將SlashPos指向位置減去Path指向位置再加1賦值給Result,然後執行步驟9。
6.Result賦值爲1,然後執行9。
7.如果Path第2個字符爲“:”,Result賦值爲2。
8.如果Path第3個字符爲“\”,Result值加1。
9.返回Result。
由分析可知該函數的作用爲檢查文件的相對路徑即Path,Result將作爲結果表示相對路徑的長度返回。可以將Result取值有兩種情況:非0和0。
例子如下:l 待檢查路徑爲C:\some_folder\some_file.ext則函數返回值3
l 待檢查路徑爲\some_folder\some_file.ext則函數返回值1
l 待檢查路徑爲some_folder\some_file.ext則函數返回值0
WinRAR Validators/Callbacks回調函數分析:
Return返回地是:
ACE_CALLBACK_RETURN_OK 否則,如果該回調函數不允許該操作,則它將返回以下常量:ACE_CALLBACK_RETURN_CANCEL,並且該操作將中止。
由分析可知該函數會對待提取文件的相對路徑進行檢查(其中僞代碼裏“SourceFileName”表示待提取文件的相對路徑),確保路徑滿足以下條件:
1.第一個字符不等於“\”或“/”;
2.文件名不以字符串“..\”或“../”開頭;
3.字符串中不存在“\..\”、“\../”、“/../”或“/..\”。
最後造成漏洞的函數
如果調用的結果GetDevicePathLen等於0,則sprintf如下所示:
sprintf(final_file_path, "%s%s", destination_folder, file_relative_path);
除此以外:
sprintf(final_file_path, "%s%s", "", file_relative_path);
所以綜上漏洞利用過程即:
所以這裏樣本ace文件構造的路徑如下
即C:\C:C:../appData\Roaming\Microsoft\Windows\start Menu\Programs \startup\Telegram Desktop.exe
如此路徑在經過先由CleanPath函數過濾轉換爲下列路徑,再次過程中刪除了“C:\C:”:
C:../appData\Roaming\Micro soft\Windows\sta rt Menu\Programs \startup\Telegra m Desktop.exe
接着接着由GetDevicePathLen函數驗證路徑序列得到返回2,故此目標文件夾將被忽略,將觸發目錄遍歷漏洞的sprintf函數。
接着由WinRAR的回調函數對解壓目標路徑進行驗證:
參考3.4中的驗證條件可發現上面得到最終路徑可以繞過路徑遍歷驗證。但是隻能回退一個文件夾。而我們需要在不知道用戶名的情況下將文件解壓縮到目標系統自啓文件夾。
最後分析文件提取完畢後的路徑“
如果從WinRAR安裝目錄中啓動解壓軟件,則“當前目錄”將是:
C:\Program Files\WinRAR
通過雙擊存檔文件或右鍵單擊存檔文件中的“extract”來執行WinRAR,則WinRAR的“當前目錄”將成爲存檔所在文件夾的路徑。
例如,如果存檔位於用戶的“下載”文件夾中,則WinRAR的“當前目錄”將爲:
C:\Users\用戶名xxx\Downloads,所以此時../目錄即C:\Users\用戶名xxx
所以在調用sprintf時候C:../appData\Roaming\Micro soft\Windows\sta rt Menu\Programs \startup\Telegra m Desktop.exe變爲了C: C:\Users\用戶名xxx\appData\Roaming\Microsoft\Windows\start Menu\Programs \startup\Telegram Desktop.exe。於是就將文件複製到了此目錄,此目錄就是開機啓動目錄。
下面就是如果利用此漏洞的注意點。因爲漏洞主要是由Winrar用來解壓ACE文件時使用的動態鏈接庫UNACEV2.dll引起的,UNACEV2.dll在處理filename時只校驗了CRC。故我們可以通過使用010Editor修改filename將惡意文件解壓到啓動目錄,但是在修改完成後,CRC校驗會失敗,所以我們還要再去修改CRC,比如利用此漏洞利用工具acefile.py腳本檢查文件:
要注意紅框內,首先用010修改filenames的字符串(字符串和字符串長度都要改)然後hdr_size即頭長度要改,最後修改hdr_crc。
比如我要製作一個漏洞利用樣本,首先用ace製作一個ace文件,如圖,記得選擇紅框的store full path
使用 acefile.py檢查
開始是這樣,所以使用010editor進行修改,首先原本是這樣
首先修改路徑,再計算filename長度爲50h
然後修改hdr_size之前是48(16進制就算30),然後增加的長度即路徑增加長度,路徑增加11h到50h增加了3Fh即10進制63,所以hdr_size變爲48+63=111即6Fh,所以改爲6F
然後使用acefile檢查crc,如下圖,提示從0x45c5變爲0xe46f,注意ace文件是小端模式,按着改就行
所以hdr_size和hdr_crc改完如下
acefile檢查crc正確
然後改個常用壓縮文件rar後綴,將起放在C:\Users\用戶名\xxx這種目錄下,比如下載目錄,exp就可以使用了,使用火絨劍等行爲檢測軟件觀察當解壓時候,
此時已將計算器拷到了開機啓動目錄,當電腦重啓時就會自動運行此程序。
總結
以上就是CVE-2018-20250的漏洞利用樣本與漏洞利用分析了,由此看出此漏洞有很大侷限性,exp只能在目錄:C:\users\當前用戶\C:\users\xxx的xxx級目錄下才能講起拷貝到開機自啓目錄,其他目錄都將在C:根目錄下直接創建一個AppData/.../test.exe,達不到開機自啓目錄。
參考
https://www.52pojie.cn/thread-1105652-1-1.html
https://research.checkpoint.com/2019/extracting-code-execution-from-winrar/