任务描述:
在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文件的命令为rm)。
具体步骤
-
研究MD5哈希长度延展攻击的机制:
- MD5算法对消息进行填充后,将消息长度的二进制表示附加到消息的末尾,并在此后附加一些位数为64位的填充位。攻击者可以利用这个特性,在不知道原始消息内容的情况下,构造出新的哈希值。
- 通过追加额外数据和填充,攻击者可以构造出新的消息和哈希值,而这个哈希值是根据原始消息的哈希值计算得出的。
-
使用攻击工具或脚本:
- 在这个场景中,我们已知cmd=viewfile的签名为h。我们需要构造一个新的命令cmd=viewfile||padding||deletefile,并计算出相应的签名。
-
构造新的命令和签名:
- 首先,我们需要确定padding的长度,使得原始消息长度加上padding之后是512位(MD5分组大小)的倍数。
- 然后,构造新的消息为cmd=viewfile||padding||deletefile,并计算该消息的MD5哈希值。
- 最后,将原始消息的哈希值与新消息的哈希值连接起来,作为新的签名。
攻击成功后,我们将获得一个可以执行删除文件命令的签名,而无需知道密钥k的值。
这里列出一个示例的攻击脚本,假设使用Python实现,使用了HashPump工具来进行长度延展攻击:
import subprocess
# 原始消息和签名
original_message = "viewfile"
original_signature = "0cc175b9c0f1b6a831c399e269772661" # 这里是示例的原始签名,实际场景中需要替换为正确的签名值
# 构造额外数据和删除文件命令
extra_data = "||padding||deletefile"
original_length = len(original_message)
extra_length = len(extra_data)
total_length = original_length + extra_length
# 使用HashPump工具进行长度延展攻击
p = subprocess.Popen(["hashpump", "-s", original_signature, "-d", extra_data, "-a", original_message, "-k", str(original_length)], stdout=subprocess.PIPE)
output, _ = p.communicate()
# 提取新的签名和消息
new_signature, new_message = output.decode().split("\n")
print("New message:", new_message)
print("New signature:", new_signature)
运行截图