隱寫篇
0x01. 通過進(jìn)制轉(zhuǎn)換隱藏信息
0x02. 在圖片中隱藏壓縮包(圖種)
加密篇
0x03. 偽加密
0x04. 爆破/字典/掩碼攻擊
0x05. 明文攻擊
0x06. CRC32碰撞
格式篇
0x07. 修改格式
0x01. 通過進(jìn)制轉(zhuǎn)換隱藏信息
這種方法比較簡(jiǎn)單,直接拿一道題講解(題目來自ISCC 2017 Basic-04)体箕。題目給了一個(gè)txt文檔如下圖
經(jīng)過觀察刨沦,所有數(shù)據(jù)都在16進(jìn)制能表示的范圍之內(nèi)眶诈,因此先嘗試使用十六進(jìn)制編碼解密避诽,python腳本如下:
運(yùn)行結(jié)果如下医男,雖然存在大量亂碼,但還是能看到flag.txt,因此猜測(cè)txt中的這段字符是zip包的16進(jìn)制表示(同時(shí)開頭的PK也暗示這是一個(gè)zip包佑稠,PK是zip格式發(fā)明者Phil Katz的名稱縮寫,zip的前兩個(gè)字母就用了PK)
導(dǎo)入到16進(jìn)制編輯器中旗芬,這里用010editor做演示
導(dǎo)入后選擇 Save As(快捷鍵 ctrl + shift + s)舌胶,給新文件命名時(shí)加上后綴.zip,保存后發(fā)現(xiàn)zip文件是正常的疮丛,因此證明思路正確幔嫂,此題的后續(xù)過程請(qǐng)繼續(xù)閱讀這篇文章
另:除了16進(jìn)制的編碼轉(zhuǎn)換,有時(shí)還會(huì)遇到2進(jìn)制編碼的轉(zhuǎn)換誊薄,思路相同履恩,不再?gòu)?fù)述
0x02. 在圖片中隱藏壓縮包(圖種)
這種方法大概是zip中最常見的,多用于在一張圖片中隱藏一個(gè)壓縮包呢蔫,這種方法的原理是:以jpg格式的圖片為例切心,一個(gè)完整的 JPG 文件由 FF D8 開頭,F(xiàn)F D9結(jié)尾片吊,圖片瀏覽器會(huì)忽略 FF D9 以后的內(nèi)容绽昏,因此可以在 JPG 文件中加入其他文件。
也以一道題為例為例(ISCC 2017 Basic-07)俏脊,對(duì)于這種隱寫最簡(jiǎn)單的方法是使用Kali下的binwalk進(jìn)行檢測(cè)全谤,binwalk 圖片名 如下,檢測(cè)出圖片中存在壓縮包
分離這個(gè)壓縮包也有至少兩種方法:
1. 利用Linux下的foremost工具爷贫, foremost 圖片名 如下认然,foremost默認(rèn)的輸出文件夾為output,在這個(gè)文件夾中可以找到分離出的zip(推薦使用這種方法沸久,因?yàn)閒oremost還能分離出其他隱藏的文件)
2. 更簡(jiǎn)單粗暴的方法是直接把圖片的后綴改為.zip季眷,然后解壓即可(這種方法雖然簡(jiǎn)單快速,但如果隱寫了多個(gè)文件時(shí)可能會(huì)失斁砜琛)
另:本題后續(xù)步驟為構(gòu)造字典子刮,爆破握手包
0x03. 偽加密
Zip偽加密與zip的文件格式有關(guān)(zip的格式詳解請(qǐng)翻到本文的最后0x07部分),zip中有一位是標(biāo)記文件是否加密的窑睁,如果更改一個(gè)未加密zip包的加密標(biāo)記位挺峡,那么在打開壓縮包時(shí)就會(huì)提示該文件是加密的。
對(duì)于偽加密有以下幾種方法:
1. 在Mac OS及部分Linux(如Kali)系統(tǒng)中担钮,可以直接打開偽加密的zip壓縮包
2. 使用檢測(cè)偽加密的ZipCenOp.jar橱赠,解密后如果能成功打開zip包,則是偽加密箫津,否則說明思路錯(cuò)誤
3. 使用16進(jìn)制編輯器改回加密標(biāo)記位
以HBCTF的一道題講解這幾種方法:
如上狭姨,嘗試解壓壓縮包時(shí)提示有密碼宰啦,根據(jù)題干:比爆破更好的方法推測(cè)為偽加密,用三種方法來解此題:
1. 用除windows外的系統(tǒng)直接打開壓縮包
在Mac OS和部分Linux系統(tǒng)(如Kali)中饼拍,右鍵解壓可直接打開偽加密的zip壓縮包赡模,筆者暫未明確何種Linux能打開偽加密壓縮包,如有傳授师抄,不勝感激漓柑!
2. 使用ZipCenOp.jar(需java環(huán)境) 使用方法
1
java?-jar?ZipCenOp.jar?r?xxx.zip
經(jīng)ZipCenOp.jar解密后的壓縮包可直接打開
推薦使用這種方法,最便捷
3. 用16進(jìn)制編輯器修改加密標(biāo)記位
如上圖叨吮,修改加密標(biāo)記位為00辆布,保存,即可打開壓縮包(關(guān)于zip文件的結(jié)構(gòu)茶鉴,請(qǐng)翻到本文最末0x07部分)
0x04. 爆破/字典/掩碼攻擊
把這三種歸位一類是因?yàn)檫@三種方法在本質(zhì)上都是逐個(gè)嘗試锋玲,只不過待選密碼的集合不同
1. 爆破:顧名思義,逐個(gè)嘗試選定集合中可以組成的所有密碼蛤铜,知道遇到正確密碼
2. 字典:字典攻擊的效率比爆破稍高嫩絮,因?yàn)樽值渲写鎯?chǔ)了常用的密碼丛肢,因此就避免了爆破時(shí)把時(shí)間浪費(fèi)在臉滾鍵盤類的密碼上
3. 掩碼攻擊:如果已知密碼的某幾位围肥,如已知6位密碼的第3位是a,那么可以構(gòu)造 ??a??? 進(jìn)行掩碼攻擊蜂怎,掩碼攻擊的原理相當(dāng)于構(gòu)造了第3位為a的字典穆刻,因此掩碼攻擊的效率也比爆破高出不少
對(duì)這一類的zip問題,推薦windows下的神器AZPR
舉例如下:
1. 對(duì)爆破杠步,以ISCC 2017 Basic-08為例氢伟,選定暴力攻擊、字符集和長(zhǎng)度后進(jìn)行爆破
點(diǎn)擊開始幽歼,進(jìn)行爆破朵锣,如下圖,在4ms內(nèi)就找到了密碼為BIT
另:此題后續(xù)為簡(jiǎn)單的base64解密甸私;爆破在密碼長(zhǎng)度小于6位時(shí)較快诚些,因此如果在7位之內(nèi)沒有爆破出結(jié)果時(shí),基本就可以考慮換個(gè)方法了皇型;此題的正規(guī)解法是培根密碼的轉(zhuǎn)換
2. 字典诬烹,還以之前的ISCC 2017 Basic-07舉例,從圖片中分離出一個(gè)加密的zip壓縮包弃鸦,爆破無果后考慮字典攻擊(可從網(wǎng)上下載字典绞吁,但大多數(shù)題目需要自己構(gòu)造字典,文末的網(wǎng)盤連接里提供了常見的字典)
字典攻擊的結(jié)果如下圖唬格,在字典選擇合適的情況下家破,用很短的時(shí)間就能找到密碼
繼續(xù)以此題為例颜说,解壓后的壓縮包有一個(gè)txt文檔和一個(gè)握手包,txt內(nèi)容如下:
因此可知握手包的密碼為ISCC****的形式(*代表大寫字母或數(shù)字)汰聋,自己寫程序構(gòu)造字典
運(yùn)行此程序得到字典如下:
之后用aircrack-ng來選中字典跑除握手包的密碼如下圖脑沿,不再詳述
3. 掩碼攻擊,以ISCC 2017 Misc-06為例马僻,題目給了一個(gè)jpg圖片庄拇,用0x02中的方法分離出加密的壓縮包,根據(jù)題目提示:注意署名韭邓, 構(gòu)造????LiHua的掩碼(?可在自己定義的字符集中任意選擇)進(jìn)行掩碼攻擊措近,如下圖:
攻擊結(jié)果如下,只耗費(fèi)了很少的時(shí)間就找到了密碼
0x05. 明文攻擊
明文攻擊是一種較為高效的攻擊手段女淑,大致原理是當(dāng)你不知道一個(gè)zip的密碼瞭郑,但是你有zip中的一個(gè)已知文件(文件大小要大于12Byte)時(shí),因?yàn)橥粋€(gè)zip壓縮包里的所有文件都是使用同一個(gè)加密密鑰來加密的鸭你,所以可以用已知文件來找加密密鑰屈张,利用密鑰來解鎖其他加密文件,更詳細(xì)的原理請(qǐng)讀者自行谷歌
舉個(gè)例子袱巨,已知 明文攻擊.zip 中存在的文件 明文.txt阁谆,
因此將 明文.txt 壓縮,這里需要判斷明文壓縮后的CRC32是否與加密文件中的一致愉老,若不一致可以換一個(gè)壓縮工具场绿。
攻擊過程如下:
點(diǎn)擊開始,很快就恢復(fù)了密碼
另:當(dāng)明文的大小比較小時(shí)嫉入,攻擊速度會(huì)比較慢焰盗;即使有時(shí)沒有恢復(fù)密碼,也可以使用明文攻擊咒林,最后點(diǎn)保存還是能得到壓縮包里內(nèi)容的熬拒。
0x06. CRC32碰撞
CRC32:CRC本身是“冗余校驗(yàn)碼”的意思,CRC32則表示會(huì)產(chǎn)生一個(gè)32bit(8位十六進(jìn)制數(shù))的校驗(yàn)值垫竞。
在產(chǎn)生CRC32時(shí)澎粟,源數(shù)據(jù)塊的每一位都參與了運(yùn)算,因此即使數(shù)據(jù)塊中只有一位發(fā)生改變也會(huì)得到不同的CRC32值件甥,利用這個(gè)原理我們可以直接爆破出加密文件的內(nèi)容
還是以之前HBCTF偽加密那道題為例捌议,另一種解法就是CRC32碰撞,打開壓縮包引有,可以看出壓縮文件 flag6位數(shù)
的CRC32值為0x9c4d9a5d
因此寫出碰撞的腳本如下:
要特別注意
1
if?(binascii.crc32(str(i))?&?0xffffffff)?==?crc:
在 Python 2.x 的版本中瓣颅,binascii.crc32 所計(jì)算出來的 CRC 值域?yàn)閇-2^31, 2^31-1] 之間的有符號(hào)整數(shù),為了要與一般CRC 結(jié)果作比對(duì)譬正,需要將其轉(zhuǎn)為無符號(hào)整數(shù)宫补,所以加上& 0xffffffff來進(jìn)行轉(zhuǎn)換檬姥。如果是 Python 3.x 的版本,其計(jì)算結(jié)果為 [0, 2^32-1] 間的無符號(hào)整數(shù)粉怕,因此不需額外加上& 0xffffffff 健民。
腳本的運(yùn)行結(jié)果如下,即為壓縮文件的內(nèi)容:
![](http://p0.qhimg.com/t017fb3e5e3f2a6d0a0.png)
再舉另一個(gè)bugku中的例子贫贝,下載下來的文件是68個(gè)壓縮包秉犹,并且根據(jù)binwalk的檢查結(jié)果,每個(gè)壓縮包里都有一個(gè)大小為4個(gè)字節(jié)稚晚,名為out.txt的壓縮文件
用如下的腳本碰撞出所有壓縮包中的數(shù)據(jù):
此題較為繁瑣崇堵,之后的步驟不再展開
另:限于CPU的能力,CRC碰撞只能用于壓縮文件較小的情況
0x07. 修改格式
這種情況花樣較多客燕,難以做一個(gè)詳細(xì)的總結(jié)鸳劳,因此只列舉最常見的缺少文件頭或文件尾。
放一個(gè)zip文件格式講的較清楚的鏈接也搓,通過對(duì)zip文件格式的了解赏廓,可以解釋之前偽加密的問題,同時(shí)也可以對(duì)缺少文件頭或文件尾有更直觀的認(rèn)識(shí)傍妒。
如上為正常zip幔摸,缺頭zip和缺尾zip的binwalk掃描結(jié)果,根據(jù)掃描結(jié)果用16進(jìn)制編輯器添加文件頭或文件尾拍顷,即可修復(fù)zip抚太。
總結(jié)
Zip不僅是我們生活中常用到的一種文件格式,在CTF中也經(jīng)常遇到昔案,這里做了一個(gè)關(guān)于CTF中zip的總結(jié),如果對(duì)讀者有幫助电媳,鄙人不勝榮幸踏揣。