CVE-2018-20250漏洞實戰分析之目錄穿越篇

目錄

 

一、概述

二、漏洞介紹

三、漏洞分析

3.1 unacev2.dll任意代碼執行漏洞缺陷概述

3.2 CleanPath關鍵函數分析

3.3 GetDevicePathLen關鍵函數分析

3.4 WinRAR Validators/Callbacks回調函數分析

3.5 觸發目錄遍歷漏洞的sprintf函數

3.6 漏洞利用思路

四、漏洞實例分析與驗證

4.1 UNACEV2.dll校驗CRC引發漏洞

4.2 msf利用

五、心得體會

參考資料


PDF和攻擊視頻雙手呈上,一起交流學習

一、概述

衆所周知WinRAR是一款功能強大的壓縮包管理器,作爲檔案工具RAR在 Windows環境下,可用於備份數據、壓縮文件、解壓RAR/ZIP等格式的文件、創建RAR/ZIP等格式的壓縮文件,得到了較爲廣泛的應用。

2019年2月20日,Check Point團隊爆出了一個關於WinRAR存在19年的漏洞,不法分子可用利用該漏洞取得受害者計算機的控制權限。該團隊經過深入研究檢測相繼發現了WinRAR的四個安全漏洞,分別爲ACE文件驗證邏輯繞過漏洞(CVE-2018-20250)、ACE文件名邏輯驗證繞過漏洞(CVE-2018-20251)、ACE/RAR文件越界寫入漏洞(CVE-2018-20252)以及LHA/LZH文件越界寫入漏洞(CVE-2018-20253)。漏洞攻擊者可利用上述漏洞,通過誘使用戶使用WinRAR打開惡意構造的壓縮包文件,將惡意代碼寫入系統啓動目錄或者寫入惡意dll劫持其他軟件進行執行,實現對用戶主機的任意代碼執行攻擊。

國家信息安全漏洞共享平臺(CNVD)對上述漏洞的綜合評級爲“高危”,並於2019年2月21日收錄該系列漏洞(CNVD-2019-04911、CNVD-2019-04912、CNVD-2019-04913和CNVD-2019-04910,分別對應CVE-2018-20250、CVE-2018-20251、CVE-2018-20252和CVE-2018-20253),同時向外界發出安全公告。

二、漏洞介紹

CVE-2018-20250漏洞的發現在科技界引起了異常軒然大波,儘管這個漏洞的利用條件很有限,實際危害並不是很高,然而令人恐懼的是這個漏洞已經遺留了19年,並且影響到全球5多億的WinRAR用戶。究其漏洞產生的根本原因,發現問題的關鍵在於5.70 Beta 1之前版本的WinRAR使用了陳舊的動態鏈接庫unacev2.dll。該動態鏈接庫的編譯時間爲2005年,在處理ACE格式文件過程中發揮作用,然而卻無任何的基礎保護機制(ASLR, DEP 等)。所以當使用WinRAR對惡意構造的ACE文件進行解壓操作時,由於沒有對文件名進行充分過濾,產生了“目錄穿越”現象,其中隱藏的惡意文件可以實現被寫入計算機的任意目錄下,甚至可以寫入開機啓動項中,導致惡意文件的執行。經研究發現這種漏洞的影響非常廣,其影響範圍包括:

  • 發佈時間早於5.70 Beta 1版本的WinRAR軟件;
  • 使用unacev2.dll動態共享庫的解壓、文件管理類工具軟件。

結合騰訊玄武實驗室後續的檢測結果,可以發現除WinRAR軟件外,還包括6.2.0.0以及之前版本的Bandizip壓縮工具,5.9.8.10907以及之前版本的2345好壓,早於4.0.0.1170版本的360壓縮等共計38款壓縮軟件此漏洞影響。但好在相關的平臺,廠商,軟件提供商都在第一時間站了出來,積極應對該系列漏洞,目前網絡上漏洞利用原理已公開,廠商也已發佈新版本修復此漏洞。

仔細品位,可發現CVE-2018-20250此種漏洞思路比較簡單,在實際利用過程中簡單易用,因此備受病毒黑色產業的青睞。但WinRAR unacev2.dll任意代碼執行漏洞利用還存在一個明顯的不足,即需要受害者重啓系統後惡意代碼才能得以執行。在騰訊安全御見威脅情報中心對該類型漏洞攻擊的後期監控中,發現攻擊者對WinRAR漏洞利用的手段進行了升級創新,一定程度上減少了對受害者主動重啓系統的依賴,同時確保惡意木馬能在第一時間啓動,如比較有名的Lime-RAT遠控木馬,該遠控木馬的功能十分強大,可通過修改配置信息或者接收C2服務器(C&C的縮寫,遠程命令和控制服務器)指令,以實現文件加密勒索、挖礦和下載其他惡意組件等功能。此外木馬還可以監視剪切板,當檢測到受害者主機進行數字貨幣交易時,直接替換錢包地址達到搶錢目的,對比特幣礦工及數字加密幣交易的人羣危害極大。

三、漏洞分析

3.1 unacev2.dll任意代碼執行漏洞缺陷概述

                                                                                圖1 常見攻擊方式

該種方式是比較簡單常見的攻擊方式,攻擊者利用此漏洞構造惡意的壓縮文件,當被攻擊者在不知情的情況下對其解壓釋放時,解壓軟件需要對解壓目標的相對路徑進行解析。此時unacev2.dll中的CleanPath函數因存在過濾不嚴導致目錄穿越漏洞,隱藏其中的惡意木馬將被寫至開機啓動項,最終用戶重啓電腦時將促成惡意木馬的執行。

因此爲了該漏洞的深層原因,我們需要探究unacev2.dll的使用細節,通過對其進行代碼逆向,發現兩個關於ACE文件歸檔提取的關鍵函數:初始化函數ACEInitDll和提取函數ACEExtract。然而在IDA中難以查看這兩個函數的參數定義,於是另闢蹊徑在github中找到了一個同樣使用這種結構的開源項目FarManager,該項目使用此dll另外該項目的創建者也是WinRAR的創建者,具有較高的可信度。

下載完畢後通過使用sourceinsight程序編輯器打開FarManager工程,快速搜索關於ACEInitDll和ACEExtract的具體定義,其結果如下圖,本文僅展示函數在項目中的大概位置,具體定義讀者可自行實踐獲得:

                                                                                 圖2 ACEInitDll函數定義

 

 

                                                                              圖3 ACEExtract函數定義

其中pACEInitDllStruc 指針結構體比較關鍵,需要重點注意一下:


                                                                        圖4 pACEInitDllStruc指針結構體定義

結合Check Point團隊發佈的漏洞原理解析文章,下面結合IDA靜態分析對unacev2.dll進行深入研究,重點關注以下四個關鍵函數:CleanPath、GetDevicePathLen函數、WinRAR Validators/Callbacks回調函數以及觸發目錄遍歷漏洞的sprintf函數。

3.2 CleanPath關鍵函數分析

下面是關於CleanPath函數的僞代碼:

 

                                                                            圖5 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被清除掉的。

3.3 GetDevicePathLen關鍵函數分析

下面是關於GetDevicePathLen函數的僞代碼:

                                                                       圖6 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。例子如下:

  • 待檢查路徑爲C:\some_folder\some_file.ext則函數返回值3
  • 待檢查路徑爲\some_folder\some_file.ext則函數返回值1
  • 待檢查路徑爲some_folder\some_file.ext則函數返回值0

3.4 WinRAR Validators/Callbacks回調函數分析

下面是關於WinRAR Validators/Callbacks回調函數的僞代碼:

                                                    圖7 WinRAR Validators/Callbacks回調函數僞代碼

其中return返回的爲宏定義常量,具體含義可參考FarManager項目中的定義說明。

                                                                              圖8 宏定義常量定義

由分析可知該函數會對待提取文件的相對路徑進行檢查(其中僞代碼裏“SourceFileName”表示待提取文件的相對路徑),確保路徑滿足以下條件:

1.第一個字符不等於“\”或“/”;

2.文件名不以字符串“..\”或“../”開頭;

3.字符串中不存在“\..\”、“\../”、“/../”或“/..\”。

3.5 觸發目錄遍歷漏洞的sprintf函數

                                                        圖9 觸發目錄遍歷漏洞的sprintf函數在IDA中的位置

在IDA中最終定位到產生漏洞的真正元兇,即紅圈中的sprintf函數。在loc_40CC32基本塊的上方有兩個分支,而GetDevicePathLen的函數的調用結果影響着代碼流的走向。

如果調用GetDevicePathLen的結果等於0,則執行:

反之,則執行:

而最後一個sprintf即是觸發目錄遍歷漏洞的錯誤代碼,這意味着相對路徑實際上將被視爲應寫入/創建的文件/目錄的完整路徑。

3.6 漏洞利用思路

經過對解壓過程中unacev2.dll中起作用的若干關鍵函數模塊的分析,我們便可嘗試構造攻擊向量,構造思路如下圖所示:

                                                                                  圖10 攻擊向量構造思路

通過該思路我們可以找到一個找到了一個向量,它允許我們將文件提取到系統自啓動文件夾,而無需關心用戶名。下面我們正向分析它:

先由CleanPath函數過濾轉換爲下列路徑,再次過程中刪除了“C:\C:”:

接着由GetDevicePathLen函數驗證路徑序列得到返回2,故此目標文件夾將被忽略,將觸發目錄遍歷漏洞的sprintf函數。

  • 接着由WinRAR的回調函數對解壓目標路徑進行驗證:

參考3.4中的驗證條件可發現上面得到最終路徑可以繞過路徑遍歷驗證。但是隻能回退一個文件夾。而我們需要在不知道用戶名的情況下將文件解壓縮到目標系統自啓文件夾。

  • 最後分析文件提取完畢後的路徑

如果從WinRAR安裝目錄中啓動解壓軟件,則“當前目錄”將是:

然而通過雙擊存檔文件或右鍵單擊存檔文件中的“extract”來執行WinRAR,則WinRAR的“當前目錄”將成爲存檔所在文件夾的路徑。

例如,如果存檔位於用戶的“下載”文件夾中,則WinRAR的“當前目錄”將爲:

 

 

如果存檔位於Desktop文件夾中,則“當前目錄”路徑將爲:

 

所以當在桌面或是在下載文件夾中進行解壓操作時將得到最終路徑爲:

 

四、漏洞實例分析與驗證

對該漏洞的利用攻擊不能跨盤符,即受害者進行解壓文件觸發漏洞時,必須在系統盤,且在不知道計算機主機名的情況下,只能在主瀏覽器的默認下載路徑下(C:\Users\Administrator\Downloads)或者桌面進行解壓,或者多猜幾個啓動項路徑。另外產生漏洞的DLL文件即UNACEV2.DLL,不能識別相對路徑,所以漏洞利用條件還包括其文件名部分必須爲絕對路徑。

以下是幾種操作系統下的開機啓動項路徑,可以發現在個人PC上由於用戶名的多樣性故難以猜測到準確的路徑,而服務器上用戶名一般爲Administrator,所以這個漏洞在服務器上利用度比較高。

 

                                                                 表1 不同操作系統下的開機啓動項路徑

Win2003

C:\Documents and Settings\Administrator\「開始」菜單\程序\啓動

 

Win2008

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup

Win2012

C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup

Win7

C:\Users\用戶 \AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup

Win10

C:\Users\用戶\AppData\Roaming\Microsoft\Windows\Start- Menu\Programs\Startup

本次試驗使用的是Win7操作系統。

4.1 UNACEV2.dll校驗CRC引發漏洞

漏洞主要是由Winrar用來解壓ACE文件時使用的動態鏈接庫UNACEV2.dll引起的,UNACEV2.dll在處理filename時只校驗了CRC。故我們可以通過使用010Editor修改filename將惡意文件解壓到啓動目錄,但是在修改完成後,CRC校驗會失敗,所以我們還要再去修改CRC,具體過程請見下面的分析。

首先列出本次實驗的工具清單:

工具清單

虛擬機

VMware Workstation11.0.0

系統鏡像

Win7家庭版

WinRAR 5.60簡體中文版

https://www.rarlab.com/rar/winrar-x64-560sc.exe

Python-3.7.2-amd64.exe

https://www.python.org/ftp/python/3.7.2/python-3.7.2-amd64.exe

010Editor

https://download.sweetscape.com/010EditorWin64Installer901.exe

Wace和模板文件

https://github.com/360-A-Team/CVE-2018-20250

EXP

https://github.com/WyAtu/CVE-2018-20250

一切軟件安裝完畢後,下面正式進入實驗部分:

  • 創建一個簡單的bat文件,最終的漏洞利用便是將該文件寫入系統啓動項中:

  • 使用WinACE對1.bat進行壓縮,選擇store full path模式,得到文件1.ace:

紅色部分爲需要修改的內容,同時使用010Editor打開1.ace,對比可知(該ace文件爲小端模式):

 

第一個紅色框內爲:hdr_crc的值:0xC98C;

第二個紅色框內爲:filename即文件的名字,包括其路徑。前面的0x001A爲filename的長度,十進制爲26。

 

紅色框內爲:hdr_size,代表頭部大小,值爲0x0039表示其頭部大小57。

 

稍作修改:

  • 修改filename的長度:

  • 修改hdr_size:

  • 使用acefile.py解析ace文件,可以看到報錯,需要修改hdr_crc:

  • 使用acefile.py腳本檢查文件1.ace的header信息:

  • 修改完畢後另存爲1.rar(實際上不該也行,即下一步直接解壓1.ace):

  • 選擇解壓到當前文件夾或解壓到文件夾1都可以,可以看到bat文件成功解壓到開機啓動項裏。

  • 重啓電腦發現自動運行bat文件彈窗。

4.2 msf利用

msf是一個免費的、可下載的框架,它本身附帶數百個已知軟件漏洞的專業級漏洞攻擊工具,通過它可以很容易地獲取、開發並對計算機軟件漏洞實施攻擊。結合CVE-2018-20250漏洞,本小節實驗將實現後門程序的植入,從而復現一次比較有危害性的攻擊,具體實驗環境如下:

工具清單

虛擬機

VMware Workstation11.0.0

系統鏡像1

Win7家庭版

Win7 ip

192.168.116.147

系統鏡像2

kali-linux-2018.4-amd64.iso

內核版本2

4.18.0-kali2-amd64 #1 SMP Debian 4.18.10-2kali1 (2018-10-09) x86_64 GNU/Linux

Kali ip

192.168.116.128

  • 首先在kali環境下生成目標機器的後門程序,需要知道目標機器ip地址:

  • 接着拿到shell.exe後門程序後構造壓縮文件,可參考4.1節中惡意壓縮文件的構造過程。對構造後的文件使用acefile.py腳本檢查其header信息:

  • 對改造後的shell.ace文件選擇解壓到當前文件夾或解壓到文件夾shell都可以,可以看到bat文件成功解壓到開機啓動項裏。

 

  • 在kali中進入msfconsole,加載exploit/multi/handler模塊:

  • 設置本地主機ip地址及監聽端口,然後嘗試攻擊監聽exploit :

  • 重啓win7,發現kali中已滲透成功,拿到目標機器shell:

 

 

 

 

 

五、心得體會

在分析漏洞過程中,查閱了各種資料,本身漏洞利用機制比較容易理解,但是真正的利用原理是比較複雜的,需要閱讀相關項目的代碼以及需要在IDA中找到關鍵函數。結合文檔和靜態分析結果基本能把基本的邏輯搞明白,剩下的實踐過程相對比較簡單。

經過歲月的洗禮,如今在網上搜索WinRAR漏洞利用案例,可發現其利用手段在富有想象力與能動力的黑客手中已經更新出了很多版本。挑選兩個比較典型的升級版攻擊利用手段如下所示:

 

 

通過對該漏洞的分析實踐,筆者對解壓軟件中的一些模塊具有了更深的瞭解,特別在對WinRAR創建者的FarManager項目源碼閱讀過程中收穫頗豐。而對於漏洞攻擊利用的升級版本,由於時間有限沒有來得及深入研究,但隱約之中感覺到漏洞的利用手段在一定程度上具有相通之處,後續仍需鑽研學習之。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

參考資料

[1]Extracting a 19 Year Old Code Execution from WinRAR

https://research.checkpoint.com/extracting-code-execution-from-winrar/

[2] WinRAR目錄穿越漏洞淺析及復現(CVE-2018-20250)

https://mp.weixin.qq.com/s/KbDliC2e0_bkFFur4nx-LQ

[3] WinRAR漏洞CVE-2018-20250攻擊樣本分析

 http://www.52bug.cn/hkjs/5732.html

[4] CVE-2018-20250 winrar

https://www.cnblogs.com/threesoil/p/10534280.html

[5] [CVE-2018-20250]WinRAR漏洞淺談

https://www.landui.com/help/show-9239

[6] [漏洞復現]WinRAR目錄穿越漏洞(CVE-2018-20250)復現

https://www.cnblogs.com/fox-yu/p/10495236.html

[7] Metasploit使用後門程序滲透Windows7

http://www.myhack58.com/Article/html/3/8/2015/65031.htm

[8] 成功獲取WinRAR 19年曆史代碼執行漏洞

https://www.360zhijia.com/anquan/444960.html

[9] FarManager項目

https://github.com/FarGroup/FarManager

發佈了8 篇原創文章 · 獲贊 3 · 訪問量 7579
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章