【CTF 攻略】CTF比賽中關於zip的總結


【CTF 攻略】CTF比賽中關於zip的總結

 

 

http://p7.qhimg.com/t01007d83b18784c1e1.png

 

本文首發於安全客,建議到原地址閱讀,地址: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文檔如下圖

http://p8.qhimg.com/t01cb8a360f3b83d016.png

經過觀察,所有數據都在16進制能表示的范圍之內,因此先嘗試使用十六進制編碼解密,python腳本如下:

http://p2.qhimg.com/t01aaf8de14274818fd.png

運行結果如下,雖然存在大量亂碼,但還是能看到flag.txt,因此猜測txt中的這段字符是zip包的16進制表示(同時開頭的PK也暗示這是一個zip包,PK是zip格式發明者Phil Katz的名稱縮寫,zip的前兩個字母就用了PK)

http://p8.qhimg.com/t0171b3752feff9cadf.png

導入到16進制編輯器中,這里用010editor做演示

http://p9.qhimg.com/t0144afe8f16d1cf41f.png

導入后選擇 Save As(快捷鍵 ctrl + shift + s),給新文件命名時加上后綴.zip,保存后發現zip文件是正常的,因此證明思路正確,此題的后續過程請繼續閱讀這篇文章

http://p9.qhimg.com/t011d9d4e958c885c8a.png

另:除了16進制的編碼轉換,有時還會遇到2進制編碼的轉換,思路相同,不再復述

 

0x02. 在圖片中隱藏壓縮包(圖種


這種方法大概是zip中最常見的,多用於在一張圖片中隱藏一個壓縮包,這種方法的原理是:以jpg格式的圖片為例,一個完整的 JPG 文件由 FF D8 開頭,FF D9結尾,圖片瀏覽器會忽略 FF D9 以后的內容,因此可以在 JPG 文件中加入其他文件。

也以一道題為例為例(ISCC 2017 Basic-07),對於這種隱寫最簡單的方法是使用Kali下的binwalk進行檢測,binwalk 圖片名 如下,檢測出圖片中存在壓縮包

http://p4.qhimg.com/t01450907fe31159c81.png

分離這個壓縮包也有至少兩種方法:

1. 利用Linux下的foremost工具, foremost 圖片名 如下,foremost默認的輸出文件夾為output,在這個文件夾中可以找到分離出的zip(推薦使用這種方法,因為foremost還能分離出其他隱藏的文件)

http://p5.qhimg.com/t01349dfeb32fa8f00e.png

2. 更簡單粗暴的方法是直接把圖片的后綴改為.zip,然后解壓即可(這種方法雖然簡單快速,但如果隱寫了多個文件時可能會失敗)

http://p6.qhimg.com/t01190041289b545c68.png

另:本題后續步驟為構造字典,爆破握手包

 

0x03. 偽加密


Zip偽加密與zip的文件格式有關(zip的格式詳解請翻到本文的最后0x07部分),zip中有一位是標記文件是否加密的,如果更改一個未加密zip包的加密標記位,那么在打開壓縮包時就會提示該文件是加密的。

對於偽加密有以下幾種方法:

1. 在Mac OS及部分Linux(如Kali)系統中,可以直接打開偽加密的zip壓縮包

2. 使用檢測偽加密的ZipCenOp.jar,解密后如果能成功打開zip包,則是偽加密,否則說明思路錯誤

3. 使用16進制編輯器改回加密標記位

以HBCTF的一道題講解這幾種方法:

http://p5.qhimg.com/t01a009da383e529f49.png

如上,嘗試解壓壓縮包時提示有密碼,根據題干:比爆破更好的方法推測為偽加密,用三種方法來解此題:

1. 用除windows外的系統直接打開壓縮包

在Mac OS和部分Linux系統(如Kali)中,右鍵解壓可直接打開偽加密的zip壓縮包,筆者暫未明確何種Linux能打開偽加密壓縮包,如有傳授,不勝感激!

2. 使用ZipCenOp.jar(需java環境) 使用方法

1
java -jar ZipCenOp.jar r xxx.zip

http://p6.qhimg.com/t01d7a8a7a2474c4337.png

經ZipCenOp.jar解密后的壓縮包可直接打開

http://p1.qhimg.com/t015bf711f1a744ff2d.png

推薦使用這種方法,最便捷

3. 用16進制編輯器修改加密標記位

http://p1.qhimg.com/t015dbef209fe99fc31.png

如上圖,修改加密標記位為00,保存,即可打開壓縮包(關於zip文件的結構,請翻到本文最末0x07部分)

 

0x04. 爆破/字典/掩碼攻擊


把這三種歸位一類是因為這三種方法在本質上都是逐個嘗試,只不過待選密碼的集合不同

1. 爆破:顧名思義,逐個嘗試選定集合中可以組成的所有密碼,知道遇到正確密碼

2. 字典:字典攻擊的效率比爆破稍高,因為字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上

3. 掩碼攻擊:如果已知密碼的某幾位,如已知6位密碼的第3位是a,那么可以構造 ??a??? 進行掩碼攻擊,掩碼攻擊的原理相當於構造了第3位為a的字典,因此掩碼攻擊的效率也比爆破高出不少

對這一類的zip問題,推薦windows下的神器AZPR

舉例如下:

1. 對爆破,以ISCC 2017 Basic-08為例,選定暴力攻擊、字符集和長度后進行爆破

http://p7.qhimg.com/t018a6f366fcf9b3f21.png

http://p4.qhimg.com/t010afd7e4440281a23.png

點擊開始,進行爆破,如下圖,在4ms內就找到了密碼為BIT

http://p0.qhimg.com/t01811a7e2dcb89cade.png

另:此題后續為簡單的base64解密;爆破在密碼長度小於6位時較快,因此如果在7位之內沒有爆破出結果時,基本就可以考慮換個方法了;此題的正規解法是培根密碼的轉換

2. 字典,還以之前的ISCC 2017 Basic-07舉例,從圖片中分離出一個加密的zip壓縮包,爆破無果后考慮字典攻擊(可從網上下載字典,但大多數題目需要自己構造字典,文末的網盤連接里提供了常見的字典)

http://p6.qhimg.com/t0161c303af1040467f.png

字典攻擊的結果如下圖,在字典選擇合適的情況下,用很短的時間就能找到密碼

http://p0.qhimg.com/t01f20c62ea9613230d.png

繼續以此題為例,解壓后的壓縮包有一個txt文檔和一個握手包,txt內容如下:

http://p1.qhimg.com/t016b6d12c62d06a5ad.png

因此可知握手包的密碼為ISCC****的形式(*代表大寫字母或數字),自己寫程序構造字典

http://p9.qhimg.com/t01023e96e1a806e82c.png

運行此程序得到字典如下:

http://p4.qhimg.com/t01ebdf87a5ebae3d3a.png

之后用aircrack-ng來選中字典跑除握手包的密碼如下圖,不再詳述

http://p5.qhimg.com/t014ad5b26364cf618f.png

3. 掩碼攻擊,以ISCC 2017 Misc-06為例,題目給了一個jpg圖片,用0x02中的方法分離出加密的壓縮包,根據題目提示:注意署名, 構造????LiHua的掩碼(?可在自己定義的字符集中任意選擇)進行掩碼攻擊,如下圖:

http://p6.qhimg.com/t01df197bb44c6ff8da.png

攻擊結果如下,只耗費了很少的時間就找到了密碼

http://p9.qhimg.com/t011e91c09434272596.png

 

0x05. 明文攻擊


明文攻擊是一種較為高效的攻擊手段,大致原理是當你不知道一個zip的密碼,但是你有zip中的一個已知文件(文件大小要大於12Byte)時,因為同一個zip壓縮包里的所有文件都是使用同一個加密密鑰來加密的,所以可以用已知文件來找加密密鑰,利用密鑰來解鎖其他加密文件,更詳細的原理請讀者自行谷歌

舉個例子,已知 明文攻擊.zip 中存在的文件 明文.txt,

因此將 明文.txt 壓縮,這里需要判斷明文壓縮后的CRC32是否與加密文件中的一致,若不一致可以換一個壓縮工具。

http://p4.qhimg.com/t0112994a09cc25c574.png

攻擊過程如下:

http://p2.qhimg.com/t0170f27bf19e30b533.png

點擊開始,很快就恢復了密碼

http://p4.qhimg.com/t016abbabfa89c43970.png

另:當明文的大小比較小時,攻擊速度會比較慢;即使有時沒有恢復密碼,也可以使用明文攻擊,最后點保存還是能得到壓縮包里內容的。

 

0x06. CRC32碰撞


CRC32:CRC本身是“冗余校驗碼”的意思,CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。

在產生CRC32時,源數據塊的每一位都參與了運算,因此即使數據塊中只有一位發生改變也會得到不同的CRC32值,利用這個原理我們可以直接爆破出加密文件的內容

還是以之前HBCTF偽加密那道題為例,另一種解法就是CRC32碰撞,打開壓縮包,可以看出壓縮文件 flag6位數

的CRC32值為0x9c4d9a5d

http://p4.qhimg.com/t01b82b48613741c1c9.png

因此寫出碰撞的腳本如下:

http://p1.qhimg.com/t01a640855d935796bf.png

要特別注意

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 。

腳本的運行結果如下,即為壓縮文件的內容:

http://p5.qhimg.com/t01e060547556133ddc.png

再舉另一個bugku中的例子,下載下來的文件是68個壓縮包,並且根據binwalk的檢查結果,每個壓縮包里都有一個大小為4個字節,名為out.txt的壓縮文件

http://p0.qhimg.com/t010586f8c300e85b02.png

用如下的腳本碰撞出所有壓縮包中的數據:

http://p9.qhimg.com/t01be844b801390f33c.png

http://p7.qhimg.com/t0113a72419e06317f1.png

此題較為繁瑣,之后的步驟不再展開

另:限於CPU的能力,CRC碰撞只能用於壓縮文件較小的情況

 

0x07. 修改格式


這種情況花樣較多,難以做一個詳細的總結,因此只列舉最常見的缺少文件頭或文件尾。

放一個zip文件格式講的較清楚的鏈接,通過對zip文件格式的了解,可以解釋之前偽加密的問題,同時也可以對缺少文件頭或文件尾有更直觀的認識。

http://p5.qhimg.com/t0159fc55b30cd3e507.png

如上為正常zip,缺頭zip和缺尾zip的binwalk掃描結果,根據掃描結果用16進制編輯器添加文件頭或文件尾,即可修復zip。

 

總結


Zip不僅是我們生活中常用到的一種文件格式,在CTF中也經常遇到,這里做了一個關於CTF中zip的總結,如果對讀者有幫助,鄙人不勝榮幸。

 


本文由 安全客 原創發布,如需轉載請注明來源及本文地址。
本文地址:http://bobao.360.cn/ctf/detail/203.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM