MD5-ATTACK

Posted goodswarm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MD5-ATTACK相关的知识,希望对你有一定的参考价值。

MD5-ATTACK

MD5算法目前的状态:

  • 不安全且攻击成本低

PS:SHA-1也快步MD5的后尘了。只是SHA-1攻击成本还不算特别低,

hash性质

【1】什么是hash函数:

密码学上的hash函数,是指对于映射A->B,使得:

  • A和B唯一对应
  • 由A到B容易,由B到A难(单向性质)

这里的“难”理解为计算时间成本高。

【2】相同hash添加尾缀依然相同的性质:

若:hash(A) = hash(B)
则:hash(A+C) = hash(B+C)

前缀攻击法

形式:以一个指定的前缀程序A为基础,在尾部添加不同的附加数据得到两个具有相同MD5的样本B和C。

技术图片

攻击代码的模式

Array A;
Array B;

main()
{
    if (A = B)
        run benign code;
    else
        run malicious code;
    return ;
}

样本代码

以下内容存放在main.c中,通过“gcc main.c”获得二进制文件

#include <stdio.h>
#include <string.h>

unsigned char A[130] = {
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
};

unsigned char B[130] = {
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
    0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
};

int main()
{
    if(strcmp(A, B))
        //difference
        printf("1 + 1 = 1
");
    else
        //same
        printf("1 + 1 = 2
");
    return 0;
}

数组A的内容留给附加的后缀数据,记为0x41便于通过二进制编辑器查找和处理。

流程

先用bless查看a.out的二进制内存并找到A数组的位置。

技术图片

切割生成的二进制文件。前缀{128bytes的整数倍}+128个字节{填充碰撞程序生成的后缀数据}+后缀{剩余内容}

linux下切割文件可以使用head,tail命令。

wc -c a.out                         #计算整个a.out的bytes大小,7740
head -c 4160 a.out > a_prefix.bin   #将a.out的前4160 bytes写入a_prefix.bin
tail -c 3452 a.out > a_suffix.bin   #计算7740-4160-128=3452

生成MD5值相同的前缀文件。但他们的后缀数据部分存在差异。

md5collgen -p a_prefix.bin -o a_p.bin a_q.bin
md5sum a_p.bin a_q.bin

修改后缀文件中的数组B内容。

将a_p.bin的后缀数据替换数组B的内容

得到两个MD5值相同的可执行文件。

cat a_p.bin a_suffix.bin > a_p.out
cat a_q.bin a_suffix.bin > a_q.out
md5sum a_p.out a_q.out
./a_p.out
./a_q.out

技术图片

特征

这种碰撞模式是通过同一个前缀程序碰撞生成的两个样本,如果其中有恶意代码,则两个样本均包含恶意代码,容易被安全软件识别,隐蔽性不强。

选择前缀碰撞法

形式:由两个不同的前缀程序A和B分别在尾部添加附加数据,构造出具有相同MD5的程序C和D。

技术图片

其中的原理

技术图片

编译hashclash

git clone https://github.com/cr-marcstevens/hashclash.git 
apt install autoconf automake libtool
apt-get install zlib1g-dev libbz2-dev
apt install libboost-all-dev
./configure --with-boost=/usr/include/boost
make clean
make -j 4

参考和拓展

MD5碰撞的演化之路[360出品]

PE程序构造identical-prefix collision的实例(懂)

PE程序构造chosen-prefix collision的实例(懂)

利用windows的签名机制的实例

你的数字签名会被撞破么?安全Hash的攻与防[百度出品]

伪造CA证书

SHA1 SHAttered攻击事件

对网盘的“秒传”机制进行攻击(懂)

攻击基于“尾部附加key”形式的MD5签名进行攻击

以上是关于MD5-ATTACK的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板

VSCode自定义代码片段6——CSS选择器

VSCode自定义代码片段——声明函数