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)
之后运行