ZIP已知明文攻擊深入利用
一、前言
你加密的壓縮包比你想象中的還不安全!
哪怕對于信息安全人員來說,很多時候給壓縮包加上一個密碼就以為的是萬事大吉了。但事實是,很多情況下,你的加密壓縮包,遠遠沒有你想象的安全。
二、內容概要
以往進行ZIP已知明文攻擊,通常需要一個完整的明文文件。而本文討論的攻擊方式只需要知道加密壓縮包內容的12個字節,即可進行攻擊破解降低了已知明文的攻擊難度。同時結合各類已知的文件格式,更擴寬了ZIP已知明文攻擊的攻擊面。
三、正文
3.1 ZIP已知明文攻擊的一般利用
以往出現在網絡安全競賽中的已知明文攻擊考點,或者大部分網上的文章,都需要知道加密zip文件中的一個完整明文文件并且要求明文以相同的標準被壓縮,這才有可能會攻擊成功。
其實傳統的已知明文攻擊要成功需要三個條件,在此我將條件列出來:
完整的明文文件
明文文件需要被相同的壓縮算法標準壓縮(也可理解為被相同壓縮工具壓縮)
明文對應文件的加密算法需要是 ZipCrypto Store
第三點是我們實際應用中常常會被忽略的因競賽中遇到的題目都是提前設置好的。
· AES256-Deflate/AES256-Store加密的文件不適用于明文攻擊。


ZIP的加密算法大致分為兩種ZipCrypto和AES-256,各自又分Deflate和Store。
ZipCrypto Deflate
ZipCrypto Store
AES-256 Deflate
AES-256 Store
ZipCrypto算是傳統的zip加密方式。只有使用ZipCrypto Deflate /Store才可以使用 ZIP已知明文攻擊進行破解。
傳統的ZIP已知明文攻擊利用,windows下可以使用AZPR,linux下可以使用pkcrack。
3.2 ZIP已知明文攻擊的深入利用
本文要探討的攻擊方法并不需要知道壓縮文件中完整的明文,只需在已知加密壓縮包中的少部分明文字節時即可進行攻擊破解。而各類文件都有其自身固定的文件格式,結合這類格式,極大擴展了ZIP明文攻擊的攻擊面。
具體要求如下:
至少已知明文的12個字節及偏移,其中至少8字節需要連續。
明文對應的文件加密方式為ZipCrypto Store
該方法對于ZIP加密的算法有要求,明文對應的文件加密方式需要為ZipCrypto Store。經測試,Winrar(v5.80)、7zip(v19.00)默認狀態下加密使用的就是AES256算法,直接排除。360壓縮(v4.0.0.1220)、好壓(v6.2)使用的是ZipCrypto,不固定使用Store或Deflate(如果要固定使用ZipCrypto Store算法加密,可以在壓縮的時候指定壓縮方式為“存儲”)。
以下破解用到的壓縮包,都是經360壓縮或者好壓加密打包的。
3.2.1 使用到的工具項目
bkcrack:https://github.com/kimci86/bkcrack
bkcrack安裝:
apt install cmake -y
cmake .
make //在src下生成bkcrack文件
cp bkcrack /usr/sbin/bkcrack //作為系統命令使用
bkcrack常用參數:
-c 提取的密文部分
-p 提取的明文部分
-x 壓縮包內目標文件的偏移地址 部分已知明文值
-C 加密壓縮包
-o offset -p參數指定的明文在壓縮包內目標文件的偏移量
在此我們不是“造輪子”,而是“使用輪子”,偏向于實操,利用已有的手段工具去解決現有的問題。話不多說,上實操案例。
3.3 實操案例
案例中演示的壓縮包等,都可在文末附件中下載。
3.3.1 加密文本破解
文本類文件被加密成zip時,有很大的概率以ZipCrypto Store方式加密存儲。
創建加密zip:
生成uuid,將字符串 “flag{16e371fa-0555-47fc-b343-74f6754f6c01}” 保存為flag.txt。然后用360壓縮將文件添加為加密ZIP: flag_360.zip

攻擊破解:
采用8+4的方式提取部分已知明文來進行攻擊測試,
flag{16e371fa-0555-47fc-b343-74f6754f6c01}
我們利用以下這部分明文,來進行攻擊破解:
*lag{16e3********************74f6********
-------------------------------------------------------------------------------------------------------------------
#準備已知明文
echo -n "lag{16e3" > plain1.txt //連續的8明文
echo -n "74f6" | xxd //額外明文的十六進制格式,37346636
#攻擊
bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636
#由于時間較長,為防止終端終端導致破解中斷,可以加點小技巧
bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log& //后臺運行,結果存入1.log
//加上time參數方便計算爆破時間
time bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log&
//查看爆破進度
tail -f 1.log
-------------------------------------------------------------------------------------------------------------------
注:· -p 指定的明文不需要轉換,-x指定的明文需要轉成十六進制
· 提到的偏移都是指 “已知明文在加密前文件中的偏移”。
歷時近16分鐘成功得到秘鑰,這不是壓縮包的加密密碼而是ZIP內部的三段秘鑰。

b21e5df4 ab9a9430 8c336475
使用該秘鑰進行解密:
bkcrack -C flag_360.zip -c flag.txt -k b21e5df4 ab9a9430 8c336475 -d flag.txt
3.3.2 利用PNG圖片文件頭破解
PNG文件頭:

89 50 4E 47 0D 0A 1A 0A 00 00 00 0D 49 48 44 52
滿足,12個字節的要求。拿一張圖片和一個flag.txt一起打包成加密ZIP壓縮包:png4.zip

攻擊破解:
-------------------------------------------------------------------------------------------------------------------
#準備已知明文
echo 89504E470D0A1A0A0000000D49484452 | xxd -r -ps > png_header
#攻擊
time bkcrack -C png4.zip -c 2.png -p png_header -o 0 >1.log&
tail -f 1.log
-------------------------------------------------------------------------------------------------------------------
耗時近7分鐘破解出秘鑰:e0be8d5d 70bb3140 7e983fff

利用秘鑰解密文件:
bkcrack -C png4.zip -c flag.txt -k e0be8d5d 70bb3140 7e983fff -d flag.txt

3.2.3 利用壓縮包格式破解
將一個名為flag.txt的文件打包成ZIP壓縮包后,你會發現文件名稱會出現在壓縮包文件頭中,且偏移固定為30。且默認情況下,flag.zip也會作為該壓縮包的名稱。

所以,當一個加密壓縮包中存在另一個ZIP壓縮包時,且能夠知道或猜測該壓縮包內的文件名稱時,可以嘗試進行已知明文攻擊。
將flag.zip與其他文件(選用一張圖片)一起用好壓打包成加密ZIP壓縮包:test5.zip

已知的明文片段有:
· “flag.txt” 8個字節,偏移30
· ZIP本身文件頭:50 4B 03 04 ,4字節
8+4,滿足了破解的最低要求
攻擊:
------------------------------------------------------------------------------------------------------------
echo -n "flag.txt" > plain1.txt //-n參數避免換行,不然文件中會出現換行符,導致攻擊失效
time bkcrack -C test5.zip -c flag.zip -p plain1.txt -o 30 -x 0 504B0304 >1.log&
tail -f 1.log
-------------------------------------------------------------------------------------------------------------
得到秘鑰:
b21e5df4 ab9a9430 8c336475

利用秘鑰解密:
bkcrack -C test5.zip -c flag.zip -k b21e5df4 ab9a9430 8c336475 -d flag.zip
flag.zip可以直接成功解密。
但若想解密2.png,由于是ZipCrypto deflate加密的,所以解密后需要bkcrack/tool內的inflate.py腳本再次處理。
----------------------------------------------------------------------------------------------------------------
bkcrack -C test5.zip -c 2.png -k b21e5df4 ab9a9430 8c336475 -d 2.png
python3 inflate.py < 2.png > 2_out.png
----------------------------------------------------------------------------------------------------------------
3.2.4 EXE文件格式破解
EXE文件默認加密情況下,不太會以store方式被加密,但它文件格式中的的明文及其明顯,長度足夠。如果加密ZIP壓縮包出現以store算法存儲的EXE格式文件很容易進行破解。
大部分exe中都有這相同一段,且偏移固定為64:

生成一個加密EXE的ZIP壓縮包進行測試:nc64.zip

攻擊破解:
--------------------------------------------------------------------------------------------------------------
#準備明文
echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > mingwen
#攻擊
time bkcrack -C nc64.zip -c nc64.exe -p mingwen -o64 >1.log&
#查看進度
tail -f 1.log
---------------------------------------------------------------------------------------------------------
很快就解出了秘鑰:

b21e5df4 ab9a9430 8c336475
解密:
bkcrack -C nc64.zip -c nc64.exe -k b21e5df4 ab9a9430 8c336475 -d nc64.exe
3.2.5 流量包pcapng格式解密
這個有例題:釣魚城杯-量子加密
具體格式介紹及解法參考官方的writeup,已打包在附件中

加密算法都是 Store

選用第二段文件頭格式:
00 00 4D 3C 2B 1A 01 00 00 00 FF FF FF FF FF FF FF FF
攻擊:
------------------------------------------------------------------------------------------------------
echo -n "00004D3C2B1A01000000FFFFFFFFFFFFFFFF" | xxd -r -ps > pcap_plain1
time bkcrack -C 3.zip -c capture.pcapng -p pcap_plain1 -o 6
----------------------------------------------------------------------------------------------------------

解密:
bkcrack -C 3.zip -c capture.pcapng -k e33a580c c0c96a81 1246d892 -d out.pcapng
3.2.6 網站相關文件破解
網站目錄中充斥著大量類型的文件哪怕被打包成加密ZIP,也很容易找到突破口。
例如:
robots.txt的文件開頭內容通常是User-agent: *
html文件開頭通常是
xml文件開頭通常是
在此以web.xml為例,web.xml 是網絡程序中的一個很重要的配置文件。
常見xml文件頭為:
網站目錄肯定會涉及到多級目錄,我們也同樣進行模擬。在文件夾中創建一個二級目錄“123”,并將一個web.xml放入該二級目錄中,然后打包成加密ZIP。

攻擊:
----------------------------------------------------------------------------------------------------------
echo -n '' > xml_plain
time bkcrack -C xml.zip -c 123/web.xml -p xml_plain -o 0 //注意相對路徑
----------------------------------------------------------------------------------------------------------
攻擊成功:

解密:
bkcrack -C xml.zip -c 123/web.xml -k e0be8d5d 70bb3140 7e983fff -d web.xml
3.2.7 SVG文件格式破解
xml格式的文件除了.xml以外,也包括.svg文件SVG是一種基于XML的圖像文件格式。

攻擊:
-------------------------------------------------------------------------------------------------------------
//已知明文
echo -n ' plain.txt
bkcrack -C secrets.zip -c spiral.svg -p plain.txt -o 0
-----------------------------------------------------------------------------------------------------------
攻擊成功:

解密:
------------------------------------------------------------------------------------------------------------
//解密 Store算法 直接解密即可
bkcrack -C secrets.zip -c spiral.svg -k c4038591 d5ff449d d3b0c696 -d spiral_deciphered.svg
//解密 deflate算法
bkcrack -C secrets.zip -c advice.jpg -k c4038591 d5ff449d d3b0c696 -d advice.deflate
//該文件使用了deflate算法壓縮的,解碼出來的是Deflate的數據流,因此須將其解壓縮。
python3 inflate.py < advice.deflate > advice.jpg
--------------------------------------------------------------------------------------------------------------
四、結尾
4.1 結語
以上這些案例只是給打擊做個示范,打開大家的思路,實際可用的場景有許多。例如一些CTF題目壓縮包的非預期解,或者網絡上資源的破解。
4.2 注意點
已知的明文長度越長,破解速度越快
圖片、文本格式文件、壓縮包是最容易以store算法被加密打包的
有時會出現攻擊得到了秘鑰,卻無法解密正確文件的情況
存在rbkcrack項目,增加了部分支持
4.3 附件下載
鏈接:https://pan.baidu.com/s/1fuuHYFHSU2e0eIAjO7FLfw
提取碼:t2y4