在ctf-misc中,隱寫題占了好一部分,所以今天來總結一下圖片隱寫及壓縮包的破解。
當然,最簡單的就是查看屬性,看看是否有經過編碼過后的特殊字符,解碼后可能就是密碼之類的。
一.隱寫
1.利用binwalk工具分離圖片:
1.首先將文件放到kali下,利用binwalk命令查看圖片,通過查看描述可以發現圖片中還隱藏了另外一張圖片。
2.接着利用binwalk -e或foremost命令來分離他們。
3.在生成的目錄中,我們可以發現被隱藏的圖片,從而得到flag。
(當然,作為一個win系統的菜雞,又懶得打開虛擬機傳文件去分離,所以最簡便的方法是用formost直接分離所有文件,formost詳細安裝看這里)(也適用於壓縮包)
2.stegsolve工具的利用:(LSB隱寫)
1.首先打開stegsolve,並open題目圖片
2.通過點擊左右箭頭,來查看圖片在其它文件格式下的圖像,然后在Gray bits格式下,發現一張隱藏的二維碼,掃描二維碼即可得到flag
3.在其它格式下也可能會有提示信息,例如這張圖
4.在Green plane0格式下直接發現了flag
3. txt簡單隱寫
【此類題目可以說是最簡單的一類題,通過直接使用記事本或者其它文本編輯軟件,可直接查看。一般拿到圖片后,大多先用記事本查看,從而判斷是否為txt簡單隱寫。一般flag會位於文本開頭或結尾,少數情況會在文本中間,這類情況后面會單獨介紹】
1.拿到圖片后,直接用記事本打開,在文本結尾發現了一串編碼,學習過密碼學的人應該很容易認出這是Unicode加密。
2.利用解碼器可直接解flag
4.關鍵字搜索
【這類題目與txt簡單隱寫類似,但flag大多隱藏在文本中間,當文本過長的時候,只靠肉眼查找會浪費很多時間,我們可以直接用ctrl+f搜索關鍵字,例如:flag、FLAG、key、KEY或根據賽方要求的格式進行查找】
5. 十六進制文件頭補全及修改
【首先,我們需要知道文件頭是位於文件開頭,用處承擔一定任務的數據,我們可以通過文件頭來判斷文件類型。因此,當文件頭被刪除或修改后,文件可能會打不開,這種情況我們就要根據所給文件的后綴,補全或修改文件頭】
1.先觀察所給的文件類型,發現是jpg格式,我們就要想到jpg文件的文件頭為FFD8FF(常用文件頭)
2.利用Winhex打開圖片,查看文件的十六進制,觀察后我們會發現,相比於正常的jpg文件,這張圖的文件頭缺失了三位
3.將文件頭補全后保存,系統會自動生成一個備份文件,防止修改錯誤,而原文件則會變為正常圖片
4.文件頭修改同理,觀察文件頭前幾位,將其修改為正確格式,保存后即可得到正常圖片
5.最近還遇到了另一種的修改方式,就是開頭是png格式,但是結尾卻是FF D9(jpg文件結尾),所以需要將開頭改為FFD8FFE0(jpg文件開頭)
6. png格式的IHDR問題
【這類題目最大的標志:圖片格式為png,或當你感覺這張圖片好像被裁掉一部分時,要考慮的這類問題。這類題目的原理我理解的並不是很深刻,僅僅局限於解題方法...】
1.先查看一下原圖
2.用十六進制編輯器打開圖片后,我們會發現他的標志IHDR,對應左邊十六進制的49 48 44 52,我們以此為界,后面的四位為圖片寬度,再向后四位為圖片高度
2.接下來,我們根據實際情況,將寬度和高度改為相同數值,然后保存
3.再次查看圖片,發現隱藏的flag
7.TXT下隱藏png(暫且這么叫,因為本萌新也不知道叫什么)
如圖:
解題方法:(也許比較片面,望指正)
一般來說,winhex打開后都是flag.txt下有secret.png, 然而,png原本是看不到的,所以就要修改 A8 3C 7A(原來的)(我的結論就是在png的上下幾行內),需要將7A修改為74,然后保存就有png的圖片了。
二.壓縮包加密
1. 偽加密
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環境) 使用方法
java -jar ZipCenOp.jar r xxx.zip
經ZipCenOp.jar解密后的壓縮包可直接打開
3. 用16進制編輯器修改加密標記位
如上圖,修改加密標記位為00,保存,即可打開壓縮包(zip文件結構)
2. 爆破/字典/掩碼攻擊
把這三種歸位一類是因為這三種方法在本質上都是逐個嘗試,只不過待選密碼的集合不同
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圖片,用2中的方法分離出加密的壓縮包,根據題目提示:注意署名, 構造????LiHua的掩碼(?可在自己定義的字符集中任意選擇)進行掩碼攻擊,如下圖:
攻擊結果如下,只耗費了很少的時間就找到了密碼
3.明文攻擊
明文攻擊是一種較為高效的攻擊手段,大致原理是當你不知道一個zip的密碼,但是你有zip中的一個已知文件(文件大小要大於12Byte)時,因為同一個zip壓縮包里的所有文件都是使用同一個加密密鑰來加密的,所以可以用已知文件來找加密密鑰,利用密鑰來解鎖其他加密文件,更詳細的原理請讀者自行谷歌
舉個例子,已知 明文攻擊.zip 中存在的文件 明文.txt,
因此將 明文.txt 壓縮,這里需要判斷明文壓縮后的CRC32是否與加密文件中的一致,若不一致可以換一個壓縮工具。
攻擊過程如下:
點擊開始,很快就恢復了密碼
另:當明文的大小比較小時,攻擊速度會比較慢;即使有時沒有恢復密碼,也可以使用明文攻擊,最后點保存還是能得到壓縮包里內容的。
4. CRC32碰撞
CRC32:CRC本身是“冗余校驗碼”的意思,CRC32則表示會產生一個32bit(8位十六進制數)的校驗值。
在產生CRC32時,源數據塊的每一位都參與了運算,因此即使數據塊中只有一位發生改變也會得到不同的CRC32值,利用這個原理我們可以直接爆破出加密文件的內容
還是以之前HBCTF偽加密那道題為例,另一種解法就是CRC32碰撞,打開壓縮包,可以看出壓縮文件 flag6位數
的CRC32值為0x9c4d9a5d
因此寫出碰撞的腳本如下:
要特別注意
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碰撞只能用於壓縮文件較小的情況
5. 修改格式
這種情況花樣較多,難以做一個詳細的總結,因此只列舉最常見的缺少文件頭或文件尾。
放一個zip文件格式講的較清楚的鏈接,通過對zip文件格式的了解,可以解釋之前偽加密的問題,同時也可以對缺少文件頭或文件尾有更直觀的認識。
如上為正常zip,缺頭zip和缺尾zip的binwalk掃描結果,根據掃描結果用16進制編輯器添加文件頭或文件尾,即可修復zip。
當然,也有些說法為C4 3D 7B 00 40 07 00是rar文件尾(有的wp上說這就是rar文件的問件尾,但是我好像看過別的rar文件,尾部並不是這樣的),將文件頭52 61 72 21 1A 07 00補上,改后綴為rar,打開后文件信息部分出現flag
三.最后
比賽中肯定好幾種知識一起用,要隨機應變。
四.參考文章:
https://blog.csdn.net/Dog_Captain/article/details/89028552 作者:Sn1Per_395
https://www.anquanke.com/post/id/86211 作者:M4xW4n9