ღ Miranda

Hash Length Extension Attack

很多Hash函数都存在Hash Length Extension Attack,也就是哈希拓展长度攻击,这里以md5算法为例。

攻击原理

md5这种Hash算法采用将消息分组的方式进行混合,最终形成消息摘要,md5算法先在消息末尾添加"1"这个bit然后开始填充"0"这个bit,使得添加padding后整个消息的长度加上64bit512的倍数,然后一个64bit长度的消息长度被添加到末尾,整个长度为512的倍数,接下来就会对每个512bit长度的分组进行分组计算,最后获得消息摘要,具体实现可以参考http://www.ietf.org/rfc/rfc1321.txt

拓展长度攻击就是在知道一个密钥的md5值以及其长度的情况下,可以在密钥后添加任何数据并且计算出md5值,基本实现就是在原始密钥后手动添加padding,使之成为一组512bit的字段,再添加要加上的消息,然后把已知的md5值作为初始向量,然后直接计算第二组512bit长度的消息分组。

MD5的Python3实现

为了实现攻击,我们需要直接patch算法实现,所以先有下面的md5算法的python3实现:

上一次压缩的结果,将作为下一次压缩的输入。而Length Extension的理论基础,就是将已知的压缩后的结果,直接拿过来作为新的压缩输入。在这个过程中,只需要上一次压缩后的结果,而不需要知道原来的消息内容是什么。

实施攻击

这里以实验吧的一道题为例,链接http://ctf5.shiyanbar.com/web/kzhan.php,首先要截断代理修改cookiesource1获得如下源代码:

大概的意思就是已知$secret.urldecode("admin"."admin"))md5值,然后需要在后面自己添加数据并算出正确的md5值。$secret"adminadmin"加起来长度为200bit,所以要添加的长度为312bit也就是39字节,最后8字节是消息长度。padding后的数据是:

可以在后面再添加一些字符,也可以不添加,patch后的脚本如下:

只修改了A, B, C, D的初始值和dealInput函数的返回值就可以算出正确的md5值而不用知道secret的具体值。

HashPump

hashpumpHash拓展长度攻击的工具,用法参照:

发表评论

电子邮件地址不会被公开。