1. 哈希长度延展攻击的机制

哈希长度延展攻击利用的是哈希函数如MD5和SHA-1的特性。当计算哈希时,如果攻击者知道原始数据的哈希值但不知道原始数据内容,他们仍然可以在原始数据后添加一些数据,并且能计算出新数据串的哈希值,而不需要知道原始数据是什么。

对于MD5哈希函数,攻击者利用的关键是这种函数使用内部状态,这个状态在处理完所有数据后就是最终的哈希输出。如果攻击者知道一个哈希值(即内部状态),他们可以“接上”新的数据,仿佛这些新数据是紧跟在原始数据之后的。

2. 使用工具或脚本进行攻击

要进行长度延展攻击,我们可以使用像hashpump这样的工具。hashpump接受一个已知的哈希值、已知数据、附加数据和已知数据的长度,然后输出新的哈希值和附加后的完整数据。

例如,假设我们有以下信息:

  • 命令cmd=viewfile的哈希值h
  • 原始数据长度(注意这通常指密钥加原始数据的总长度)
  • 想要添加的命令rm

使用hashpump的命令行可能是这样的:

hashpump -s [原始哈希h] --data "viewfile" --signature [h] --append "rm" --keylen [密钥长度]

这将输出一个新的哈希值和构造的完整命令,即cmd=viewfile||padding||rm

3. 攻击方法、工具和结果说明

  • 攻击方法:使用了MD5哈希长度延展攻击,通过hashpump工具来生成附加了删除文件命令的新哈希值。
  • 工具说明hashpump是一个广泛使用的工具,专门用于生成哈希长度延展攻击所需的数据。它输出修改后的数据和对应的新哈希值。
  • 构造的命令和新的签名:这将依赖于hashpump提供的具体输出,包括新的命令串和相应的哈希值。

通过这种方式,即使不知道密钥k,也可以创建一个有效的命令来删除文件。
先查看原始信息的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)

 

之后运行

 

posted on 2024-04-14 13:23  20211201李柏林  阅读(53)  评论(0编辑  收藏  举报