任务描述:
在一个使用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算法的一个漏洞,允许攻击者在不知道原始数据的情况下,构造出具有相同哈希值的新数据。攻击者利用这一漏洞,可以在已知数据的哈希值的基础上,追加额外的数据,而不会影响到原始数据的哈希值。
在这个场景中,管理员使用了一个密钥k和命令cmd的组合来生成签名:hash(k||cmd)。攻击者已经获取了一个允许查看文件的命令cmd=viewfile和对应的签名h。攻击者希望通过哈希长度延展攻击,生成一个新的签名,使得这个签名能够执行删除文件的命令(删除文件的命令为cmd=rm)。
2. 构造新的命令和签名
我们已经有了原始命令和签名:
- 原始命令:cmd=viewfile
- 对应签名:h
我们希望构造一个新的命令cmd=viewfile||padding||deletefile
,并生成相应的签名。
3. 使用openssl
库中的MD5_Update()
函数来计算MD5哈希值,并手动添加填充数据以及新的命令进行攻击。以下是代码:
cCopy Code
#include <stdio.h>
#include <string.h>
#include <openssl/md5.h>
int main() {
// 原始命令和签名
char original_cmd[] = "cmd=viewfile";
unsigned char original_signature[MD5_DIGEST_LENGTH]; // 存储签名的数组
// 假设原始签名已知,这里用16进制表示
sscanf("68617a652cf8ad912cef9bbbe8ddacf7", "%32x", original_signature);
// 需要添加的命令
char additional_cmd[] = "||padding||deletefile";
// 计算新的签名
unsigned char new_signature[MD5_DIGEST_LENGTH]; // 存储新签名的数组
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update(&ctx, original_cmd, strlen(original_cmd));
// 添加填充数据
MD5_Update(&ctx, additional_cmd, strlen(additional_cmd));
MD5_Final(new_signature, &ctx);
// 输出新的命令和签名
printf("新的命令:%s\n", strcat(original_cmd, additional_cmd));
printf("新的签名:");
for(int i = 0; i < MD5_DIGEST_LENGTH; i++) {
printf("%02x", new_signature[i]);
}
printf("\n");
return 0;
}
这段代码通过计算MD5哈希值来构造新的签名,其中包括了填充数据和新的命令。最终输出新的命令和签名。
4. 运行截图
标签:cmd,命令,签名,哈希,MD5,viewfile,20211128 From: https://www.cnblogs.com/ljxbl/p/18133084