WinRAR 程式碼執行漏洞復現
0x01 漏洞描述
近日Check Point團隊爆出了一個關於WinRAR存在19年的漏洞,用它來可以獲得受害者計算機的控制。攻擊者只需利用此漏洞構造惡意的壓縮檔案,當受害者使用WinRAR解壓該惡意檔案時便會觸發漏洞。
該漏洞是由於 WinRAR 所使用的一個陳舊的動態連結庫UNACEV2.dll所造成的,沒有任何的基礎保護機制(ASLR, DEP 等)。動態連結庫的作用是處理 ACE 格式檔案。而WinRAR解壓ACE檔案時,由於沒有對檔名進行充分過濾,導致其可實現目錄穿越,將惡意檔案寫入任意目錄,甚至可以寫入檔案至開機啟動項,導致程式碼執行。
0x0 2 漏洞 影響
影響版本:
WinRAR < 5.70 Beta 1
Bandizip < = 6.2.0.0
好壓(2345壓縮) < = 5.9.8.10907
360壓縮 < = 4.0.0.1170
0x0 3 漏洞復現
該漏洞的實現過程:首先新建一個任意檔案,然後利用 WinACE 進行壓縮,修改 filename 來實現目錄穿越漏洞,可以將檔案解壓到任意目錄中。
主要所需工具 WinACE 、 010Editor 。
下載 WinACE 並安裝,安裝完成後新建一個文字檔案,名字任意。
然後利用 WinACE 進行壓縮。
然後我們下載 acefile.py 指令碼。
下載地址為:
https://github.com/droe/acefile/blob/master/acefile.py
使用命令 pyt hon acefile.py --headers liehu.ace 來讀取該檔案頭資訊。
根據漏洞的描述,問題是出現在 filename 中的。那主要就看下面的 header 吧。
用 010Editor 開啟該檔案。
需要看選中的部分。對比 acefile 解析的結果,並明白各個段對應的內容。
如果要修改 filename ,則需要修改上面標註這幾處。第一處為 0x4e9a( hdr crc ), 第二處為 0x0044( hdr size ) ,第三處為 0x0025(filename 的長度),以及最後一處為 filenam e 。
修改順序是由後到前。
這裡修改 filename 為 d:\d:\liehu.txt
長度為 15 ,對應的 hex 為 0x000f
然後修改 hdr_size ,長度為 46 ,對應的 hex 為 0x002E 。
接下來就是修改 hdr_crc 了,這裡有一個取巧的方法。
我們再次執行命令 python acefile.py --headers liehu.ace
程式中斷並提示 CorruptedArchiveError: header CRC failed
定位到錯誤的位置
這裡 ace_crc16(buf) 的值就是 ace 檔案 0x4e9a 對應的值,直接打印出該值並將該位置的值修改即可。
對應的值為 63232 ,轉換為 hex 為 0xF700 。
最後檔案內容為
再次檢視,可以正常解析,並看到 filename 已經修改成功
右鍵解壓該檔案,則會在 D 盤生成一個 liehu.txt 檔案。
測試檔案:
https://fuping.site/files/liehu.ace
解壓後會在D盤生成一個liehu.txt檔案
0x0 4 修復建議
有兩種方式
1. 升級到最新版本 , WinRAR 目前版本是 5.70 Beta 1
2. 刪除 UNACEV2.dll 檔案
此時再次解壓 惡意檔案會提示如下錯誤:
0x0 5 參考
https://research.checkpoint.com/extracting-code-execution-from-winrar/