任务描述:
在一个使用MD5哈希算法的系统中,管理员使用了一个密钥k和命令cmd的组合来生成每个命令的签名:hash(k||cmd)。你已经获得了一个允许查看文件的命令cmd=viewfile和对应的签名h,但你希望通过哈希长度延展攻击,生成一个新的签名,该签名能够让你执行删除文件的命令(删除文件的命令为rm)。
具体步骤:
-
研究MD5哈希长度延展攻击的机制,并找出适用于此场景的攻击方法。(3分)
MD5哈希长度延展攻击是利用MD5算法在设计上的缺陷来构造一个原本不存在的消息的哈希值。MD5是基于Merkle-Damgård构造的,这种构造的哈希函数容易受到长度延展攻击。长度延展攻击的基本思想是,给定一个消息m1和它的哈希h(m1),攻击者可以构造出另一个消息m2,使得h(m1 || m2) = h'(m2),其中h'是未知的哈希函数。
MD5算法的工作流程如下:
- 填充(Padding):原始消息被填充到448位(模512位)的长度,然后添加一个64位的长度字段,表示原始消息的长度。
- 分块处理:填充后的消息被分成512位的块,每个块通过一系列的轮函数进行处理。
长度延展攻击利用了MD5的这个填充过程。攻击者可以找到一种方法,在不知道密钥k的情况下,将原始消息(viewfile)和任意长度的新消息(padding和rm)拼接起来,然后计算出新的哈希值。
为了执行这种攻击,攻击者需要知道以下几点:
- 原始消息(cmd=viewfile)
- 原始消息的哈希值(h)
- 密钥的长度(k的长度)
攻击步骤通常如下:
- 计算原始消息的填充,以便将其长度增加到448位(模512位)。
- 添加64位的长度字段,表示原始消息的长度。
- 构造新的消息,将原始消息、填充和新消息(rm)拼接起来。
- 利用MD5算法的迭代性质,计算出新的哈希值。
-
使用合适的工具或脚本,基于cmd=viewfile和签名h,构造一个新的命令cmd=viewfile||padding||deletefile和新的签名。(6分)
在Linux中,你可以使用hashpump工具来执行MD5哈希长度延展攻击。
hashpump -s h -d cmd=viewfile -a ||padding||deletefile -k 16
-s
后面跟的是原始签名的十六进制表示,-d
后面跟的是原始数据,-a
后面跟的是要添加的数据,-k
后面跟的是密钥的长度 -
提交你使用的攻击方法、工具或脚本的详细说明,以及成功构造的命令和新的签名。(6分)
- 查看原始信息的MD5哈希值
- 创建一个python文件
#!/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)
- 运行结果