哈希長度拓展攻擊


哈希長度拓展攻擊

五一假期在幹嘛?相信有很多小夥伴(其實是大表哥)開始了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
ps:
之前一直在看大神們託管在github裏的項目,這是第一次使用github
因爲是在學習的時候寫的這個利用腳本,註釋挺多的。


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