【CTF 攻略】CTF比賽中關於zip的總結
本文首發於安全客,建議到原地址閱讀,地址:http://bobao.360.cn/ctf/detail/203.html
前言
在CTF比賽的MISC和CRYPTO中,經常要和zip壓縮包打交道,這里做一個zip方面的總結。
本文中用到的所有文件和工具都可在這個網盤中找到http://pan.baidu.com/s/1bWQxyA
目錄
隱寫篇
0x01. 通過進制轉換隱藏信息
0x02. 在圖片中隱藏壓縮包(圖種)
加密篇
0x03. 偽加密
0x04. 爆破/字典/掩碼攻擊
0x05. 明文攻擊
0x06. CRC32碰撞
格式篇
0x07. 修改格式
0x01. 通過進制轉換隱藏信息
這種方法比較簡單,直接拿一道題講解(題目來自ISCC 2017 Basic-04)。題目給了一個txt文檔如下圖
經過觀察,所有數據都在16進制能表示的范圍之內,因此先嘗試使用十六進制編碼解密,python腳本如下:
運行結果如下,雖然存在大量亂碼,但還是能看到flag.txt,因此猜測txt中的這段字符是zip包的16進制表示(同時開頭的PK也暗示這是一個zip包,PK是zip格式發明者Phil Katz的名稱縮寫,zip的前兩個字母就用了PK)
導入到16進制編輯器中,這里用010editor做演示
導入后選擇 Save As(快捷鍵 ctrl + shift + s),給新文件命名時加上后綴.zip,保存后發現zip文件是正常的,因此證明思路正確,此題的后續過程請繼續閱讀這篇文章
另:除了16進制的編碼轉換,有時還會遇到2進制編碼的轉換,思路相同,不再復述
0x02. 在圖片中隱藏壓縮包(圖種)
這種方法大概是zip中最常見的,多用於在一張圖片中隱藏一個壓縮包,這種方法的原理是:以jpg格式的圖片為例,一個完整的 JPG 文件由 FF D8 開頭,FF D9結尾,圖片瀏覽器會忽略 FF D9 以后的內容,因此可以在 JPG 文件中加入其他文件。
也以一道題為例為例(ISCC 2017 Basic-07),對於這種隱寫最簡單的方法是使用Kali下的binwalk進行檢測,binwalk 圖片名 如下,檢測出圖片中存在壓縮包
分離這個壓縮包也有至少兩種方法:
1. 利用Linux下的foremost工具, foremost 圖片名 如下,foremost默認的輸出文件夾為output,在這個文件夾中可以找到分離出的zip(推薦使用這種方法,因為foremost還能分離出其他隱藏的文件)
2. 更簡單粗暴的方法是直接把圖片的后綴改為.zip,然后解壓即可(這種方法雖然簡單快速,但如果隱寫了多個文件時可能會失敗)
另:本題后續步驟為構造字典,爆破握手包
0x03. 偽加密
Zip偽加密與zip的文件格式有關(zip的格式詳解請翻到本文的最后0x07部分),zip中有一位是標記文件是否加密的,如果更改一個未加密zip包的加密標記位,那么在打開壓縮包時就會提示該文件是加密的。
對於偽加密有以下幾種方法:
1. 在Mac OS及部分Linux(如Kali)系統中,可以直接打開偽加密的zip壓縮包
2. 使用檢測偽加密的ZipCenOp.jar,解密后如果能成功打開zip包,則是偽加密,否則說明思路錯誤
3. 使用16進制編輯器改回加密標記位
以HBCTF的一道題講解這幾種方法:
如上,嘗試解壓壓縮包時提示有密碼,根據題干:比爆破更好的方法推測為偽加密,用三種方法來解此題:
1. 用除windows外的系統直接打開壓縮包
在Mac OS和部分Linux系統(如Kali)中,右鍵解壓可直接打開偽加密的zip壓縮包,筆者暫未明確何種Linux能打開偽加密壓縮包,如有傳授,不勝感激!
2. 使用ZipCenOp.jar(需java環境) 使用方法
1
|
java -jar ZipCenOp.jar r xxx.zip
|
經ZipCenOp.jar解密后的壓縮包可直接打開
推薦使用這種方法,最便捷
3. 用16進制編輯器修改加密標記位
如上圖,修改加密標記位為00,保存,即可打開壓縮包(關於zip文件的結構,請翻到本文最末0x07部分)
0x04. 爆破/字典/掩碼攻擊
把這三種歸位一類是因為這三種方法在本質上都是逐個嘗試,只不過待選密碼的集合不同
1. 爆破:顧名思義,逐個嘗試選定集合中可以組成的所有密碼,知道遇到正確密碼
2. 字典:字典攻擊的效率比爆破稍高,因為字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上
3. 掩碼攻擊:如果已知密碼的某幾位,如已知6位密碼的第3位是a,那么可以構造 ??a??? 進行掩碼攻擊,掩碼攻擊的原理相當於構造了第3位為a的字典,因此掩碼攻擊的效率也比爆破高出不少
對這一類的zip問題,推薦windows下的神器AZPR
舉例如下:
1. 對爆破,以ISCC 2017 Basic-08為例,選定暴力攻擊、字符集和長度后進行爆破
點擊開始,進行爆破,如下圖,在4ms內就找到了密碼為BIT
另:此題后續為簡單的base64解密;爆破在密碼長度小於6位時較快,因此如果在7位之內沒有爆破出結果時,基本就可以考慮換個方法了;此題的正規解法是培根密碼的轉換
2. 字典,還以之前的ISCC 2017 Basic-07舉例,從圖片中分離出一個加密的zip壓縮包,爆破無果后考慮字典攻擊(可從網上下載字典,但大多數題目需要自己構造字典,文末的網盤連接里提供了常見的字典)
字典攻擊的結果如下圖,在字典選擇合適的情況下,用很短的時間就能找到密碼
繼續以此題為例,解壓后的壓縮包有一個txt文檔和一個握手包,txt內容如下:
因此可知握手包的密碼為ISCC****的形式(*代表大寫字母或數字),自己寫程序構造字典
運行此程序得到字典如下:
之后用aircrack-ng來選中字典跑除握手包的密碼如下圖,不再詳述
3. 掩碼攻擊,以ISCC 2017 Misc-06為例,題目給了一個jpg圖片,用0x02中的方法分離出加密的壓縮包,根據題目提示:注意署名, 構造????LiHua的掩碼(?可在自己定義的字符集中任意選擇)進行掩碼攻擊,如下圖:
攻擊結果如下,只耗費了很少的時間就找到了密碼
0x05. 明文攻擊
明文攻擊是一種較為高效的攻擊手段,大致原理是當你不知道一個zip的密碼,但是你有zip中的一個已知文件(文件大小要大於12Byte)時,因為同一個zip壓縮包里的所有文件都是使用同一個加密密鑰來加密的,所以可以用已知文件來找加密密鑰,利用密鑰來解鎖其他加密文件,更詳細的原理請讀者自行谷歌
舉個例子,已知 明文攻擊.zip 中存在的文件 明文.txt,
因此將 明文.txt 壓縮,這里需要判斷明文壓縮后的CRC32是否與加密文件中的一致,若不一致可以換一個壓縮工具。
攻擊過程如下:
點擊開始,很快就恢復了密碼
另:當明文的大小比較小時,攻擊速度會比較慢;即使有時沒有恢復密碼,也可以使用明文攻擊,最后點保存還是能得到壓縮包里內容的。
0x06. CRC32碰撞
CRC32:CRC本身是“冗余校驗碼”的意思,CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。
在產生CRC32時,源數據塊的每一位都參與了運算,因此即使數據塊中只有一位發生改變也會得到不同的CRC32值,利用這個原理我們可以直接爆破出加密文件的內容
還是以之前HBCTF偽加密那道題為例,另一種解法就是CRC32碰撞,打開壓縮包,可以看出壓縮文件 flag6位數
的CRC32值為0x9c4d9a5d
因此寫出碰撞的腳本如下:
要特別注意
1
|
if (binascii.crc32(str(i)) & 0xffffffff) == crc:
|
在 Python 2.x 的版本中,binascii.crc32 所計算出來的 CRC 值域為[-2^31, 2^31-1] 之間的有符號整數,為了要與一般CRC 結果作比對,需要將其轉為無符號整數,所以加上& 0xffffffff來進行轉換。如果是 Python 3.x 的版本,其計算結果為 [0, 2^32-1] 間的無符號整數,因此不需額外加上& 0xffffffff 。
腳本的運行結果如下,即為壓縮文件的內容:
再舉另一個bugku中的例子,下載下來的文件是68個壓縮包,並且根據binwalk的檢查結果,每個壓縮包里都有一個大小為4個字節,名為out.txt的壓縮文件
用如下的腳本碰撞出所有壓縮包中的數據:
此題較為繁瑣,之后的步驟不再展開
另:限於CPU的能力,CRC碰撞只能用於壓縮文件較小的情況
0x07. 修改格式
這種情況花樣較多,難以做一個詳細的總結,因此只列舉最常見的缺少文件頭或文件尾。
放一個zip文件格式講的較清楚的鏈接,通過對zip文件格式的了解,可以解釋之前偽加密的問題,同時也可以對缺少文件頭或文件尾有更直觀的認識。
如上為正常zip,缺頭zip和缺尾zip的binwalk掃描結果,根據掃描結果用16進制編輯器添加文件頭或文件尾,即可修復zip。
總結
Zip不僅是我們生活中常用到的一種文件格式,在CTF中也經常遇到,這里做了一個關於CTF中zip的總結,如果對讀者有幫助,鄙人不勝榮幸。
本文由 安全客 原創發布,如需轉載請注明來源及本文地址。
本文地址:http://bobao.360.cn/ctf/detail/203.html