HASH函數燒腦大作戰

本期講解一下hash函數,由於之前在比賽中做到了一題hash有關的題目,引發了此次的深(燒)度(腦)研究,本來想講講原理,但是太難,看得很痛苦,所以此次通過結合CTF題來看看HASH的一些利用,一切從簡開始講述,小編是如何入坑的。

認識一下HASH是什麼,以及題目中要遇到的一些HASH算法

HASH

散列函數(Hash function)又稱散列算法、哈希函數,是一種從任何一種數據中創建小的數字“指紋”的方法。它把消息或數據壓縮成摘要,使得數據量變小,將數據的格式固定下來。該函數將數據打亂混合,重新創建一個叫做散列值的指紋。散列值通常用一個短的隨機字母和數字組成的字符串來代表。----wiki百科《HASH》

MD5消息摘要算法

MD5消息摘要算法(MD5 Message-Digest Algorithm)一種被廣泛使用的密碼散列函數,可以產生一個128位的散列值,用於確保信息信息和傳輸完整一致。----wiki百科《MD5消息摘要算法》

SHA家族

安全散列算法(Secure Hash Algorithm)是一個密碼散列函數家族,是FIPS所認證的安全散列算法。能計算出一個數字消息所對應到的,長度固定的字符串(又稱消息摘要)的算法。且若輸入的消息不同,它們對應到不同字符串的機率很高。----wiki百科《SHA家族》

廢話講完了,現在開始真正的CTF實戰。

實驗吧-Hashkill

題目鏈接:Hashkill 題目:6ac66ed89ef9654cf25eb88c21f4ecd0是flag的MD5碼,(格式爲ctf{XXX_XXXXXXXXXXX_XXXXX})由一個0-1000的數字,下劃線,紐約的一個區,下劃線,一個10000-15000的數字構成。

考點:關於HASH的暴力攻擊---判斷HASH的類型後,可通過自行編寫腳本進行暴力攻擊

分析:拿到題目後,進行題目分析,有用的信息:

1.flag的MD5碼: 6ac66ed89ef9654cf25eb88c21f4ecd0

2.格式爲ctf{XXX_XXXXXXXXXXX_XXXXX}

3.Flag中的內容分別是:①0-1000的數字,②紐約的一個區,③10000-15000的數字,並且用下劃線進行連接。

此題,無需判斷,題目已給出,只需對照結合Python中的hashlib模塊編寫腳本進行破解即可。

2018金融業CTF題---- Encrypted Traffic

題目內容如下圖:

考點:與上一題相似,但此題需自行判斷使用的HASH類型。

分析:

1.獲取加密後的密碼字段值:ac22543d5382cbf48b6ebcf6e40f123d9ca4b91f9998e4c2f2422402

2.知悉是SHA系列哈希算法----從SHA的特徵(紅框)判斷:SHA-224

3.ATM取款密碼----取款密碼爲6位純數字

4.加鹽之後的哈希值,並且鹽爲用戶名拼音,爲zhangsanfeng

5.提交格式:flag{密碼_哈希算法_鹽}----flag{密碼_SHA224_zhangsanfeng}

分析後,發現其實這題不難,只要對密碼進行遍歷後結合zhangsanfeng使用腳本進行暴力攻擊(如zhangsanfeng123456或123456zhangsanfeng)

當然此題,也可使用大佬寫的工具進行判斷HASH類型。用法很簡單,可先通過github下載後,進入到對應的路徑下:

在紅色框中輸入對應的hash值即可:

發現結果:

裏面給出多種可能,一般的結果爲Most Probable中所提到的。 最後再結合Python中的hashlib模塊進行編寫腳本即可。

實驗吧-讓我進去

對於上面的小兒科,接下來這個可就是大咖了,需先學習一下MD5的算法原理,再進行解題會更容易一些。

題目鏈接:讓我進去 題目:相信你一定能拿到想要的。

Hint:你可能希望知道服務器端發生了什麼…

格式:CTF{}

解題鏈接: http://ctf5.shiyanbar.com/web/kzhan.php

考點:Hash長度擴展攻擊----依賴於HASH算法的設計缺點進行利用(度了一下,哈希長度擴展攻擊(hash length extension attacks)是指針對某些允許包含額外信息的加密散列函數的攻擊手段。該攻擊適用於在消息與密鑰的長度已知的情形下,所有采取了 H(密鑰 ∥ 消息) 此類構造的散列函數。MD5和SHA-1等基於Merkle–Damgård構造的算法均對此類攻擊顯示出脆弱性)

在開始講題目之前,先進行一波MD5基礎學習

術語、運算符

位(bit)

字節(Byte)

字(word)

1 word = 4 Byte = 32 bit

符號

對應意思

^

邏輯與

||

邏輯或

XOR

邏輯異或

~

邏輯取反

填充位

何爲填充位?實際就是當數據的長度不夠我們的標準,那麼就得把它進行填充,直到達到標準爲止。標準:(要使補位後的消息長度)mod 512 = 448 舉個例子: ndsec----ascii碼:’n’=110,’d’=100,’s’=115,’e’=101,’c’=99 對應的二進制:0110 1110,0110 0100,0111 0011,0110 0101,0110 0011。該字符串長度爲40bit,很明顯40 % 512 = 40 < 448,因此需要補位至448位。 補位需注意第一位補1,其餘補0(小編認爲這裏的1應該是標誌位,0應該是爲了是其數據儘可能小):0110 1110 0110 0100 0111 0011 0110 0101 0110 0011 1000 …省略404個0,爲了看起來更方便,轉換爲16進制:6E647365 63800000 …省略96個0。

添加長度

填充位數後,要進行的便是添加長度位,顧名思義,就是表示原始數據長度,上述例子的長度爲40bit,即00000000 00000028,需要注意的是這裏是指原始數據長度,不算填充位的長度,若原始數據長度小於2^64,則直接表示即可,反之,則需要用長度的低64位進行表示,即長度 mod (2^64)

所需使用的初始常數以及函數

4個初始常數:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210 4個非線性函數:

F(X,Y,Z) = (X ^ Y) || ((~X) ^ Z)

G(X,Y,Z) = (X ^ Z) || (Y ^ (~Z))

H(X,Y,Z) = X XOR Y XOR Z

I(X,Y,Z) = Y XOR (X || (~Z))

計算消息摘要

把消息分以512位爲一分組進行處理,每一個分組進行4輪變換,以上面所說4個常數爲起始變量進行計算,重新輸出4個變量,以這4個變量再進行下一分組的運算,如果已經是最後一個分組,則這4個變量爲最後的結果,即MD5值。

利用上述的原理可自行編寫MD5的加密代碼,當然這些只是給想深入學習的同學一些編寫思路基礎,小編懶散慣了,還是比較喜歡用現成的工具來玩:

工具安裝(建議在kali中安裝,因爲環境都已經有了,比較方便):

git clone https://github.com/bwall/HashPump
cd HashPump
make
make install

開始解題

進入解題鏈接後,發現登錄框(又是登錄框)。

慣用套路,想着看源碼、抓包分析… 這題直接看源碼是不行的,只能抓包,發現在cookie中有個source字段(默認置0):

把source置爲1後發送,發現返回了源碼:

進行代碼審計(這裏偷了個懶,看了大佬的writeup),發現源碼給出了secret值長度爲15,要滿足$COOKIE["getmein"] === md5($secret . urldecode($username . $password))並且urldecode($username) === "admin" && urldecode($password) != "admin"纔可以獲得flag,並且初始srcret.adminadmin進行md5後的值也是已知的,故可利用md5,sha1這類hash函數分塊hash的特性,直接利用已知的第一塊的hash值對後面的塊進行hash。username輸入admin,password是輸入攻擊後的值。此處需通過工具,得到:

如上,對應輸入初始的hash值,需要輸入的初始的admin,secret值長度+前面的admin的長度(即15+5=20),以及最後需要添加的參數(用於結合Hash長度擴展攻擊繞過password不許爲admin的條件)。得到對應的cookie值以及Hash長度擴展後的值,注意此處需要將\x替換爲%後再輸入password中:

最後獲得flag值,過程艱難,需要對MD5的原理進行理解一下,便會理解此題的解題思路。

學習小建議

Hash函數學習起來有些困難,變得越來越枯燥無味,甚至在學習過程中也會變得毫無頭緒,但是大佬給的建議是結合題目進行學習,在學習中解題,在解題中學習,可以讓一些原本枯燥無味的學習過程轉換成在解題中不斷克服難題後學習的喜悅,這是一種很不錯的學習方法,值得我們好好學習一下。

致鐵粉們:爲了防止跟斗哥走散,請星標一下【漏斗社區】,這樣無論你在地球的哪一端,我們都能愉快的玩耍啦。

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