ZIP已知明文攻击深入利用
?
首發(fā)在:https://www.freebuf.com/articles/network/255145.html
?
一、前言
你加密的壓縮包比你想象中的還不安全!
 哪怕對(duì)于信息安全人員來(lái)說(shuō),很多時(shí)候給壓縮包加上一個(gè)密碼就以為的是萬(wàn)事大吉了。但事實(shí)是,很多情況下,你的加密壓縮包,遠(yuǎn)遠(yuǎn)沒(méi)有你想象的安全。
二、內(nèi)容概要
以往進(jìn)行ZIP已知明文攻擊,通常需要一個(gè)完整的明文文件。 而本文討論的攻擊方式只需要知道加密壓縮包內(nèi)容的12個(gè)字節(jié),即可進(jìn)行攻擊破解降低了已知明文的攻擊難度。同時(shí),結(jié)合各類已知的文件格式,更擴(kuò)寬了ZIP已知明文攻擊的攻擊面。
三、正文
3.1 ZIP已知明文攻擊的一般利用
以往出現(xiàn)在網(wǎng)絡(luò)安全競(jìng)賽中的已知明文攻擊考點(diǎn),或者大部分網(wǎng)上的文章,都需要知道加密zip文件中的一個(gè)完整明文文件并且要求明文以相同的標(biāo)準(zhǔn)被壓縮,這才有可能會(huì)攻擊成功。
 其實(shí)傳統(tǒng)的已知明文攻擊要成功需要三個(gè)條件,在此我將條件列出來(lái):
- 完整的明文文件
- 明文文件需要被相同的壓縮算法標(biāo)準(zhǔn)壓縮(也可理解為被相同壓縮工具壓縮)
- 明文對(duì)應(yīng)文件的加密算法需要是 ZipCrypto Store
第三點(diǎn)是我們實(shí)際應(yīng)用中常常會(huì)被忽略的。因競(jìng)賽中遇到的題目,都是提前設(shè)置好的。
· AES256-Deflate/AES256-Store加密的文件不適用于明文攻擊。
ZIP的加密算法大致分為兩種ZipCrypto和AES-256,各自又分Deflate和Store。
- ZipCrypto Deflate
- ZipCrypto Store
- AES-256 Deflate
- AES-256 Store
ZipCrypto算是傳統(tǒng)的zip加密方式。只有使用ZipCrypto Deflate /Store才可以使用 ZIP已知明文攻擊進(jìn)行破解。
 傳統(tǒng)的ZIP已知明文攻擊利用,windows下可以使用AZPR,linux下可以使用pkcrack。
3.2 ZIP已知明文攻擊的深入利用
本文要探討的攻擊方法并不需要知道壓縮文件中完整的明文,只需在已知加密壓縮包中的少部分明文字節(jié)時(shí)即可進(jìn)行攻擊破解。而各類文件都有其自身固定的文件格式,結(jié)合這類格式,極大擴(kuò)展了ZIP明文攻擊的攻擊面。
 具體要求如下:
- 至少已知明文的12個(gè)字節(jié)及偏移,其中至少8字節(jié)需要連續(xù)。
- 明文對(duì)應(yīng)的文件加密方式為ZipCrypto Store
該方法對(duì)于ZIP加密的算法有要求,明文對(duì)應(yīng)的文件加密方式需要為ZipCrypto Store。經(jīng)測(cè)試,Winrar(v5.80)、7zip(v19.00)默認(rèn)狀態(tài)下加密使用的就是AES256算法,直接排除。360壓縮(v4.0.0.1220)、好壓(v6.2)使用的是ZipCrypto,不固定使用Store或Deflate(如果要固定使用ZipCrypto Store算法加密,可以在壓縮的時(shí)候指定壓縮方式為“存儲(chǔ)”)。
以下破解用到的壓縮包,都是經(jīng)360壓縮或者好壓加密打包的。
3.2.1 使用到的工具項(xiàng)目
bkcrack:https://github.com/kimci86/bkcrack
bkcrack安裝:
 apt install cmake -y
 cmake .
 make ? ? //在src下生成bkcrack文件
 cp bkcrack /usr/sbin/bkcrack ? ?//作為系統(tǒng)命令使用
bkcrack常用參數(shù):
 -c 提取的密文部分
 -p 提取的明文部分
 -x 壓縮包內(nèi)目標(biāo)文件的偏移地址 ?部分已知明文值
 -C 加密壓縮包
 -o offset ?-p參數(shù)指定的明文在壓縮包內(nèi)目標(biāo)文件的偏移量
在此我們不是“造輪子”,而是“使用輪子”,偏向于實(shí)操,利用已有的手段工具去解決現(xiàn)有的問(wèn)題。話不多說(shuō),上實(shí)操案例。
3.3 實(shí)操案例
案例中演示的壓縮包等,都可在文末附件中下載。
3.3.1 加密文本破解
 文本類文件被加密成zip時(shí),有很大的概率以ZipCrypto Store方式加密存儲(chǔ)。
創(chuàng)建加密zip:
 生成uuid,將字符串 “flag{16e371fa-0555-47fc-b343-74f6754f6c01}” 保存為flag.txt。然后用360壓縮將文件添加為加密ZIP: flag_360.zip
攻擊破解:
 采用8+4的方式提取部分已知明文來(lái)進(jìn)行攻擊測(cè)試,
 flag{16e371fa-0555-47fc-b343-74f6754f6c01}
我們利用以下這部分明文,來(lái)進(jìn)行攻擊破解:
 *lag{16e3********************74f6********
#準(zhǔn)備已知明文
 echo -n "lag{16e3" > plain1.txt ? //連續(xù)的8明文
 echo -n "74f6" | xxd ? ? ? ? ? ? //額外明文的十六進(jìn)制格式,37346636
#攻擊
 bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636
#由于時(shí)間較長(zhǎng),為防止終端終端導(dǎo)致破解中斷,可以加點(diǎn)小技巧
 bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log& //后臺(tái)運(yùn)行,結(jié)果存入1.log
//加上time參數(shù)方便計(jì)算爆破時(shí)間
 time bkcrack -C flag_360.zip -c flag.txt -p plain1.txt -o 1 -x 29 37346636 > 1.log&
//查看爆破進(jìn)度
 tail -f 1.log
注:· -p 指定的明文不需要轉(zhuǎn)換,-x指定的明文需要轉(zhuǎn)成十六進(jìn)制
 · 提到的偏移都是指 “已知明文在加密前文件中的偏移”。
歷時(shí)近16分鐘,成功得到秘鑰,這不是壓縮包的加密密碼,而是ZIP內(nèi)部的三段秘鑰。
b21e5df4 ab9a9430 8c336475
 ?
使用該秘鑰進(jìn)行解密:
 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個(gè)字節(jié)的要求。拿一張圖片和一個(gè)flag.txt一起打包成加密ZIP壓縮包:png4.zip
攻擊破解:
 #準(zhǔn)備已知明文
 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
 耗時(shí)近7分鐘破解出秘鑰:e0be8d5d 70bb3140 7e983fff
 利用秘鑰解密文件:
 ? ? ? ? ?bkcrack -C png4.zip -c flag.txt -k e0be8d5d 70bb3140 7e983fff -d flag.txt
?
3.2.3 利用壓縮包格式破解
將一個(gè)名為flag.txt的文件打包成ZIP壓縮包后,你會(huì)發(fā)現(xiàn)文件名稱會(huì)出現(xiàn)在壓縮包文件頭中,且偏移固定為30。且默認(rèn)情況下,flag.zip也會(huì)作為該壓縮包的名稱。
所以,當(dāng)一個(gè)加密壓縮包中存在另一個(gè)ZIP壓縮包時(shí),且能夠知道或猜測(cè)該壓縮包內(nèi)的文件名稱時(shí),可以嘗試進(jìn)行已知明文攻擊。
將flag.zip與其他文件(選用一張圖片)一起用好壓打包成加密ZIP壓縮包:test5.zip
已知的明文片段有:
 · “flag.txt” ?8個(gè)字節(jié),偏移30
 · ZIP本身文件頭:50 4B 03 04 ? ? ,4字節(jié)
8+4,滿足了破解的最低要求
攻擊:
 echo -n "flag.txt" > plain1.txt? ? ?//-n參數(shù)避免換行,不然文件中會(huì)出現(xiàn)換行符,導(dǎo)致攻擊失效
 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內(nèi)的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文件默認(rèn)加密情況下,不太會(huì)以store方式被加密,但它文件格式中的的明文及其明顯,長(zhǎng)度足夠。如果加密ZIP壓縮包出現(xiàn)以store算法存儲(chǔ)的EXE格式文件,很容易進(jìn)行破解。
 大部分exe中都有這相同一段,且偏移固定為64:
生成一個(gè)加密EXE的ZIP壓縮包進(jìn)行測(cè)試:nc64.zip
攻擊破解:
 #準(zhǔn)備明文
 echo -n "0E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000" | xxd -r -ps > mingwen
#攻擊
 time bkcrack -C nc64.zip -c nc64.exe -p mingwen -o64 ?>1.log&
#查看進(jìn)度
 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格式解密
 這個(gè)有例題: 釣魚(yú)城杯-量子加密?
 具體格式介紹及解法參考官方的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 網(wǎng)站相關(guān)文件破解
 網(wǎng)站目錄中充斥著大量類型的文件,哪怕被打包成加密ZIP,也很容易找到突破口。
例如:
 ? ? ? robots.txt的文件開(kāi)頭內(nèi)容通常是User-agent: *?
 ? ? ? html文件開(kāi)頭通常是 <!DOCTYPE html>
 ? ? ? ?xml文件開(kāi)頭通常是<?xml version="1.0" encoding="UTF-8"?>
?
在此以web.xml為例,web.xml 是網(wǎng)絡(luò)程序中的一個(gè)很重要的配置文件。
常見(jiàn)xml文件頭為:
 ? ? ? ? ? ? <?xml version="1.0" encoding="UTF-8"?>
?
網(wǎng)站目錄肯定會(huì)涉及到多級(jí)目錄,我們也同樣進(jìn)行模擬。在文件夾中創(chuàng)建一個(gè)二級(jí)目錄“123”,并將一個(gè)web.xml放入該二級(jí)目錄中,然后打包成加密ZIP。
攻擊:
 echo -n '<?xml version="1.0" encoding="UTF-8"?>' > xml_plain
 time bkcrack -C xml.zip -c 123/web.xml -p xml_plain -o 0 ?//注意相對(duì)路徑
 ?
?
攻擊成功:
解密:
 ? ? ? ? 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 '<?xml version="1.0" ' > 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算法壓縮的,解碼出來(lái)的是Deflate的數(shù)據(jù)流,因此須將其解壓縮。
 python3 inflate.py < advice.deflate > advice.jpg
 ?
四、結(jié)尾
4.1 結(jié)語(yǔ)
以上這些案例只是給打擊做個(gè)示范,打開(kāi)大家的思路,實(shí)際可用的場(chǎng)景有許多。例如一些CTF題目壓縮包的非預(yù)期解,或者網(wǎng)絡(luò)上資源的破解。
4.2 注意點(diǎn):
- 已知的明文長(zhǎng)度越長(zhǎng),破解速度越快
- 圖片、文本格式文件、壓縮包是最容易以store算法被加密打包的
- 有時(shí)會(huì)出現(xiàn)攻擊得到了秘鑰,卻無(wú)法解密正確文件的情況
- 存在rbkcrack項(xiàng)目,增加了部分支持
4.3 附件下載:
 ? ? ? 鏈接:https://pan.baidu.com/s/1fuuHYFHSU2e0eIAjO7FLfw?
 ? ? ?提取碼:t2y4
4.4 參考文章:
 ? ? ??https://www.aloxaf.com/2018/10/zip_crack/
? ? ??https://zhuanlan.zhihu.com/p/129855130
 ?
總結(jié)
以上是生活随笔為你收集整理的ZIP已知明文攻击深入利用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: windows抓屏排除指定窗口
- 下一篇: ubuntu找不到无线网络
