• 主页
  • 相册
  • 随笔
  • 目录
  • 存档
Total 244
Search AboutMe

  • 主页
  • 相册
  • 随笔
  • 目录
  • 存档

哈希长度扩展攻击

2019-07-18

1. 哈希长度扩展攻击实验

本博客内容旨在技术学习交流,仅供学习参考之用,请勿用于任何非法用途,否则后果作者概不负责

本文主要介绍哈希长度攻击的主要流程与具体实现

参照:

  • 实验步骤介绍
  • Hash_extender作者讲解攻击原理

2. 原理介绍

  • 哈希长度扩展攻击(Hash Length Extension Attack)是指针对某些允许包含额外信息的加密散列函数的攻击手段。该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 $H(secret ∥ message)$ 此类构造的散列函数。MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性
  • Merkle-Damgård哈希函数首先应用符合MD的填充函数来创建大小为固定数字(例如512或1024)的倍数的输入 。然后,散列函数将结果分解为固定大小的块,并使用压缩函数一次处理一个,每次将输入块与前一轮的输出组合。如图1所示
图1:Merkle–Damgård结构示意图
> 在该图中,单向压缩函数用f表示,并将两个固定长度的输入变换为与一个输入相同大小的输出。该法以初始值(初始化矢量(IV))开始。IV是固定值(算法或特定于实现)。对于每个消息块,压缩(或压缩)函数f获取到目前为止的结果,将其与消息块组合,并产生中间结果。根据需要用零填充最后一个块,并附加表示整个消息长度的位。
  • 在实践中,服务器依据客户端传输的$Hash$值与$Message$值重新计算$HM’$,并判断$HM$是否等于$HM’$,以此确保信息的真实性与完整性

3. 攻击过程介绍

  • 在哈希长度扩展攻击中,攻击者事先掌握的信息包含:

    • 消息被附加了密钥$secret$(密钥长度已知或未知)
    • 消息原文$message$
    • 哈希函数$H( )$
    • 哈希值 $HM=H(secret ∥ message)$
  • 在掌握以上信息的基础上,攻击者只需要根据上一轮输出的链变量($HM$)继续进行一次哈希,得到新的$HM ‘$,具体操作为:

    • 获取新$Message$值:

      1. 先将$secret||message$段通过长度扩展的方式填充为一个块(block)的大小,此处为64字节(注:此处$secret$并非本值,只是长度填充)
      1
      2
      3
      4
      0000  73 65 63 72 65 74 64 61 74 61 80 00 00 00 00 00  secretdata......
      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 50 00 00 00 00 00 00 00 ........P.......
      1. 再在末尾加上扩展值$append$
      1
      2
      3
      4
      5
      0000  73 65 63 72 65 74 64 61 74 61 80 00 00 00 00 00  secretdata......
      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 50 00 00 00 00 00 00 00 ........P.......
      0040 61 70 70 65 6e 64 append
      1. 我们知道最后服务器会在我们提交的$Message$前附加$secret$前缀,所以我们去掉前面占位的$secret$,并做$urlencode()$转换,最终得到新的$Message$
    • 获取新$HM ‘$

      $HM ‘=H(HM,append)$

  • 对比结果展示:

beforeafter
$H( )$$md5/sha1/sha256$…$md5/sha1/sha256$…
$HM$$H(secret ∥ message)$$H(secret ∥ message
$Message$$message$$message

4. 实验步骤介绍

4.1. 预备——实验工具与环境

实验使用的工具包含:

  • Hash_Extender
  • Burp Suite

实验环境:cryptOMG的challenge 5

4.2. 发现漏洞

  1. 根据url中参数hash值的长度(40),可判断其所用的哈希算法(大概率)是$sha1$
  2. 通过对比计算发现,url中包含的hash参数值并非$H_{sha1}(mesage)$,可以猜测是附加了$secret$值构成的$H_{sha1}(secret ∥ message)$,由此,判断可能可以运用哈希长度扩展攻击

4.3. 利用漏洞

  1. 运用Hash_Extender:根据Hash_Extender语法,在shell中输入以下命令,得到url中algo、file和hash参数对应值,输出结果如图2所示(注:本处选取的‘ ’../ ‘ 数量并非唯一可能,经测试选用其他数量也可在最终得到passwd结果)
1
./hash_extender -f sha1 --data 'test' --s '93e8aee4ec259392da7c273b05e29f4595c5b9c6' --secret-min=10 --secret-max=40 --append '../../../../../../../../../../../../../../etc/passwd' --out-data-format=html --table > hash
图2:Hash_Extender输出
2. 进行本地文件包含(LFI)攻击 - 文件包含漏洞是指客户端(一般为浏览器)用户通过输入控制动态包含在服务器的文件,从而导致恶意代码的执行及敏感信息泄露。本质上是通过构造恶意语句,并交由服务器端解释执行。
  • 使用Burp Suite工具攻击:

    1. 设置代理服务器,设置监听地址与窗口,示例如下

      图3:代理地址与端口设置
    2. 打开测试页面抓包,示例如下

      图4:抓包结果展示
    3. 转入intruder,配置攻击方式,如下图所示

      图5:攻击目标地址与端口设置
      图6:攻击方式与url参数设置
      图7:载入参数字符串文本
    4. 结果如下图所示

      图8:结果展示
  • 使用python脚本攻击

    基本原理是使用requests库的GET请求,并判断返回状态码。输出结果显示$secret$长度与成功的url

1
2
3
4
5
def test(url, i):
#payload = {'algo': 'sha1', 'file': path, 'hash': hashsum}
status = requests.get(url, timeout=30).status_code
if status == 200:
print("secret_length = %d"%(i)+"\nhref = "+url)

5. 攻击结果展示

  • sec
  • Security
  • Network Security
VirtualBox网络攻防环境搭建
flask实现图片上传处理
© 2024 何决云 载入天数...