哈希长度拓展攻击 (hash length extension attacks) 示例与原理

5 篇文章 0 订阅

哈希长度拓展攻击 hash length extension attacks示例与原理

 

 

哈希长度拓展攻击:

指针对某些允许包含额外信息的加密散列函数的攻击手段。次攻击适用于MD5和SHA-1等基于Merkle–Damgård构造的算法

 

介绍目录:

哈希与加密的区别

常用哈希算法的介绍

Md5加密过程

Md5拓展攻击示例及原理

 

 

 

 

 

哈希与加密的区别

 

哈希(Hash)与加密(Encrypt)两者是完全同的概念,正确区别两者是正确选择和使用哈希与加密的基础

哈希与加密最大的不同在于:

哈希将目标转化成具有相同长度的、不可逆的杂凑字符串

而加密将目标转化为不同长度的、可逆的密文,长度一般随明文增长而增加

如果被保护数据仅仅用作比较验证,在以后不需要还原成明文形式,则使用哈希;如果被保护数据在以后需要被还原成明文,则需要使用加密。

 

 

 

常用哈希算法的介绍

当前最常用的哈希算法有MD5SHA-1、SHA-2等

MD5

  • MD5即Message-Digest Algorithm 5(信息-摘要算法 5)用于确保信息传输完整一致。是计算机广泛使用的散列算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有MD5实现。 将数据(如汉字)运算为另一固定长度值,是散列算法的基础原理,MD5的前身有MD2、MD3和MD4。
  • MD5一度被广泛应用于安全领域。但是由于MD5的弱点被不断发现以及计算机能力不断的提升,现在已经可以构造两个具有相同MD5的信息[2],使本算法不再适合当前的安全环境。目前,MD5计算广泛应用于错误检查。例如在一些BitTorrent下载中,软件通过计算MD5和检验下载到的碎片的完整性。
  • MD5是输入不定长度信息,输出固定长度128-bits的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个128-bits散列。基本方式为,求余、取余、调整长度、与链接变量进行循环运算。得出结果。

 

SHA-1

  • SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。
  • 但SHA-1的安全性如今被密码学家严重质疑。

 

SHA-2

  • SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。
  • 新的散列函数并没有接受像SHA-1一样的公众密码社区做详细的检验,所以它们的密码安全性还不被大家广泛的信任。
  • 虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。

 

 

Md5加密过程

Md5是不可逆加密算法

 

https://img.colabug.com/2018/03/af8809074d961e80c6ad57a1768eef0a.jpg

 

大体上讲,MD5加密过程中将原始消息划分为512比特(64字节)为一组(属于分组加密),每一组都要进行4轮循环运算(消息分组间计算有先后顺序,先算M1,再M2,M3…,Mn),这4轮运算中还需要用到4个32bit的链接变量ABCD,四轮过后更新A,B,C,D的值,并参与第二个消息分组中的计算,直至后面没有组了,将ABCD拼接在一起得到的128bit的结果就是md5加密的结果。

 

举个例子:

对str = ‘abcdef’进行md5加密

其长度为6个字节,即48个bit,md5的每个分组的512bit (64个字节)中,前448bit

(56个字节) 存放原始信息,不足的话进行补位,后64bit (8字节) 是添加消息长度用的;

显然48 % 512 = 48  <<  448 , 需要补400位;

若正好等于448,则不补位;

 

这一组512bit的结果如下:

 

0000  61 62 63 64 65 66 80 00 00 00 00 00 00 00 00 00  abcdef..........

0010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0030  00 00 00 00 00 00 00 00 30 00 00 00 00 00 00 00  ................

 

可以看出补位通过80 00 00 …来将不足448bit的部分填充至448bit,补位前有48bit = 0x30 (实际是48对2的64次方取模的结果,因为消息长度可能会大于2的64次方) 所以最后64bit内容为 30 00 00 00 00 00 00 00

 

这样一组就分完,只需要对这一块进行复杂的数学运算,得到更新的ABCD的拼接结果就是md5加密的结果。

 

以上就是md5加密的大致过程。

 

 

 

Md5拓展攻击示例及原理

题目如下:

http://ctf5.shiyanbar.com/web/kzhan.php

 

 

由以上php代码可知,要通过身份验证,即拿到flag的条件:

1.需要有个名为getmein的cookie

2.username必须为admin

3.password不能为admin

4.当getmein 与 (secret+urldecode(username+password))的md5加密值相等时,即可得到flag

 

这里先解释下urldecode

URL编码是网站常用的一种编码方式,与之对应的是urlencode,decode编码,encode解码

 

urlencode所做的事:(urldecode相反)

1。数字和字母不变。

2。空格变为"+"号。

3。其他被编码成"%"加上他们的ascill的十六进制

如  123 abc’   -urlencode->   123+abc%27  -urldecode->  123 abc’

123+abc%27 也可以这样表示 %31%32%33%20%61%62%63%27 ,结果是完全一样的

 

题中将 username+password的值进行了urldecode,这个操作对username(value===admin)没有作用,只会对password中的%80 %27…这种形式的部分处理,与接下来的md5拓展攻击没有任何影响。

 

题目中已知

每次post请求会在回应的cookie中加入这么一条:名为sample-hash,值为secret+’admin’+’admin’的md5加密结果,而secret的内容不知道,但长度为15个字节。

 

现在我们的目的:

getmein === md5 (secret+urldecode(username+password))

 

其中getmein和password是我们可以控制的,secret不知道内容,username为”admin”

还知道 md5(secret + “admin” + “admin”) 为 571580b26c65f306376d4f64e53cb5c7

 

我们需要构造一个新的getmein值和一个password,来通过身份验证

 

终于可以开始md5拓展的解释了,如果不记得md5加密的原理,可以再先看看上面:

 

先观察 secret + username + username 即 15个? + “adminadmin”的加密过程

为了方便,将secret设为 “111111111111111”

 

 

 

分组补位后的结果如下:  (15+5+5)*8 = 200 = 0xc8

0000  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 61  111111111111111a

0010  64 6d 69 6e 61 64 6d 69 6e 80 00 00 00 00 00 00  dminadmin.......

0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0030  00 00 00 00 00 00 00 00 c8 00 00 00 00 00 00 00  ........ È.......

 

这512bit在经过计算后得出的md5值结果就是 sample-hash的值

 

现在

假如构造出一个这样的字符串,它的十六进制显示如下:

0000  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 61  111111111111111a

0010  64 6d 69 6e 61 64 6d 69 6e 80 00 00 00 00 00 00  dminadmin.......

0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0030  00 00 00 00 00 00 00 00 c8 00 00 00 00 00 00 00  ........ È.......

0040  61 6e 79 77 6f 72 64                            anyword

 

secret + username + password 如果是上面的值,即password是admin............................... È.......anyword时(password长度为51字节,即408bit,总长度就变成了71字节,568bit)

再做一次md5加密

分组补位后的结果如下:(568 % 512 = 56)  (568 = 0x238)

0000  31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 61  111111111111111a

0010  64 6d 69 6e 61 64 6d 69 6e 80 00 00 00 00 00 00  dminadmin.......

0020  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0030  00 00 00 00 00 00 00 00 c8 00 00 00 00 00 00 00  ........ È.......

 

0040  61 6e 79 77 6f 72 64 80 00 00 00 00 00 00 00 00  anyword. ........

0050  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0060  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

0070  00 00 00 00 00 00 00 00 23 80 00 00 00 00 00 00  ........ #.......

 

分成了两组,先对第一组进行计算,

还记得A,B,C,D这四个链接变量吗,他们在计算第一组前,各自都有一个初始值,由于对相同内容的消息加密都要产生唯一的值,所以ABCD的初始值也是固定的,

A= 0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210,或许你看过c++的md5加密的源码,ABCD被定义成:


state[0] = 0x67452301;
state[1] = 0xefcdab89;
state[2] = 0x98badcfe;
state[3] = 0x10325476;

 

这是由于内存当中的存储方式导致的,内存的存储数据和我们写数字是反的,它是低位在左,高位在右,拿A= 0x01234567为例,其对应state[0] = 0x67452301;
将state[0]从后往前每两个数字一组读出:

01  23  45  67

和A结果一致。

 

有点扯远了。。。

 

总之这个四个链接变量初始值是死的,经过第一组计算后会更新这4个变量,再作为第二组计算的链接变量参与计算。

 

而第一组计算完的A,B,C,D我们已经有了,就是将sample-hash的值

571580b26c65f306376d4f64e53cb5c7拆了:

A = 0x571580b2   B=0x6c65f306  C= 0x376d4f64  D= 0xe53cb5c7

 

之后再用这个四个链接变量参与第二组的计算,这个计算的过程也就是之前提到的4个大循环,最终我们如愿得到了 secret + username + password 的md5的sign,即使我们并不知道secret到底是什么。这就是md5拓展的神奇之处。

 

以上是原理的说明。

 

那么我们具体该怎么做呢?

Hash拓展攻击的套件有很多,甚至可以自己写,这里提两个方法:

1. linux用户可以安装使用haspump,使用的方法网上很多

2. python中使用hashpumpy这个库,但pip install hashpumpy安装时会提示你需要Microsoft Visual C++ 14.0 才能正常安装

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值