1. 程式人生 > >雜湊長度拓展攻擊

雜湊長度拓展攻擊

 

雜湊長度拓展攻擊

 

五一假期在幹嘛?相信有很多小夥伴(其實是大表哥)開始了ISCC之旅,不知道為了在這個“動態分數”機制環境下得到更多的分數,大家的肝還好不好呢?

資訊保安與對抗技術競賽(ISCC:Information Security and Countermeasures Contest),於2004年首次舉辦,是教育部、工業和資訊化部主辦的第一個國家級資訊保安技術競賽,初入茅廬的我(小菜鳥)也去水了水,苦戰許久,開始總結與學習,於是就寫這篇文章,第一次寫部落格,不足之處很多,希望大表哥們糾正。

 

在做題的時候,有一道題很有趣,web250的hash長度拓展攻擊,這個方法原理不難,在幾年前已經出現了,

2009年,Thai Duong 與 Juliano Rizzo釋出了ASP.NETpadding oracle攻擊,同時還寫了一篇關於Flickr API簽名可偽造的paperFlickr API簽名這個漏洞,實際上用的是MD5 Length Extension Attack,鑽研了一個多星期的各位大表哥寫的文章以及hash加密的具體演算法,我想談談自己理解,並且分享一份自己寫的利用程式碼。

 

首先先看一張圖片

這有一幅圖,感覺能把核心思路與過程充分地體現出來,不過在此之前我們應該瞭解MD5加密的大體步驟:填充與使用上一次計算出來的幻值進行四輪運算。

 

 

 

我們輸入一個需要加密的字元的時候,該演算法會對字串進行分組,每448位(bit)也就是56位元組一組,當不足448位時需要進行補充,我們先說一下448位的來源。

 

每一個進行四輪運算的字串,長度為64位元組也就是512位,其中有8個位元組是記錄資訊的長度(長度的意思是資訊是多少二進位制位),那麼容納資訊的就只要56位元組。假設我們對一個10個位元組(80bit)的字串A進行填充至64位元組

第一步,需要檢視該資訊是否小於等於56位元組,即length(A)%64<=56?這裡單位是以位元組為單位。

第二步,對不足56位元組的字串進行填充,那麼對A來說需要填充46位元組,規定第一個位元組必須填充%80,其餘的填充%00,那麼A填充的內容為:

%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00

這裡面有45個%00

填充完畢。

 

隨後我們需要填充摘要資訊,也是資訊的長度,A有10位元組,也就是80bit,換算成16進製為0x50,那麼後面需要填充的8個位元組為:

%50%00%00%00%00%00%00%00

為什麼不是%00%00%00%00%00%00%00%50呢?

因為MD5是小端儲存,也就是低地址儲存高位位元組。

對於小端儲存,比如0x1234=>34120000(假設32位儲存長度)。

 

至此我們需要處理的64位資料已經構造成功,這時候需要上一次MD5運算得到的ABCD來作為本次MD5運算的初始序列ABCD。

在這裡我們解釋一下初始序列,對於第一次運算來說會預設四個32位初始序列

A=0x01234567

B=0x89abcdef

C=0xfedcba98

D=0x7654321

它們被稱為連結變數

將上面四個變數分別賦值到a,b,c,d變數中

然後進行主迴圈(四輪),每一輪都很相似。第一輪進行16次操作。每次操作對a,b,c和d中的其中三個作一次非線性函式運算,然後將所得結果加上第四個變數,文字的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a,b,c或d中之一。最後用該結果取代a,b,c或d中之一。這樣新的連結變數誕生了,如果還需要進行加密,那麼就作為下一次加密的初始序列,如果結束的話,那麼就把a,b,c,d連線在一塊。

 

理論說完了,我們來看一下題目:

 

題目直接給了原始碼,簡單的審計題目比較容易做

我們我們可以知道,如果enc($username) === $_COOKIE['verify']那麼就setcookieveriftymd5($key+'guest')可以知道未知的secret$key,而且我們從下一語句可以知道,$keylengthsetcookie("len"strlen($key), time()+60*60*24*7);

因此這個題目已經分析出來了

 

已知的是:$key的length

md5($key+'guest')

$username裡要有admin

 

那麼第一步上bp抓包找一下需要的資料

可以發現 verify=78cfc57d983b4a17e55828c001a3e781 len=46

使用hashpump

我們把

payload:guest%80%00%00%00%00%98%01%00%00%00%00%00%00admin

verify5f585093a7fe86971766c3d25c43d0eb

進行repeater

成功拿到flag

 

對於hash長度拓展攻擊,挺感興趣的,之後看了很多資料,按著自己的理解寫了一個指令碼,雖然寫出來了,對md5加密的演算法理解了,但是不知道在md5四輪運算中,參與運算的固定的16進製為什麼是這幾個,還是應該好好研究。

 

 

對於這個的用法,我簡單的說一下

python expliot.py 作為初始序列的md5值 最為第二輪md5運算的字元 上一次的md5運算前的padding的時候%80前面字串的二進位制位數

 

指令碼我放在我的github裡 https://github.com/1234xxh/Web

小弟blog,希望各位仁兄進去坐一坐。http://bey0nd.club/

ps:

之前一直在看大神們託管在github裡的專案,這是第一次使用github

因為是在學習的時候寫的這個利用指令碼,註釋挺多的。

 

 

推薦一篇很棒的文章 https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks