CTF雜項總結

目錄

一、流量分析篇

二、文件頭篇

三、壓縮包篇

四、圖片隱寫篇

五、音頻隱寫篇

六、視頻隱寫

七、取證

八、Other

參考文章:


一、流量分析篇

通常比賽中會提供一個包含流量數據的 PCAP 文件,有時候也會需要選手們先進行修復或重構傳輸文件後,再進行分析。

PCAP 這一塊作爲重點考察方向,複雜的地方在於數據包裏充滿着大量無關的流量信息,因此如何分類和過濾數據是參賽者需要完成的工作。

概括來講在比賽中的流量分析有以下三個方向:

1、流量包修復 2、協議分析 3、數據提取

我們首先用一個合天的實驗來對流量分析進行初探(wireshark之文件還原)

場景:

黑客通過ARP欺騙,使用wireshark獲取了整個局域網內的流量信息,無意之中發現有人在某個網站上上傳了一份文件,但是他不知道怎麼用wireshark去還原這份文件,所以將監聽的數據報保存了一份wireshark監聽記錄,我們需要對流量包進行分析並還原出目標所上傳的圖片。

操作流程:

打開數據包發現數據共有148條(算很少了)

但是手動一條一條去審計也很費精力。利用wireshark的顯示過濾功能,因爲從題目中我們確定,上傳時候訪問的是網站,所以在filter中輸入http,顯示所有的http協議數據包,還剩下32個

通過分析我們發現在末尾第143條數據中看到upload關鍵詞的post數據包,從而懷疑這條就是涉及到上傳的數據包。

知識補充

以前的POST方式是不支持傳送文件的,對於普通的post來說,他的Content-type是application/x-www-from-urlencode,也就意味着消息的內容會被url編碼,但是後來支持傳送文件,將Content-type擴展爲multipart/form-data,來向server發送二進制數據,並且還要用一個內容分隔符來分割數據,boundry. 同時chrome和ie的策略也有所不同,IE是傳送完整的路徑,而Chrome只傳送文件名。

如果擁有編寫網站的經驗,就會知道上傳文件提交可以使用一個post表單的形式,所以也可以使用顯示過濾器選出所有POST方法提交的數據包(http.request.method==”POST”)

通過對這個數據包進行分析,得到確實上傳了一張圖片,文件名爲bingo.png,同時由於文件較大,TCP協議對其進行了切片,一共切了5個片,點擊各個Frame可以看到每個包中的內容。

其實在這一步我們就可以直接將其中圖片的十六進制數據進行復制,用一些十六進制編輯器(例如Winhex)寫入其中保存爲bingo.png就可以了(注意去掉不該有的數據。)

這裏我們利用TCP流跟蹤,對這個會話進行完整分析。

有兩個數據包,一個是請求的包,一個是響應的包,我們選擇較大的請求包(因爲裏邊包含原始圖片信息),選擇原始類型將其進行保存。

然後利用winhex將其打開,發現其囊括了整個HTTP請求(包括請求所用的頭部以及所POST的數據包括boundary)

這裏就不用原實驗中的方法了因爲較爲麻煩,我們知道PNG圖片的文件頭爲89 50 4E 47,所以直接在winhex中搜索十六進制數據,刪除其前邊的所有數據。

圖片傳送完畢還有其相關的尾部信息(可在剛纔的wireshark流中查看),也對其進行刪除操作

最後將其命名爲bingo.png,打開圖片得到key。

現在我們來對在比賽中的三個方向進行分析

1、流量包修復

比如一個流量包它的文件頭也是對的,裏邊也沒有包含其他的文件等等等等,但是就是打開出現一些未知的錯誤,這時候就要考慮對流量包進行修復。 這類題目考察較少,通常都藉助現成的工具例如PCAPFIX直接修復。

Tools: PcapFix Online https://f00l.de/hacking/pcapfix.php PcapFix https://github.com/Rup0rt/pcapfix/tree/devel

下邊介紹流量包幾個常見的塊,詳細介紹可以看:http://www.tcpdump.org/pcap/pcap.html

一般文件結構

常見塊

Section Header Block(必須存在)

Interface Description Block(接口描述,必須存在,描述接口特性)

Packet Block(數據塊)

2、協議分析

此類方向需要對分析流量包工具所用的語法有一定的掌握,這裏以wireshark爲例,須掌握wireshark過濾器(捕捉過濾器與顯示過濾器)的基礎語法,從而更快更精準的獲取指定的信息

捕捉過濾器:用於決定將什麼樣的信息記錄在捕捉結果中,需要在開始捕捉前設置。

顯示過濾器:用於在捕獲結果中進行詳細查找,可以在得到捕捉結果後進行更改

捕捉過濾器基礎語法

Protocol   Direction   Host(s)    Value   LogicalOperations    other expressiontcp           dst           10.1.1.1     80      and     tcp dst 10.2.2.2    3128

Protocol

可能的值: ether, fddi, ip, arp, rarp, decnet,lat, sca, moprc, mopdl, tcp and udp,如果沒有特別指明是什麼協議,則默認使用所有支持的協議。

Direction

可能的值: src, dst, src and dst, src or dst,如果沒有特別指明來源或目的地,則默認使用 “src or dst” 作爲關鍵字。

Host(s)

可能的值: net, port,host, portrange,如果沒有指定此值,則默認使用”host”關鍵字。

例如,”src 10.1.1.1”與”src host 10.1.1.1”相同。

Logical Operations

可能的值:not, and, or

否(“not”)具有最高的優先級,或(“or”)和與(“and”)具有相同的優先級

“not tcp port 3128 and tcp port23”與”(not tcp port 3128) and tcp port23”相同。

舉例分析:

tcp dst port 3128 //目的TCP端口爲3128的封包。 ip src host 10.1.1.1 //來源IP地址爲10.1.1.1的封包。 host 10.1.2.3 //目的或來源IP地址爲10.1.2.3的封包。

src portrange 2000-2500

//來源爲UDP或TCP,並且端口號在2000至2500範圍內的封包

not icmp //除了icmp以外的所有封包。

顯示過濾器基礎語法

Protocol    String1 String2     ComparisonOperator    Value   Logical Operations     other expression

Protocol

可以使用大量位於OSI模型第2至7層的協議。在Expression中可以看到,例如,IP,TCP,DNS,SSH

String1,String2

可選擇顯示過濾器右側表達式,點擊父類的+號,然後查看其子類

Comparison Oerators

可以使用六種比較運算符

Logical Expressions

舉例

snmp || dns || icmp //顯示SNMP或DNS或ICMP封包 ip.addr == 10.1.1.1 //顯示源或目的IP爲10.1.1.1的封包 ip.src != 10.1.2.3 and ip.dst!=10.4.5.6 //顯示源不爲10.1.2.3並且目的不爲10.4.5.6的封包 tcp.port == 25 //顯示來源或目的TCP端口號爲25的封包 tcp.dport == 25 //顯示目的TCP端口號爲25的封包

如果過濾器語法是正確的,表達式背景爲綠色,否則爲紅色

前文中的wireshark文件還原就可以說是一個很基礎的數據包流量分析。

3、數據提取

這一塊是流量包中另一個重點,通過對協議分析,找到題目的關鍵點,從而對所需要的數據進行提取。

可以學習一下tshark的使用。

tshark作爲wireshark的命令行版,高效快捷是它的優點,配合其餘命令行工具(awk,grep)等靈活使用,可以快速定位,提取數據從而省去了繁雜的腳本編寫

常用方法:tshark –r .pcap –Y -T fields –e | * > data

流量包例題分析

題目1、MISC.rar

key爲文本格式,你找得到嗎?

這道題非常基礎,一般也是我拿到流量包首先會看的,既然要找的文本格式,那我就直接查看

用wireshark打開數據包,在文件 -> 導出對象中,選擇HTTP

拉到最下方,發現有一份txt文件,選中並save,打開文件後得到key

題目2:ISCC Misc 就在其中

打開數據包,簡單分析一下,arp尋找到目的ip的MAC地址進行通信,TCP三次握手,然後利用FTP進行文件下載,我們來追蹤TCP流

eq是等於的意思,後邊的序號是一次完整的TCP連接,依次更改直到我們想要的內容

看到有個pub.key還有其他一些文件,看到這些信息需要敏感一點,從這個公鑰自然聯想到私鑰,私鑰可以幹嘛?這裏邊的文件和私鑰有什麼關係?難道是被加密的文件要用私鑰來進行解密?

再翻一翻發現一枚私鑰,應該確定是需要使用密鑰來對文件進行解密。

把私鑰複製出去,存爲private.key,數據包裏邊還有很多文件,我們用binwalk查看一下看有沒有是否可以提取

發現一個壓縮包,裏邊有一個key.txt,我們使用foremost對其進行提取,並解壓出這個key.txt,但是打印發現裏邊的數據是亂碼,大可能是被加密了?

然後使用openssl對其進行解密

成功得到flag。

openssl 的使用

openssl是一個功能強大的工具包,它集成了衆多密碼算法及實用工具。我們即可以利用它提供的命令臺工具生成密鑰、證書來加密解密文件,也可以在利用其提供的API接口在代碼中對傳輸信息進行加密。Openssl的簡單使用:

1、生成一個密鑰

openssl genrsa -out test.key 1024

這裏-out指定生成文件的。需要注意的是這個文件包含了公鑰和密鑰兩部分,也就是說這個文件即可用來加密也可以用來解密。後面的1024是生成密鑰的長度。

2、提取文件中的公鑰

openssl rsa -in test.key -pubout -outtest_pub.key

-in指定輸入文件,-out指定提取生成公鑰的文件名。至此,我們手上就有了一個公鑰,一個私鑰(包含公鑰)。現在可以將用公鑰來加密文件了。

3、在目錄中創建一個hello的文本文件,然後用此前生成的公鑰加密文件

openssl rsautl -encrypt -in hello -inkeytest_pub.key -pubin -out hello.en

-in指定要加密的文件,-inkey指定密鑰,-pubin表明是用純公鑰文件加密,-out爲加密後的文件

4、解密文件

openssl rsautl -decrypt -in hello.en -inkeytest.key -out hello.de

-in指定要加密的文件,-inkey指定密鑰,-pubin表明是用純公鑰文件加密,-out爲加密後的文件。

題目3:Google-CTF-2016:a-cute-stegosaurus-100

https://github.com/ctfs/write-ups-2016/tree/master/google-ctf-2016/forensics/a-cute-stegosaurus-100

當時做出這道題的並不多,全球只有26支隊伍,給我我也不會做,拿過來咱看看

在tcp報文段中有6Bit的狀態控制碼,分別如下

URG:緊急比特(urgent),當URG=1時,表明緊急指針字段有效,代表該封包爲緊急封包。它告訴系統此報文段中有緊急數據,應儘快傳送(相當於高優先級的數據) ACK:確認比特(Acknowledge)。只有當ACK=1時確認號字段纔有效,代表這個封包爲確認封包。當ACK=0時,確認號無效。 PSH:(Push function)若爲1時,代表要求對方立即傳送緩衝區內的其他對應封包,而無需等緩衝滿了才送。 RST:復位比特(Reset) ,當RST=1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新建立運輸連接。 SYN:同步比特(Synchronous),SYN置爲1,就表示這是一個連接請求或連接接受報文,通常帶有 SYN 標誌的封包表示『主動』要連接到對方的意思。。 FIN:終止比特(Final),用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接。

而本題中的tcp.urg卻爲

通過tshark提取 tcp.urg 然後取出0的字段,換行符轉,直接轉換成python的列表,轉ascii即可得到flag

tshark -r Stego-200_urg.pcap -T fields -etcp.urgent_pointer|egrep -vi “^0$”|tr ‘\n’ ‘,’

二、文件頭篇

判斷文件頭,根據頭部信息修改相關格式這應該是基礎中的基礎,同時也需要收集一份常見文件頭標誌大全(附件有一份)方便做題時候使用。

題目:ISCC Misc 眼見非實

題目解壓後爲一個word格式,打開後發現出現問題

查看一下文件的文件頭爲ZIP格式,對其進行修改

修改爲相應的壓縮包格式後,發現是一個文件夾裏邊包含很多文件,利用notepad++或其他工具對所有文件進行搜索,關鍵詞爲flag,從而get_flag

三、壓縮包篇

CTF中的壓縮包隱寫一般有這樣幾個套路

1、通過編碼轉換隱藏信息(common)

比如給出一堆字符或數字,仔細觀察爲某種進制,將其解碼爲十六進制,觀察其文件頭是壓縮包或者是其他格式,修改後綴名後解壓得到flag

2、在文件中隱藏壓縮包(圖種)

在CTF壓縮包隱寫中最爲常見,多用於在一個文件中隱藏一個壓縮包

原理:以jpg格式爲例,完整的JPG由FF D8開頭,FF D9結束,圖片瀏覽器會忽略FF D9之後的內容,因此可以在JPG文件之後加入其他的文件。

利用foremost,dd或者直接將其修改爲壓縮包後綴進行提取。

推薦使用foremost,因爲foremost還可以分離其他隱藏的文件。

修改爲ZIP文件雖然方法簡單,但是如果隱寫了多個文件時可能會失敗。

以前不知道foremost的時候一直是用dd分離的,後邊知道了foremost就一直用的foremost。

3、僞加密

原理:ZIP僞加密是在文件頭的加密標誌位進行修改,進而再次打開文件時被識別爲加密壓縮包。

ZIP文件主要由三個部分組成:壓縮源文件數據區 + 核心目錄 + 目錄結束標誌

壓縮源文件數據區

local file header + file data + data descriptor

local file header:文件頭用於標識該文件的開始,記錄了該壓縮文件的信息,這裏的文件頭標識由固定值 50 4B 03 04 開頭,也是 ZIP 的文件頭的重要標誌。 file data:文件數據記錄了相應壓縮文件的數據。 data descriptor:數據描述符用於標識該文件壓縮結束,該結構只有在相應的 local file header 中通用標記字段的第 3 bit設爲 1 時纔會出現,緊接在壓縮文件源數據後。 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 (直到目錄結束標識頭)

目錄結束標識(End of Central Directory Record)

存在於整個歸檔包的結尾,用於標記壓縮的目錄數據的結束。每個壓縮文件必須有且只有一個結束標識。

50 4B 05 06:目錄結束標記 00 00:當前磁盤編號 00 00:目錄區開始磁盤編號 01 00:本磁盤上紀錄總數 01 00:目錄區中紀錄總數 59 00 00 00:目錄區尺寸大小 3E 00 00 00:目錄區對第一張磁盤的偏移量 00 00:ZIP 文件註釋長度

僞加密修改的幾種方法

1、在Mac OS以及部分linux(Kali)系統中,可以直接打開僞加密的ZIP壓縮包。 2、使用檢測僞加密的工具ZipCenOp.jar,解密後如果能成功打開ZIP包,則是僞加密,否則說明思路錯誤。 3、使用16進制編輯器更改加密標誌位。

題目:flag6.zip

打開壓縮包之後發現需要解壓密碼

既然已經知道是僞加密那就直接嘗試僞加密,利用僞加密判斷工具ZipCenOp

java -jar ZipCenOp.jar r xxx.zip

可以解壓得到key

4、爆破/字典/掩碼攻擊

爆破:顧名思義,逐個嘗試選定集合中可以組成的所有密碼,直到遇到正確密碼 字典:字典攻擊的效率比爆破稍高,因爲字典中存儲了常用的密碼,因此就避免了爆破時把時間浪費在臉滾鍵盤類的密碼上。 掩碼攻擊:如果已知密碼的某幾位,如已知6位密碼的第3位是a,那麼可以構造 ??a??? 進行掩碼攻擊,掩碼攻擊的原理相當於構造了第3位爲a的字典,因此掩碼攻擊的效率也比爆破高出不少

推薦工具:ARCHPR

需熟悉ARCHPR的使用

爆破和字典就不說了,看字面意思就會用工具了

看一個題說一下掩碼:ISCC 2017 Misc-06

題目給出一個圖片,利用binwalk查看裏邊有一個壓縮包,將其提取發現需要密碼

根據題目提示:

假如你是李華(LiHua),收到喬幫主一封密信,沒有任何特殊字符,請輸入密碼,不少於1000個字,同學記得署名哦~

記得署名,而且題目提示LiHua,構造????Lihua,進行爆破

5、明文攻擊

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

題目:是FBCTF中的一個題 蒙古_攻擊

打開後發現文件加密並且有QQ8.8.exe,找個QQ8.8打包

完成後解出flag

6、CRC32碰撞

CRC(冗餘校驗碼),CRC32表示會產生一個32bit的校驗值。

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

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

例題:flag6.zip

因爲題目提示文件中flag的數值爲6位數,所以所爆破的範圍也選擇6位數。最後計算出flag的值。

爲什麼要& 0xffffffff,由官方文檔得知

在3.x版本結果總是無符號的,爲了在python所有的版本產生出相同類型的數值,還是推薦使用將數據&ffffffff。

7、修改格式

最常見的缺少文件頭或者文件尾。

正常的壓縮包文件都有開始部分和結束部分,而有一些題目修改了壓縮包格式,去掉頭或去掉尾,導致解壓出現問題。

打開缺少頭部的ZIP文件

打開缺少尾部的ZIP文件

填充其缺少的部分

修復完成後便可解壓成功,其實也可以不用手動,直接用winrar裏邊有個壓縮包修復進行修復也可以的。

上邊說的基本都ZIP格式的,現在來看一下RAR格式的

RAR

文件格式

RAR 文件主要由標記塊,壓縮文件頭塊,文件頭塊,結尾塊組成。

其每一塊大致分爲以下幾個字段:

RAR壓縮包的文件頭爲:52 61 72 21 1A 07 00

其後是標記塊(MARK_HEAD),還有文件頭(FILE_HEAD)。

更多信息見:http://www.forensicswiki.org/wiki/RAR

主要攻擊方式

1、爆破

利用linux下的rarcrack(http://rarcrack.sourceforge.net/)

2、僞加密

RAR 文件的僞加密在文件頭中的位標記字段上,用 010 Editor 可以很清楚的看見這一位,修改這一位可以造成僞加密。

3、其他如明文攻擊等方法與ZIP相同。

四、圖片隱寫篇

太常見太常見,圖像文件有多種複雜的格式,可以用於各種涉及到元數據、信息丟失和無損壓縮、校驗、隱寫或可視化數據編碼的分析解密,都是 Misc 中的一個很重要的出題方向。

圖片隱寫術的基礎知識——元數據隱寫

元數據(Metadata),又稱中介數據、中繼數據,爲描述數據的數據(Data about data),主要是描述數據屬性(property)的信息,用來支持如指示存儲位置、歷史數據、資源查找、文件記錄等功能。

元數據中隱藏信息在比賽中是最基本的一種手法,通常用來隱藏一些關鍵的 Hint 信息或者一些重要的比如password 等信息。

這類元數據可以 右鍵 -> 屬性 查看

介紹兩個命令

strings:打印可打印的字符,通常可以發現隱藏在壓縮包中的註釋內容或者是解壓需要的密碼等。

inentify:用於獲取一個或多個圖像文件的格式和特徵,用來提取一些特定的數據。

PNG圖片

文件格式:對於PNG文件來說,其文件頭總是由固定的字節來描述的,剩餘的部分由3個以上的PNG數據塊(Chunk)按照特定的順序組成。

文件頭:89 50 4E 47 0D 0A 1A 0A + 數據塊 + 數據塊 + 數據塊…..

數據塊(Chunk)

PNG 定義了兩種類型的數據塊,一種是稱爲關鍵數據塊(critical chunk),這是標準的數據塊,另一種叫做輔助數據塊(ancillarychunks),這是可選的數據塊。關鍵數據塊定義了 4 個標準數據塊,每個 PNG 文件都必須包含它們,PNG 讀寫軟件也都必須要支持這些數據塊。

對於每個數據塊都有着統一的數據結構,每個數據塊由 4 個部分組成

IHDR(文件頭數據塊)

文件頭數據塊 IHDR(HeaderChunk):它包含有 PNG 文件中存儲的圖像數據的基本信息,由 13 字節組成,並要作爲第一個數據塊出現在 PNG 數據流中,而且一個 PNG 數據流中只能有一個文件頭數據塊,其中我們只關注前8字節的內容

經常會去更改一張圖片的高度或者寬度使得一張圖片顯示不完整從而達到隱藏信息的目的。

Kali中不可以打開,提示文件頭錯誤,而Windows自帶的圖片查看器可以打開,就提醒了我們IHDR被人篡改過。

說到這裏我們來看一個題:藍盾的一個題(Bluedon.zip)

僞加密解密後解壓出一張圖片

用winhex打開看一下,注意這個位置

發現寬是500像素,但是高是436像素,將其進行修改,修改高同爲500像素

得出flag。

IDAT(圖像數據塊)

IDAT:存儲實際的數據,在數據流中可包含多個連續順序的圖像數據塊。

  • 儲存圖像像數數據。
  • 在數據流中可包含多個連續順序的圖像數據塊。
  • 採用 LZ77 算法的派生算法進行壓縮。
  • 可以用 zlib 解壓縮。

IDAT塊只有當上一個塊充滿時,纔會繼續下一個新塊。

也可以使用Stegsolve -> Format Analysis有詳細介紹

看一個題:sctf-misc400(sctf.png)

用pngcheck去查看此png圖片

正常的塊的 length 是在 65524 的時候就滿了,而倒數第二個 IDAT 塊長度是 45027,最後一個長度是 138,很明顯最後一個 IDAT 塊是有問題的,因爲它本應該並如倒數第二個塊

這是倒數第二個塊的開始部分(可以從上圖中得知其開始數據)

這是最後一個塊

最後一個塊沒有併入倒數第二個塊,那應該是最後一個塊有問題

49 44 41 54爲數據塊頭部開始信息,D9 CF A5 A8爲crc32校驗位,前邊得知IDATA採用 LZ77 算法的派生算法進行壓縮並可以用 zlib 解壓縮。利用python zlib解壓多餘的IDATA內容塊,需注意要剔除開始頭部信息、數據塊類型以及末尾的CRC校驗值,所以最後所得的數據爲:

789C5D91011280400802BF04FFFF5C75294B5537738A21A27D1E49CFD17DB3937A92E7E603880A6D485100901FB0410153350DE83112EA2D51C54CE2E585B15A2FC78E8872F51C6FC1881882F93D372DEF78E665B0C36C529622A0A45588138833A170A2071DDCD18219DB8C0D465D8B6989719645ED9C11C36AE3ABDAEFCFC0ACF023E77C17C7897667

import zlib
import binascii
IDAT = "789...667".decode('hex')
result = binascii.hexlify(zlib.decompress(IDAT))
print result
31313131313131303030313030303031313031313131313131313030303030313031313130303130313130313030303030313130313131303130313030303030303030303130313131303131303131313031303031303030303030303031303131313031313031313130313031313130313130313030313031313130313130303030303130313031303131303131303130303030303131313131313131303130313031303130313031313131313131303030303030303031303131313031313130303030303030303131303130303131303030303031303130303131313031313031313131303130313031303031303030303131313030303030303030303030313031303030303030303031303031303031313031303030313030313131303031313131303131313030313131313030303031313130313131313130303031313030313031303030313130303131313030303031303130313030303131303130303031313131303130313130303030303130313030303130313130303030303131303131313031313030313030303031313130303131313030313030303031303131313131313130313030303030303030313130313031303031303030313131313031313131313131303131313030303031313031303131303131313030303030313030303031313030313130303031313131303130313131303130303031313031303031313131313030303031303131313031303131303030313131303130303131313030313031313130313030313030313131303131303131303030313130303030303130313130303031313031303030313130303031313131313131303131303130313130313131303131303131

30 和 31是hex 的 0和 1的編碼,再解一次hex得到一串01字符串

1111111000100001101111111100000101110010110100000110111010100000000010111011011101001000000001011101101110101110110100101110110000010101011011010000011111111010101010101111111000000001011101110000000011010011000001010011101101111010101001000011100000000000101000000001001001101000100111001111011100111100001110111110001100101000110011100001010100011010001111010110000010100010110000011011101100100001110011100100001011111110100000000110101001000111101111111011100001101011011100000100001100110001111010111010001101001111100001011101011000111010011100101110100100111011011000110000010110001101000110001111111011010110111011011

長度爲625,7和8都無法整除,也就是說沒法直接轉換爲ASCII碼。

ASCII 知識補充

計算機內部,所有信息最終都表示爲一個二進制的字符串,每一個二進制位有0和1兩種狀態,因此8個二進制位有256種狀態,被稱爲一個字節(byte)。

一個字節一共可以用來表示256種不同的狀態,每一個狀態對應一個符號,也就是256個符號,從00000000到11111111。ASCII一共規定了128個字符的編碼,比如空格“Space”是32(00100000)。這128個符號(包括32個不可打印的控制符號),只佔用了一個字節的後7位,最前面一位統一規定爲0.

這也就可以理解爲什麼從7和8判斷不可以轉成ASCII碼。

625 = 25*25,是正方形的形狀,利用python的PIL庫將畫圖

#!/usr/bin/env python
import Image
MAX = 25
pic = Image.new("RGB",(MAX, MAX))
str = "1111111000100001101111111100000101110010110100000110111010100000000010111011011101001000000001011101101110101110110100101110110000010101011011010000011111111010101010101111111000000001011101110000000011010011000001010011101101111010101001000011100000000000101000000001001001101000100111001111011100111100001110111110001100101000110011100001010100011010001111010110000010100010110000011011101100100001110011100100001011111110100000000110101001000111101111111011100001101011011100000100001100110001111010111010001101001111100001011101011000111010011100101110100100111011011000110000010110001101000110001111111011010110111011011"
i=0
for y in range (0,MAX):
    for x in range (0,MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0, 0, 0))
        else:
            pic.putpixel([x,y],(255,255,255))
        i = i+1
pic.show()
pic.save("flag.png")

發現是個二維碼,畫出來後0代表白色,1代表黑色,需要旋轉或者反色纔可以掃描出來,然後得到flag.

另一種方法:

binwalk查看

後面是Zlib壓縮的數據,寫個腳本解壓一下:

from PIL import Image
from zlib import *

data = open('400b.PNG','rb').read()[0x15AFFB:]
data = decompress(data)

img = Image.new('1', (25,25))
d = img.load()

for n,i in enumerate(data):
d[(n%25,n/25)] = int(i)*255

f = open('2.png','wb')
img.save(f)

得到一個二維碼,但是不能訪問:

PS變相之後就可以了 微信掃一掃,SCTF{(121.518549,25.040854)}

IEND

圖像結束數據 IEND(image trailer chunk):它用來標記 PNG 文件或者數據流已經結束,並且必須要放在文件的尾部。

00 00 00 00 49 45 4E 44 AE 42 60 82

END 數據塊的長度總是 00 00 00 00 ,數據標識總是 IEND 49 45 4E 44,因此,CRC 碼也總是 AE 42 60 82。

其餘的輔助數據塊:

背景顏色數據塊 bKGD(background color) 基色和白色度數據塊 cHRM(primary chromaticities and white point),所謂白色度是指當 R=G=B=最大值 時在顯示器上產生的白色度 圖像 γ 數據塊 gAMA(image gamma) 圖像直方圖數據塊 hIST(image histogram) 物理像素尺寸數據塊 pHYs(physical pixel dimensions) 樣本有效位數據塊 sBIT(significant bits) 文本信息數據塊 tEXt(textual data) 圖像最後修改時間數據塊 tIME (image last-modification time) 圖像透明數據塊 tRNS (transparency) 壓縮文本數據塊 zTXt (compressed textual data)

利用LSB來進行隱寫

LSB全稱LeastSignificant Bit,也就是最低有效位。

PNG文件中的圖像像數一般是由RGB三原色組成,每一種顏色佔用8位,取值範圍爲0x00~0xFF,即256種顏色,一共包含了256的三次方的顏色,即16777216(1千677W)種顏色。人類的眼睛可以區分約1000萬種不同的顏色,這就意味着人類的眼睛無法區分餘下的顏色大約有6777216(677W)種。

LSB隱寫就是修改RGB顏色分量的最低二進制位(LSB),每個顏色都會有8bit,LSB隱寫就是修改了像數中的最低的1Bit,而人類的眼睛不會注意到這前後的區別,每個像數可以攜帶3Bit的信息,這樣就把信息隱藏起來了。

譬如把’A’隱藏起來,如下圖,可以把A轉成十六進制的0x61,再轉成二進制的01100001,再修改紅色通道的最低位爲這些二進制串。

如果是要尋找這種 LSB 隱藏痕跡的話,可以使用工具 Stegsolve來輔助我們進行分析。

通過下方的按鈕可以觀察每個通道的信息,例如查看 R 通道的最低位第 8 位平面的信息。

例題:lsb.png

打開爲普通圖片一張

使用stegsolve瀏覽通道獲得二維碼

掃描得到flag

如果隱寫使用了ascii的時候,可以使用Stegsolve—Analyse—DataExtrack來查看ascii碼。

例題:HCTF 2016 MISC(flag.php)

Analyse -> Data Extract,發現是zip格式的

提取之後保存爲ZIP格式,但是打不開

利用winrar的修復功能進行修復

解壓後提取是一個1,使用file查看爲ELF文件

給他一個X,運行後得到flag

JPG圖片

文件結構

JPEG 是有損壓縮格式,將像素信息用JPEG 保存成文件再讀取出來,其中某些像素值會有少許變化。在保存時有個質量參數可在 0 至 100 之間選擇,參數越大圖片就越保真,但圖片的體積也就越大。一般情況下選擇 70 或 80 就足夠了。

JPG 基本數據結構爲兩大類型:「段」和經過壓縮編碼的圖像數據。

有些段沒有長度描述也沒有內容,只有段標識和段類型。文件頭和文件尾均屬於這種段。

段與段之間無論有多少FF都是合法的,這些FF被稱爲[填充字節],必須被忽略掉。

0xFFD8和0xFFD9爲JPG文件的開始結束的標誌。

隱寫軟件

Stegdetect(https://github.com/redNixon/stegdetect)

通過統計分析技術評估 JPEG 文件的DCT 頻率係數的隱寫工具, 可以檢測到通過 JSteg、JPHide、OutGuess、InvisibleSecrets、F5、appendX 和 Camouflage 等這些隱寫工具隱藏的信息,並且還具有基於字典暴力破解密碼方法提取通過 Jphide、outguess 和jsteg-shell 方式嵌入的隱藏信息。

JPHS(http://linux01.gwdg.de/~alatham/stego.html)

JPEG 圖像的信息隱藏軟件 JPHS,它是由 Allan Latham 開發設計實現在 Windows 和 Linux 系統平臺針對有損壓縮 JPEG 文件進行信息加密隱藏和探測提取的工具。軟件裏面主要包含了兩個程序 JPHIDE和 JPSEEK。JPHIDE程序主要是實現將信息文件加密隱藏到 JPEG 圖像功能,而JPSEEK 程序主要實現從用 JPHIDE 程序加密隱藏得到的 JPEG 圖像探測提取信息文件,Windows 版本的 JPHS 裏的 JPHSWIN 程序具有圖形化操作界面且具備 JPHIDE 和 JPSEEK 的功能。

GIF圖片

空間軸

由於GIF的動態特性,由一幀幀的圖片構成,所以每一幀的圖片,多幀圖片間的結合,都成了隱藏信息的一種載體。

對於要分離的GIF文件,可以使用convert命令將其每一幀分割開來,也可以使用GIF分離工具。

時間軸

GIF文件每一幀間的時間間隔也可以作爲信息隱藏的載體。

Stegsolve也可以一幀一幀的觀察圖片(Stegsolve -> Analyse -> Frame Brower)

來看個題:FBCTF (安哥拉_一步一步)

打開後是一個gif圖片,用分幀工具分開後沒啥信息,用PS打開後拖動時間軸看到flag

圖種

概念:在普通圖片中存儲了別的文件(如壓縮包信息等等),比較典型的不就是圖馬嗎?

copy /b xxx.jpg + xx.zip output.jpg

直接用十六進制編輯器打開查看查看相關字符串,或者用binwalk查看是否有其他文件的存在。

雙圖

例題:ISG2014-MISC(final.png)

使用binwalk查看是否有壓縮包等其他文件

使用foremost將裏邊包含的信息分離出來,分離出兩張和原圖看似一樣的圖片,使用diff查看兩張文件不同,使用compare將不同的地方進行輸出

分別保存爲1.png,2.png

利用python的image包對其進行元素點對比,並8bit一組提取

from PIL import Image
import random

img1 = Image.open('1.png')
im1 = img1.load()

img2 = Image.open('2.png')
im2 = img2.load()

a = 0
i = 0
s = ''

for x in range(img1.size[0]):
       fory in range(img1.size[1]):
              if(im1[x,y]!= im2[x,y]):
                     printim1[x,y],im2[x,y]
                     ifi==8:
                            s= s + chr(a)
                            a= 0
                            i= 0
                     a= im2[x,y][0] + a*2
                     i= i + 1
s = s + '}'
print s

五、音頻隱寫篇

與音頻相關的 CTF 題目主要使用了隱寫的策略,主要分爲 MP3 隱寫,波形隱寫,頻譜隱寫,LSB隱寫等等。

常見手段

通過 binwalk 以及 strings 可以發現的信息不再詳述。

MP3隱寫

MP3隱寫主要是使用 Mp3Stego 工具進行隱寫,其基本介紹及使用方法如下:

MP3Stego willhide information in MP3 files during the compression process. The data is firstcompressed, encrypted and then hidden in the MP3 bit stream.

encode –E hidden_text.txt –P pass svega.wav svega_stego.mp3

decode –X –P pass svega_stego.mp3

這裏所使用的源文件需要使用RIFF文件

RIFF文件

RIFF全稱爲資源互換文件格式(ResourcesInterchange FileFormat),RIFF文件是windows環境下大部分多媒體文件遵循的一種文件結構,RIFF文件所包含的數據類型由該文件的擴展名來標識,能以RIFF文件存儲的數據包括如下: 音頻視頻交錯格式數據(.AVI) 波形格式數據(.WAV) 位圖格式數據(.RDI) MIDI格式數據(.RMI) 調色板格式(.PAL) 多媒體電影(.RMN) 動畫光標(.ANI) 其它RIFF文件(.BND)

例題:1.mp3

利用mp3stego進行解密,發現需要密碼

記得前邊說過的嗎?使用strings可以發現一些隱藏的密碼、文件等,

發現裏邊有flag.txt,好吧,沒有明顯的密碼,但是放到kali下,mp3的圖標變成了一張圖片

emmmmmmm..用foremost對其進行分離

葫蘆小金剛 英文爲:GourdSmallDiamond

decode -X -P GourdSmallDiamond 1.mp3

剛纔foremost提取出來的還有一個壓縮包,用密碼進行解壓得到flag

波形隱寫

原理:通常來說,波形方向的題,在觀察到異常後,使用相關軟件(Audacity, Adobe Audition 等)觀察波形規律,將波形進一步轉化爲01 字符串等,從而提取轉化出最終的 flag。

看題:ISCC Misc 普通DISCO

解壓出個wav文件,使用audacity打開後,放大音頻波形拉到最開始部分

以高的爲1,低的爲0得到flag的二進制

110011011011001100001110011111110111010111011000010101110101010110011011101011101110110111011110011111101

長度爲105位,可以除以7但是不能除以8,根據前邊ASCII碼的知識,在每7位前邊補0

011001100110110001100001011001110111101101010111001100000101011100101010011001100111010101101110011011100111100101111101

將其轉換爲16進制後,在將十六進制轉換爲字符串得出flag

例題2:musci111.zip

解壓後出現兩個文件:pic.jpg和musci.zip,壓縮包有密碼

圖片的密文格式爲盲文,解密爲kmdonowg,解壓後使用audacity分析

長短用-.表示,然後用摩絲解碼工具進行解碼即可得到flag.

頻譜隱寫

音頻中的頻譜隱寫是將字符串隱藏在頻譜中,此類音頻通常會有一個較明顯的特徵,聽起來是一段雜音或者比較刺耳。

例題:FBCTF 巴基斯坦_聽音樂

用audacity打開後,將其更改爲頻譜圖

得到flag

LSB音頻隱寫

類似於圖片隱寫中的 LSB 隱寫,音頻中也有對應的 LSB 隱寫。主要可以使用Slienteye,其介紹如下:

SilentEye是跨平臺的應用程序,便於使用隱寫術,在這種情況下將消息隱藏到圖片或聲音中。 SilentEye的界面簡潔,並且通過使用插件系統,可以輕鬆集成新的隱寫算法和加密過程。

例題:小蘋果

使用工具silenteye打開後,點擊decode即可

直接聽..

直接聽就是直接聽..

看例題,全國大學生信息安全賽(永不消逝的電波)

慢慢聽就是了,注意點信號(.)是滴,長信號(-)是噠

…. .-.. . .. -.-. .. -.-. – … – .– — — -.-. ..-. . — -.-. -. .—-

解密得到:HLEICICTSTWOOCFEMCN1

根據裏邊字符判斷應該有hello welcome

柵欄密碼解密

Flag{HIWELCOMETOCISCNCTF1}

六、視頻隱寫

這個見的倒是略少,準備一份工具到時候如果簡單看或者聽或其他已經會的方法還分析不出來就直接丟工具把

工具見下方網盤。

七、取證

大部分的 CTF 比賽中,取證及隱寫兩者密不可分,兩者所需要的知識也相輔相成,所以這裏也將對兩者一起介紹。

任何要求檢查一個靜態數據文件從而獲取隱藏信息的都可以被認爲是隱寫取證題(除非單純地是密碼學的知識),一些低分的隱寫取證又常常與古典密碼學結合在一起,而高分的題目則通常用與一些較爲複雜的現代密碼學知識結合在一起,很好地體現了 Misc 題的特點。

前置技能

1、瞭解常見的編碼 2、能夠對文件中出現的一些編碼進行解碼,並且對一些特殊的編碼(Base64、十六進制、二進制等)有一定的敏感度,對其進行轉換並得到最終的 flag。 3、能夠利用腳本語言(Python 等)去操作二進制數據 4、熟知常見文件的文件格式,尤其是各類 文件頭、協議、結構等 5、靈活運用常見的工具

常用工具

1、EasyRecovery 2、MedAnalyze 3、FTK 4、Elcomsoft Forensic Disk Decryptor 5、Volatility (http://www.freebuf.com/articles/system/26763.html)

磁盤

常見的磁盤分區格式有以下幾種:

1、Windows:FAT12 -> FAT16 -> FAT32 -> NTFS 2、linux:EXT2 -> EXT3 -> EXT4

VMDK

VMDK 文件本質上是物理硬盤的虛擬版,也會存在跟物理硬盤的分區和扇區中類似的填充區域,我們可以利用這些填充區域來把我們需要隱藏的數據隱藏到裏面去,這樣可以避免隱藏的文件增加了 VMDK 文件的大小(如直接附加到文件後端),也可以避免由於 VMDK 文件大小的改變所帶來的可能導致的虛擬機錯誤。而且 VMDK 文件一般比較大,適合用於隱藏大文件。

內存

1、解析析Windows / linux / Mac OS X內存結構 2、分析進程,內存數據 3、根據題目提示尋找線索和思路,提取分析指定進程的特定內存數據。

例題:

http://www.freebuf.com/column/152545.html http://www.freebuf.com/articles/rookie/145262.html

我的取證水平目前處於菜鳥級選手,還是看看別人家的分析吧~~

八、Other

說一個比較經典有趣的 hundouluo

通關後即可得到flag

比賽的時候真的3條命打通關??

輸入金手指:

直接通關 00AA-01-03 金身:00B0-01-FF 無限命:0032-01-20

附上一條:FC NES修改教程

題目二:藍盾2017移動安全賽 (就在眼前)

打開後發現一個word文件,裏邊有一堆十六進制字符

flag=E5=80=BC=E5=B0=B1=E5=9C=A8=E6=AD=A4=E6=96=87=E6=A1=A3=E4=B8=AD=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=BD=BF=E7=94=A8=E4=BA=86=E6=96=87=E6=9C=AC=E9=9A=90=E8=97=8F=E6=8A=8A=E8=87=AA=E5=B7=B1=E9=9A=90=E8=97=8F=E8=B5=B7=E6=9D=A5=E4=BA=86=E3=80=82=0A=E6=98=BE=E7=A4=BA=E5=87=BA=E9=9A=90=E8=97=8F=E6=96=87=E6=9C=AC=E5=8D=B3=E5=8F=AF

在選項中去掉隱藏文字

得到flag,這種題以前做過了,直接進行選項的修改。還有一種是把所有的文字換個顏色也就出來了。所以知道套路之後也就不用再一步一步去解碼了。

文章差不多就到這了,裏邊還有好多東西沒有補充完全,CTF中雜項的知識點以及各種奇怪的腦洞遠不是一篇文章可以說的完的,也還是在不斷補充姿勢不斷學習的過程中充實自己提升自己。 以前我也是個小白(其實現在也不咋滴..)在準備CTF的時候遇到相關的問題也曾多次看這些前輩所發表的文章來學習知識。雖然說常見的基礎套路翻過來翻過去也就那麼多,但是對於初入門CTF的同學還是帶着很多盲目。 所以今天發表這篇文章,以自己在學習路途中所發現的和所學習到的知識。希望能夠對初入CTF的同學有所幫助,在學習路途中儘量少走彎路,從而可以更快的提升自己,也可以在比賽中更加從容,更加自信。

最後祝大家學業有成,工作順利。

文中所使用的題目:https://pan.baidu.com/share/init?surl=NkW0i-wbT7s1XmUAT5IuKw   

密碼:2obq

參考文章:

http://bobao.360.cn/learning/detail/243.html https://www.anquanke.com/post/id/86211 https://ctf-wiki.github.io http://blog.sina.com.cn/s/blog_9cd8465f0102v6ok.html https://wenku.baidu.com/view/17fb9833ccbff121dd368371.html

本文分享自微信公衆號 - FreeBuf(freebuf)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章