Yale 合天智彙
01漏洞背景
2019 年2 月 20日 @NadavGrossman 發表了一篇關于他如何發現一個在WinRAR 中存在19 年的邏輯問題以至成功實作代碼執行的文章。
WinRAR 代碼執行相關的CVE 編号如下:
CVE-2018-20250,CVE-2018-20251, CVE-2018-20252, CVE-2018-20253
該漏洞是由于WinRAR 所使用的一個陳舊的動态連結庫UNACEV2.dll所造成的,該動态連結庫在2006 年被編譯,沒有任何的基礎保護機制(ASLR,DEP 等)。該動态連結庫的作用是處理ACE 格式檔案。而在解壓處理過程中存在一處目錄穿越漏洞,允許解壓過程寫入檔案至開機啟動項,導緻代碼執行。
02準備工作
下載下傳安裝winace,一路預設安裝即可
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZ2MTMmRTYlhTMwkDNxITZ0gjZycjNhlzNzIzN0UmN08CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
建立一個demo檔案夾,建立名為test的文本文檔,内容如下
使用winace打開
點選右上角file->create
陰影部分下拉框選擇storefull path
點選add即可
此時在demo檔案夾下生成了test.ace
03熟悉ACE格式
接下來使用16進制編輯器打開(winhex,010Editor也行),此處使用010Editor進行
待會兒需要在這兒修改一些資料
接下啦先gitclone https://github.com/droe/acefile
我們需要使用acefile.py來進行校驗等操作,這是python3寫的,它的功能是
1、可以提取ACE檔案。
2、包含有關ACE檔案格式的簡要說明。
3、有一個非常有用的功能,列印檔案格式标題和解釋
win上沒有3的環境,是以我使用kali來進行
首先下載下傳test.ace
然後檢視檔案頭資訊
回顯如下
關鍵參數詳細說明:
·hdr_crc:
兩個CRC字段存在于2個标頭中。如果CRC與資料不比對,則中斷提取。
·檔案名:
檔案名包含檔案的相對路徑。在提取過程中(包括檔案)建立相對路徑中指定的所有目錄。檔案名的大小由十六進制轉儲中的2個位元組(小端)定義。
·advert:
如果使用未注冊版本的WinACE建立存檔,則在建立ACE存檔期間,WinACE會自動添加廣告字段。
·檔案内容:
“origsize” -内容的大小。
“hdr_size” –頭部大小。
上圖可以看到crc為0xc5e9,size為63,這個63是十進制,轉換為16進制為
而在010Editor中看到的是相反的(小端序),如c5e9,在下圖則是e9c5,003f在下圖則是3f00
另外還有個參數就是檔案名長度,使用acefile沒檢測,我們可以手動檢視
陰影部分即檔案名,長度在最下面的選區中可以看到是20h,即對應陰影選中前的2000
04構造惡意檔案
很明顯,crc受限于檔案内容,size受限于檔案内容,檔案名長度受限于檔案檔案名,是以需要從檔案内容、檔案名開始修改
(使用010Editor的好處就是可以直接在左側進行修改)
下圖橙色的就是我們修改的内容
把helloworld改成byeworld,檔案名改成了evil.txt
之後按照上面的分析,我們需要修改檔案名長度這個參數
長度為1bh,是以将2000改為1b00即可
然後修改size
大小為3ah,将陰影前的3f00(原size)修改為3a00(現在的size)
接下來修改CRC,crc怎麼修改呢?crc是循環備援校驗,根據檔案自有的算法得出,那麼我們怎麼才能得到修改後的檔案的CRC呢?
别忘了我們之前的acefile.py,這個腳本為了擷取ace檔案資訊,肯定會先對ace檔案進行校驗,檢視它的代碼找到校驗邏輯不就好了?
代碼很長,通讀不顯示,不如把剛才修改後的檔案先校驗一下,看看會出什麼提示,然後根據關鍵字去定位代碼段
重新在kali下載下傳修改後的ace
然後檢測
果然提示檔案頭CRC校驗出錯
根據關鍵字定位到代碼片段
根據邏輯,3060行的判斷成立時則會抛出crc校驗出錯的提示,為此,我們可以列印出if判斷的對象,即ace_crc16(buf)
在3061行插入一句代碼即可
再次運作
36050便是我們的crc了
同樣轉成16進制
将相應位置資料修改為D28C即可
儲存後再次校驗
沒有出錯,并且顯示了頭資訊
到這一步,我們的惡意檔案就制作完成了。
05執行攻擊
受害者如果按照平時的情況解壓
則會在我們設定好的路徑下解壓出惡意檔案
06修複
1.盡快更新到最新版本的WinRAR
下載下傳位址如下
32位:http://win-rar.com/fileadmin/winrar-versions/wrar57b1.exe
64位:http://win-rar.com/fileadmin/winrar-versions/winrar-x64-57b1.exe
2.删除UNACEV2.dll
找到所使用的壓縮檔案,右鍵打開檔案所在位置
在打開的檔案夾下删除該檔案即可
07參考
https://research.checkpoint.com/extracting-code-execution-from-winrar/
本文為合天原創,未經允許,嚴禁轉載