• 长度延展攻击


    20191218 长度延展攻击

    1.长度延展攻击

    长度扩展攻击(length extension attack),是指针对某些允许包含额外信息的加密散列函数的攻击手段。

    对于满足以下条件的散列函数,都可以作为攻击对象:

    • ① 加密前将待加密的明文按一定规则填充到固定长度(例如512或1024比特)的倍数;

    • ② 按照该固定长度,将明文分块加密,并用前一个块的加密结果,作为下一块加密的初始向量(Initial Vector)。

    满足上述要求的散列函数称为Merkle–Damgård散列函数(Merkle–Damgård hash function),下列散列函数都属于Merkle–Damgård散列函数:MD4、MD5、RIPEMD-160、SHA-0、SHA-1、SHA-256、SHA-512、WHIRLPOOL

    这里有两种类型的长度扩展攻击。符号||表示链接。
    类型一:如果Digest(Msg1)=Digest(Msg2),并且Len(Msg1)= Len(Msg2),消 息 Msg1 ¹ Msg2,则 Digest(Msg1 ‖ Sufx)= Digest(Msg2‖Sufx)。

    类型二:假设一个原始消息Msg,攻击者不知道消息的内 容,给定 Len(Msg),填充消息 X,Digest(Msg),对于一个适当 的后缀,攻击者可以计算出Digest(Msg‖Sufx)。

    通过消息的填充可以抵抗第一类型的攻击;第二类的攻 击可以通过大的内部状态来预防。链接变量循环的Hash结构 中使用了消息填充,可以抵抗第一类型的攻击;链接变量长度 n 远大于Hash值长度 l(n > 2l) ,也就是说Hash值长度小于链接 变量长度,使得计算 Msg‖Sufx 的 Hash 值时,无法连接。因 此,可以抵抗第二类长度扩展攻击。

    对于H(salt+data)形式的加密,在以下条件满足的情况下,攻击者可以通过该方法获取H(salt+一定规则构造的data):

    • ① 知道密文的加密算法且该算法满足Merkle–Damgård散列函数特征;
    • ② 不知道salt,但知道salt的长度,并可控制data的值;
    • ③ 可以得到一个H(salt+data)的值。

    下面以MD5算法为例,讲述该攻击方式如何进行攻击,具体过程如下:

    • ① 填充
      拿到明文后,MD5现将明文转为二进制文件,然后将二进制文件的长度除以512比特(即64字节),如果余数等于448比特(即64-8字节),那么直接在后面加上八个字节的长度标识,使之成为512比特的倍数。否则则在明文后填一个1,再填充0直至其长度除以512等于448,再加上8位的长度标识。长度是使用大端序(big Endian)来存储,即低字节放在高地址位上。
      比如加密的明文是admin,其二进制文件以16进制表示是0x61646d696e,长度是40比特(5字节),那么需要补充408比特(51字节)的填充符,填充内容第一位是1,其余全部是0。16进制表示是0x800000000000000000000000000000000000000000000000000。然后再添加8个字节的长度标识,admin长度为40比特,16进制是0x28,这个28要放在高位,就是0x280000000000000。结果如下所示:

    • ② 分块运算
      填充完毕后,函数就将填充后的明文以512比特的长度分块,进行运算。在运算中会用到四个初始向量(MD5中称作链变量,Chaining Variable),分别是A=0x67452301B=0xefcdab89C=0x98badcfeD=0x10325476。经过一系列复杂的数学运算,函数会得到第一块的MD5值,然后将该MD5值分成四块,以大端序形成新的链变量,投入到第二块的运算,形成新的MD5值……以此类推,直到算出最后一块的MD5值,就是整个数据块的MD5值。
      例如加密的明文是adminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadminadmin,首先根据①的描述的算法填充后,分成两块进行运算,第一块是adminadminadminadminadminadminadminadminadminadminadminadminadmi,其MD5码是e7d6ca05773d038378f5e2674850be25,分成四块并以大端序存储,则A=0x05cad6e7B=0x83033d77C=0x76e2f578D=0x25be5048。将这四个变量作为链变量投入运算,再将第二部分加密,得到最终的MD5值是9ea2d490481dbcdadf61e7e404b99585

    参考资料

    2.长度延展攻击的ctf试题案例

    用御剑工具扫描

    扫描后台目录,发现index.phpindex.php~,点进去发现index.php~可以下载,但打开后是乱码

    根据文件内容头部信息的Vim版本号,发现此文件为Linux下Vim编辑后的备份恢复文件,需要在Linux下修复,首先将文件名改为index.php.swp

    再输入命令vim -r index.php得到恢复后的index.php

    index.php源码如下:

    <!DOCTYPE html>
    <html>
    <head>
    <title>Web 350</title>
    <style type="text/css">
    	body {
    		background:gray;
    		text-align:center;
    	}
    </style>
    </head>
    
    <body>
    	<?php 
    		$auth = false;
    		$role = "guest";
    		$salt = 
    		if (isset($_COOKIE["role"])) {
    			$role = unserialize($_COOKIE["role"]);
    			$hsh = $_COOKIE["hsh"];
    			if ($role==="admin" && $hsh === md5($salt.strrev($_COOKIE["role"]))) {
    				$auth = true;
    			} else {
    				$auth = false;
    			}
    		} else {
    			$s = serialize($role);
    			setcookie('role',$s);
    			$hsh = md5($salt.strrev($s));
    			setcookie('hsh',$hsh);
    		}
    		if ($auth) {
    			echo "<h3>Welcome Admin. Your flag is 
    		} else {
    			echo "<h3>Only Admin can see the flag!!</h3>";
    		}
    	?>
    	
    </body>
    </html>
    

    已经做过的hash拓展攻击:
    hash_extender:已知hash{secret(已知长度)},求hash{secret (已知长度)|| data (填充字段)|| attacker_controlled_data(自定义字符串)}
    hashpumpy:hashpump(hexdigest, original_data, data_to_add, key_length) -> (digest, message)
    本题:已知md5(secret(未知长度)+string1),求md5{secret||%00等填充字段||2string}
    最大的不同就是不知道salt长度!能有多长!到64够不够!爆破不就可以了!

    安装hashpump:

    git clone https://github.com/bwall/HashPump~
    sudo yum install g++ libssl-dev
    cd HashPump
    make
    make install
    

    参考WP

    3. 用hashpump完成2中案例的攻击

  • 相关阅读:
    Mysql开启日志
    amfphp传递负数的bug
    linux /var/spool/clientmqueue 目录占大量空间
    WinXP SSH连接不上虚拟机的解决方法
    批量数据替换助手V1.0版发布
    也谈反射的应用场景
    反射+特性打造简洁的AJAX调用
    文本处理之利器正则表达式闪亮登场
    关于缩略图的生成与访问策略的一些经验分享
    装饰模式个人的一些理解
  • 原文地址:https://www.cnblogs.com/20191218tangqiheng/p/16187215.html
Copyright © 2020-2023  润新知