Winrar4.x的檔案欺騙漏洞利用指令碼

wyzsk發表於2020-08-19
作者: Xcode · 2014/03/31 14:24

0x00 背景


這幾天仔細研究了winrar4.x系列的副檔名欺騙漏洞的那篇文章,透過一些測試對其有了一些新的想法和建議。(準確的說應該不能算副檔名欺騙漏,不止副檔名,整個檔名都是可以欺騙的)

具體的漏洞成因相信文章中都很清楚了,簡單說一下:

zip格式中有2個filename,一般情況下,一般應用程式開啟zip時,預覽使用的是filename2,點選預覽也是以filename2方式開啟的,只有在解壓的時候才會使用filename1。然而在winrar4.x中,點選預覽是以預覽filename1方式開啟的。

這會造成什麼結果呢?當第一個filename為readme.exe,第二個filename為readme.txt時,用winrar4.x開啟時,你在程式視窗看到的檔名為readme.txt,然後你再點選檔案時卻是以readme.exe方式開啟,這就形成漏洞了。

文章給出瞭如何利用這個bug的方法,更改filename2即可。但是作者是手動操作的,那麼能不能寫成利用指令碼呢?這個filename2的長度有沒有要求,需不需要和filename1長度相同?這正是本文要研究的。

0x01 細節


在研究這個問題以前,先科普一下zip格式(想看詳細版的去網上下載APPNOTE.TXT)。

zip格式由3部分組成:

1.檔案內容源資料
2.目錄源資料
3.目錄結束標識結構

以只壓縮了一個檔案的zip檔案為例,大致格式為:

[file header]
[file data]
[data descriptor]
[central directory file header]
[end of central directory record]

其中關鍵的幾個欄位為:

[file header]: 

Offset           Bytes               Description 
18                 4                   Compressed size 
26                 2                   File name length (n) 
28                 2                   Extra field length (m) 
30                 n                   File name 
30+n               m                  Extra field 


[central directory file header]: 

Offset           Bytes            Description 
28                 2                   File name length (n) 
30                 2                   Extra field length (m) 
34                 2                   File comment length (k) 


[end of central directory record]: 

Offset           Bytes                Description 
12                 4                   Size of central directory (bytes) 
16                 4                   Offset of start of central directory, relative to start of archive 

在瞭解了zip基本格式後,我對winrar壓縮生成的zip檔案和用windows生成的zip檔案進行了分析,它們的區別是winrar的zip檔案在Extra field區段都進行了一些資料填充。

2014033020212771177.jpg

由於不清楚Extra field這部分的值會不會影響到winrar的校驗,所以根據不同情況做了幾個測試,當filename2長度改變時,並且對受filename2長度影響的所有欄位(除Extra field)進行修改後,檔案可以正常開啟。測試結果證明Extra field的值並不會影響winrar開啟zip檔案。

這樣一來,只要按照zip的格式,更改和filename2有關的所有欄位,就可以寫出一個利用指令碼了。

等等,該文章中同時提到了,這個漏洞存在有一個限制:解壓。如果你是以右鍵解壓開啟這個壓縮包的話,那麼只會使用filename1,和filename2無關,也就不存在這個漏洞了。作者在文章最後提到了可以利用LRO解決這個限制,那應該如何結合利用RLO呢?

用WinHex對正常zip檔案、使用了字元反轉的zip檔案進行分析:

2014033020214732907.jpg

透過對比分析可以看到,當使用含有RLO檔名的檔案進行壓縮時,壓縮的格式有點區別,繼續做了幾個測試,發現winrar在Extra field新增的資訊,不會影響到漏洞的利用。

據此可以將這兩個漏洞完美的結合在一起,寫成一個利用指令碼。

以python為例,具體思路為:

1.生成一個帶LRO的檔名的檔案,並用winrar壓縮為zip。在python中可以使用u'\u202e'來構造字串反轉,用os.system()函式來執行winrar命令。 
2.處理zip檔案中的資料,將filename2更改為自己需要定義的字串。按照zip格式依次讀取,修改filename2為新的字串,計算出新的長度,並且修改File name length2欄位,Sizeofcentraldirectory 和Offsetofstartofcentraldirectory欄位,處理好它們新的偏移位置。 
3.重新生成新的zip。 

在文章最後附上完整的利用指令碼WinrarExp.py

本程式只用於測試,僅供安全學習、研究所用,請勿用於非法用途,否則造成的一切後果自負。

使用方法:

#!bash
WinrarExp.py [-f <open file>][-s <forged name>][-v <reversed string>] 


-f表示要壓縮的檔案,比如1.exe -s表示要偽裝的檔名,比如readme.txt -v表示需要反轉的字串,該引數為選用。比如想要檔名反轉變成readmeEXE.jpg則引數只要設定為EXE.jpg

下載地址:WinrarExp.py

本文章來源於烏雲知識庫,此映象為了方便大家學習研究,文章版權歸烏雲知識庫!

相關文章