任務詳情

  1. 需要答辯
  2. 談談你對長度延展攻擊的理解,列出你查找的資料列表(博客,圖書,論文等)
    2 查找長度延展攻擊的ctf試題案例
    3 github上下載hashpump工具,完成2中案例的攻擊,提交過程圖片和視頻

長度延展攻擊

  • 長度擴展攻擊(length extension attack),是指針對某些允許包含額外信息的加密散列函數的攻擊手段。

對于滿足以下條件的散列函數,都可以作為攻擊對象:

① 加密前將待加密的明文按一定規則填充到固定長度(例如512或1024比特)的倍數;

② 按照該固定長度,將明文分塊加密,并用前一個塊的加密結果,作為下一塊加密的初始向量(Initial Vector)。

滿足上述要求的散列函數稱為Merkle–Damg?rd散列函數(Merkle–Damg?rd hash function),下列散列函數都屬于Merkle–Damg?rd散列函數:MD4、MD5、RIPEMD-160、SHA-0、SHA-1、SHA-256、SHA-512、WHIRLPOOL

這里有兩種類型的長度擴展攻擊。符號||表示鏈接。
類型一:如果Digest(Msg1)=Digest(Msg2),并且Len(Msg1)= Len(Msg2),消 息 Msg1 1 Msg2,則 Digest(Msg1 ‖ Sufx)= Digest(Msg2‖Sufx)。

類型二:假設一個原始消息Msg,攻擊者不知道消息的內 容,給定 Len(Msg),填充消息 X,Digest(Msg),對于一個適當 的后綴,攻擊者可以計算出Digest(Msg‖Sufx)。

通過消息的填充可以抵抗第一類型的攻擊;第二類的攻 擊可以通過大的內部狀態來預防。鏈接變量循環的Hash結構 中使用了消息填充,可以抵抗第一類型的攻擊;鏈接變量長度 n 遠大于Hash值長度 l(n > 2l) ,也就是說Hash值長度小于鏈接 變量長度,使得計算 Msg‖Sufx 的 Hash 值時,無法連接。因 此,可以抵抗第二類長度擴展攻擊。

對于H(salt+data)形式的加密,在以下條件滿足的情況下,攻擊者可以通過該方法獲取H(salt+一定規則構造的data):

① 知道密文的加密算法且該算法滿足Merkle–Damg?rd散列函數特征;
② 不知道salt,但知道salt的長度,并可控制data的值;
③ 可以得到一個H(salt+data)的值。
下面以MD5算法為例,講述該攻擊方式如何進行攻擊,具體過程如下:

① 填充
拿到明文后,MD5現將明文轉為二進制文件,然后將二進制文件的長度除以512比特(即64字節),如果余數等于448比特(即64-8字節),那么直接在后面加上八個字節的長度標識,使之成為512比特的倍數。否則則在明文后填一個1,再填充0直至其長度除以512等于448,再加上8位的長度標識。長度是使用大端序(big Endian)來存儲,即低字節放在高地址位上。
比如加密的明文是admin,其二進制文件以16進制表示是0x61646d696e,長度是40比特(5字節),那么需要補充408比特(51字節)的填充符,填充內容第一位是1,其余全部是0。16進制表示是0x800000000000000000000000000000000000000000000000000。然后再添加8個字節的長度標識,admin長度為40比特,16進制是0x28,這個28要放在高位,就是0x280000000000000。結果如下所示:

② 分塊運算
填充完畢后,函數就將填充后的明文以512比特的長度分塊,進行運算。在運算中會用到四個初始向量(MD5中稱作鏈變量,Chaining Variable),分別是A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476。經過一系列復雜的數學運算,函數會得到第一塊的MD5值,然后將該MD5值分成四塊,以大端序形成新的鏈變量,投入到第二塊的運算,形成新的MD5值……以此類推,直到算出最后一塊的MD5值,就是整個數據塊的MD5值。
例如加密的明文是adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin,首先根據①的描述的算法填充后,分成兩塊進行運算,第一塊是adminadminadminadminadminadminadminadminadminadminadminadminadmi,其MD5碼是e7d6ca05773d038378f5e2674850be25,分成四塊并以大端序存儲,則A=0x05cad6e7,B=0x83033d77,C=0x76e2f578,D=0x25be5048。將這四個變量作為鏈變量投入運算,再將第二部分加密,得到最終的MD5值是9ea2d490481dbcdadf61e7e404b99585。

參考資料

長度拓展攻擊 (理解)
長度擴展攻擊詳解
密碼學系列之:Merkle–Damg?rd結構和長度延展攻擊

長度延展攻擊的ctf試題案例

在這里直接看那道題的源碼

0x01從源碼中可以提取到重要的信息

首先,明文長度為$secret.urldecode("admin"."admin")(在PHP中“.”是連接符),前面給出$secret的長度為15位,也就是該腳本會下發給瀏覽器一個cookie,字段名為“sample-hash”,值為該明文的md5加密值(所給值為571580b26c65f306376d4f64e53cb5c7)。

那么我們可知,flag獲取的要求是:傳進一個cookie,字段名為“getmein”,使其值等于$secret.urldecode($username. $password)MD5加密后的結果且$password不能為admin。

0x02綜上,我們可以嘗試構造payload_1

首先是$secret的15個未知位,在這里筆者直接用問號代替表示,之后按照源碼的提示,跟上字符串“adminadmin”

接下來便是對其進行字節填充,在末尾加入0x80,之后為0x00,在最后的8個字節,要表明哈希的長度,總長度為15+10=25,轉為16進制,即為0xC8

這時我們已經填充到了64bytes,完成了Padding,接下來MD5算法開始依次對每組消息進行壓縮,經過64輪數學變換。

注意,在這個過程中,一開始會有定義好的初始化向量,為4個中間值,初始化向量不是隨機生成的,而是標準里定義死的。

0x03實施Length Extension Attack

在這里要將原哈希值(571580b26c65f306376d4f64e53cb5c7)拆分為四組,即為:571580b2;6c65f306;376d4f64;e53cb5c7

在此將四組數值按照小端規則反序,可得如下四組

A=0xb2801557;

B=0x06f3656c;

C=0x644f6d37;

D=0xc7b53ce5;

參見0x02,此時我們有已經填充好的欲進行加密運算的字符串,若向補位后的消息再追加一條消息字符串“Hacker”,則會對這個新字符串進行補位,再利用上一個運算算出的值作為初始向量進行函數運算,最終得到的MD5值為6df6547d222c30afcb9fd3809dc04c13。(這里用的是在網上找的MD5的cpp實現,筆者在文末會貼出度盤鏈接)

0x04構造payload_2

按照源碼提示,直接構造

$username="admin",$password="admin%80%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%00%c8%00%00%00%00%00%00%00Hacker",

并且不要忘記0x01,設置好cookie(筆者使用的是Chrome的EditThisCookie插件),字段名為“getmein”,值為前邊完成構造的MD5

MD5實現鏈接:
https://pan.baidu.com/s/1mPHjWrrECm71E9F0s3jAZg
提取碼:vi8s

github上下載hashpump工具,完成2中案例的攻擊,提交過程圖片和視頻