轉載自 https://www.cnblogs.com/ECJTUACM-873284962/p/9387711.html
(僅為打開方便)
破解Zip加密文件常用的幾種方法
前言
在互聯網的浪潮中,大家也許碰到過這種情況:
從網絡上下載了一個zip文件,最后卻發現它是用密碼保護的,或者自己用密碼加密了一個很重要zip文件,但是一段時間后忘記了密碼,無法打開。這個時候,我們就可能就需要對這個加密文件進行破解了。
而隨着計算機性能的提高,很多人可能覺得找到一個zip文件的密碼是一件很簡單的事情。
我將從一個Web安全狗&CTF選手的角度去解析如何去找到/破解一個Zip文件~
01.Zip屬性隱藏
我們先從最簡單的開始講起,可能很多人沒有去注意文件屬性一欄,往往有時候,加密者會把密碼放在屬性里面,例如下圖:
我們可以看到,這個Zip壓縮文件的密碼就是www.cnblogs.com了~
02.Zip偽加密
Zip偽加密是在文件頭的加密標志位做修改,進而再打開文件時識被別為加密壓縮包~
一個 Zip文件由三個部分組成:
壓縮源文件數據區+壓縮源文件目錄區+壓縮源文件目錄結束標志
下面我們來看下這個例子:
壓縮源文件數據區:
50 4B 03 04:這是頭文件標記(0x04034b50) 14 00:解壓文件所需 pkware 版本 00 00:全局方式位標記(有無加密) 08 00:壓縮方式 5A 7E:最后修改文件時間 F7 46:最后修改文件日期 16 B5 80 14:CRC-32校驗(1480B516) 19 00 00 00:壓縮后尺寸(25) 17 00 00 00:未壓縮尺寸(23) 07 00:文件名長度 00 00:擴展記錄長度 6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500 壓縮源文件目錄區: 50 4B 01 02:目錄中文件文件頭標記(0x02014b50) 3F 00:壓縮使用的 pkware 版本 14 00:解壓文件所需 pkware 版本 00 00:全局方式位標記(有無加密,這個更改這里進行偽加密,改為09 00打開就會提示有密碼了) 08 00:壓縮方式 5A 7E:最后修改文件時間 F7 46:最后修改文件日期 16 B5 80 14:CRC-32校驗(1480B516) 19 00 00 00:壓縮后尺寸(25) 17 00 00 00:未壓縮尺寸(23) 07 00:文件名長度 24 00:擴展字段長度 00 00:文件注釋長度 00 00:磁盤開始號 00 00:內部文件屬性 20 00 00 00:外部文件屬性 00 00 00 00:局部頭部偏移量 6B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001
壓縮源文件目錄結束標志:
50 4B 05 06:目錄結束標記 00 00:當前磁盤編號 00 00:目錄區開始磁盤編號 01 00:本磁盤上紀錄總數 01 00:目錄區中紀錄總數 59 00 00 00:目錄區尺寸大小 3E 00 00 00:目錄區對第一張磁盤的偏移量 00 00:ZIP 文件注釋長度
我們可以進行大膽的猜想:
如果把一個zip文件的文件頭或者加密標志位進行適當修改,那就可能會改變文件的可讀性~
我們可以用16進制編輯器添加文件頭或文件尾,即可修復zip。
上面這種方法相對比較麻煩,不太容易操作,在Mac OS及部分Linux(如Kali)系統中,可以直接打開偽加密的zip壓縮包,此時我們希望有種簡便而通用的方法該怎么辦呢?
我們推薦使用下面這種方法:
使用檢測偽加密的ZipCenOp.jar,解密后如果能成功打開zip包,則是偽加密,否則說明思路錯誤
ZipCenOp.jar的下載我已經傳到了本地,點擊下載即可~
下面舉個例子,如下是個被加密的文件,理由很簡單,文件夾后面跟了一個*~
使用ZipCenOp.jar(需java環境)使用方法:
java -jar ZipCenOp.jar r xxx.zip
我們對其使用如上命令進行解包,得下圖所示:
我們再看下這個文件:
發現文件夾后面跟的*消失了,說明這個文件就是偽加密文件~
當然啦,我們也可以對Zip文件進行偽加密~
java -jar ZipCenOp.jar e xxx.zip
03.暴力破解
顧名思義,就是逐個嘗試選定集合中可以組成的所有密碼,知道遇到正確密碼~
而字典攻擊的效率比爆破稍高,因為字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上~
而如果已知密碼的某幾位,如已知6位密碼的第3位是a,那么可以構造 ??a??? 進行掩碼攻擊,掩碼攻擊的原理相當於構造了第3位為a的字典,因此掩碼攻擊的效率也比爆破高出不少~
對這一類的zip問題,Windows下我使用的是ARCHPR~
點擊開始,進行爆破即可~下面是個演示,就花了4s的時間爆破出密碼是MIT~
而所謂的字典攻擊其實就是在字典選擇合適的情況下,用很短的時間就能找到密碼~如果需要字典的朋友可以私聊滴滴我,我可以發給你~
實例如下所示:
如果對Wifi密碼破解感興趣的同學可以關注我的B站ID:Angel_Kitty,我錄制過關於Wifi破解的視頻,視頻ID是:https://www.bilibili.com/video/av25852173/
而掩碼攻擊就是通過已知密碼的某幾位進行構造,如下示例我們構造了??T進行爆破,僅花了81ms就破解了~
04.明文攻擊
明文攻擊是一種較為高效的攻擊手段,大致原理是當你不知道一個zip的密碼,但是你有zip中的一個已知文件(文件大小要大於12Byte)或者已經通過其他手段知道zip加密文件中的某些內容時,因為同一個zip壓縮包里的所有文件都是使用同一個加密密鑰來加密的,所以可以用已知文件來找加密密鑰,利用密鑰來解鎖其他加密文件~
此時我們可以嘗試用ARCHPR或者pkcrack進行明文攻擊~
更新明文攻擊這部分文檔:https://www.cnblogs.com/ECJTUACM-873284962/p/9884416.html
舉個例子,下載鏈接在這里
我們可以看到readme.txt是加密壓縮包里的readme.txt的明文,所以可以進行明文攻擊~
將readme.txt壓縮成.zip文件,然后在軟件中填入相應的路徑即可開始進行明文攻擊,這里我們用ARCHPR進行演示~
可能有些朋友會說ARCHPR怎么行不通啊,一般是版本不對的問題~
如果還是有問題怎么辦呢?那就嘗試用下pkcrack
下載鏈接在這里:https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html
似乎網站日常會崩,所以我把文件上傳到了本地~
Windows版本:https://files.cnblogs.com/files/ECJTUACM-873284962/pkcrack-1.2.2-win32.zip
Linux版本:https://files.cnblogs.com/files/ECJTUACM-873284962/pkcrack-1.2.2.tar.gz
有些朋友在Windows下會出現如下錯誤:
那是因為pkcrack只支持32位的,所以運行這個需要在XP系統下進行
而選擇Linux的話則不需要這么麻煩,直接安裝就好了,還有一種更快的辦法~
我已經把項目上傳到Github上,文件在這里:https://github.com/AngelKitty/CTF-Tools/tree/master/pkcrack
我們寫個shell腳本就好了~
#!/bin/bash -ex wget https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz tar xzf pkcrack-1.2.2.tar.gz cd pkcrack-1.2.2/src make mkdir -p ../../bin cp extract findkey makekey pkcrack zipdecrypt ../../bin cd ../../
把文件保存,改為install.sh,然后跑到當前目錄下,給它加一個執行權限x
chmod 777 install.sh
或者直接可以:
chmod u+x install.sh
然后運行install.sh
./install.sh
然后當前目錄下會生成一個bin的文件夾,我們直接進入bin文件夾下,看到有pkcrack文件,直接對文件進行明文破解
./pkcrack -c "answer/key.txt" -p readme.txt -C Desktop.zip -P readme.zip
-C:要破解的目標文件(含路徑) -c:破解文件中的明文文件的名字(其路徑不包括系統路徑,從zip文件一層開始) -P:壓縮后的明文文件 -p:壓縮的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)
至於其他選項參看./pkcrack --help
pkcrack還有一個重要的選項是-d,后面跟一個文件名,比如decrypt.zip,表示解密后的zip文件輸出。據說這個命令可以加快解密時間,我嘗試過以后發現並沒有快多少,所以我花了兩個小時還沒跑出來密碼QAQ
05.CRC32碰撞
CRC32:CRC本身是“冗余校驗碼”的意思,CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。
在產生CRC32時,源數據塊的每一位都參與了運算,因此即使數據塊中只有一位發生改變也會得到不同的CRC32值,利用這個原理我們可以直接爆破出加密文件的內容~
具體算法實現參考百度百科:https://baike.baidu.com/item/CRC32/7460858?fr=aladdin
我們看個CRC32碰撞的例子:
flag是4位數,且CRC32值為56EA988D
我們可以寫出如下腳本:
#coding=utf=8 import binascii real = 0x56EA988D for y in range(1000,9999): if real == (binascii.crc32(str(y)) & 0xffffffff): print(y) print('End')
在 Python 2.x 的版本中,binascii.crc32 所計算出來的 CRC 值域為[-2^31, 2^31-1] 之間的有符號整數,為了要與一般CRC 結果作比對,需要將其轉為無符號整數,所以加上& 0xffffffff來進行轉換。如果是 Python 3.x 的版本,其計算結果為 [0, 2^32-1] 間的無符號整數,因此不需額外加上& 0xffffffff 。
腳本的運行結果如下,即為壓縮文件的內容:
拓展與補充
- zip在線爆破:https://passwordrecovery.io/zip-file-password-removal/
- 使用fcrackzip破解zip保護密碼:http://topspeedsnail.com/fcrackzip-crack-zip-password/