MD5雜湊長度延展攻擊(選做)
任務
任務描述:
在一個使用MD5雜湊演算法的系統中,管理員使用了一個金鑰k和命令cmd的組合來生成每個命令的簽名:hash(k||cmd)。你已經獲得了一個允許檢視檔案的命令cmd=viewfile和對應的簽名h,但你希望透過雜湊長度延展攻擊,生成一個新的簽名,該簽名能夠讓你執行刪除檔案的命令(刪除檔案的命令為rm)。
具體步驟:
- 研究MD5雜湊長度延展攻擊的機制,並找出適用於此場景的攻擊方法。(3分)
- 使用合適的工具或指令碼,基於cmd=viewfile和簽名h,構造一個新的命令cmd=viewfile||padding||deletefile和新的簽名。(6分)
- 提交你使用的攻擊方法、工具或指令碼的詳細說明,以及成功構造的命令和新的簽名。(6分)
過程
1.MD5雜湊長度延展攻擊
MD5雜湊長度延展攻擊是一種利用MD5雜湊演算法的安全漏洞,其機制如下:
-
MD5演算法特性:MD5演算法在計算雜湊值時,將訊息分成512位(64位元組)的塊,並對每個塊進行一系列的位運算和輪函式計算,最終得到128位(16位元組)的雜湊值。
-
攻擊者利用填充資料:攻擊者利用MD5演算法對訊息進行處理的特點,可以構造出具有相同雜湊值的不同輸入資料。攻擊者首先需要了解原始訊息M的長度和雜湊值H(M),然後在訊息M的末尾附加填充資料P,使得新訊息M'的長度為M的長度加上填充資料的長度。
-
計算新訊息的雜湊值:攻擊者根據MD5演算法的工作原理,計算新訊息M'的雜湊值H(M')。在計算過程中,MD5演算法會將填充資料P作為有效訊息的一部分,因此攻擊者可以透過控制填充資料的內容來影響新訊息的雜湊值。
-
構造有效的新訊息:攻擊者根據MD5演算法的雜湊計算過程,精心選擇填充資料P,使得新訊息M'的雜湊值滿足攻擊者的需求。例如,攻擊者可以構造出具有相同雜湊值但含有惡意內容的新訊息,用於欺騙系統或繞過身份驗證。
-
實施攻擊:攻擊者將構造好的新訊息M'傳送給目標系統進行驗證或處理。由於MD5演算法的安全漏洞,目標系統無法區分原始訊息和填充資料,因此會錯誤地接受新訊息M',從而導致安全漏洞和攻擊風險。
攻擊方法中的關鍵是構造填充資料P,使得新訊息M'的長度符合MD5演算法的處理要求,並且能夠影響新訊息的雜湊值以達到攻擊者的目的。攻擊者可以透過以下公式計算新訊息M'的長度和填充資料P的內容:
新訊息長度 = 原始訊息長度 + 填充資料長度
填充資料 = 惡意內容 + 填充位元組
其中,填充位元組的數量和內容是攻擊者需要精心選擇和控制的關鍵。透過構造合適的填充資料,攻擊者可以成功實施MD5雜湊長度延展攻擊,破壞系統的安全性和完整性。
2.建立一個python檔案
md5.py
`#!/usr/bin/pyhton3
import hashlib
def md5_extend(original_message, original_hash, extension):
# 步驟1:計算原始訊息的位元組長度
original_length = len(original_message.encode())
# 步驟2:初始化填充
padding = b'\x80' + b'\x00' * ((56 - (original_length + 1) % 64) % 64)
# 步驟3:新增原始訊息的位元長度
padding += (original_length * 8).to_bytes(8, byteorder='little')
# 步驟4:計算新雜湊值
new_hash = hashlib.md5()
new_hash.update(extension.encode())
new_hash.update(padding)
forged_message = original_message.encode() + padding + extension.encode()
# 步驟5:返回偽造訊息和雜湊值
return forged_message, new_hash.hexdigest()
original_message = "20211201viewfile"
original_hash = hashlib.md5(original_message.encode()).hexdigest()
extension = "rm *"
forged_message, new_hash = md5_extend(original_message, original_hash, extension)
print("原始訊息:", original_message)
print("原雜湊值:", original_hash)
print("偽造訊息:", forged_message.hex()) # 將位元組串轉換為十六進位制表示
print("新雜湊值:", new_hash)`