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)`