用户
搜索

[其他安全] HASH函数烧脑大作战

  • TA的每日心情
    开心
    2018-9-11 11:32
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]经常看看I

    i春秋-核心白帽

    Rank: 4

    80

    主题

    105

    帖子

    1153

    魔法币
    收听
    0
    粉丝
    19
    注册时间
    2016-6-6
    发表于 2018-10-17 15:21:23 011206
    本期讲解一下hash函数,由于之前在比赛中做到了一题hash有关的题目,引发了此次的深(烧)度(脑)研究,本来想讲讲原理,但是太难,看得很痛苦,所以此次通过结合CTF题来看看HASH的一些利用,一切从简开始讲述,小编是如何入坑的。
    认识一下HASH是什么,以及题目中要遇到的一些HASH算法

    HASH

    散列函数(Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。它把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。----wiki百科《HASH》

    MD5消息摘要算法

    MD5消息摘要算法(MD5 Message-Digest Algorithm)一种被广泛使用的密码散列函数,可以产生一个128位的散列值,用于确保信息信息和传输完整一致。----wiki百科《MD5消息摘要算法》


    SHA家族

    安全散列算法(Secure Hash Algorithm)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。----wiki百科《SHA家族》

    废话讲完了,现在开始真正的CTF实战。

    实验吧-Hashkill

    题目链接:Hashkill
    题目:6ac66ed89ef9654cf25eb88c21f4ecd0是flag的MD5码,(格式为ctf{XXX_XXXXXXXXXXX_XXXXX})由一个0-1000的数字,下划线,纽约的一个区,下划线,一个10000-15000的数字构成。

    考点:关于HASH的暴力攻击---判断HASH的类型后,可通过自行编写脚本进行暴力攻击

    分析:拿到题目后,进行题目分析,有用的信息:

    1.flag的MD5码: 6ac66ed89ef9654cf25eb88c21f4ecd0

    2.格式为ctf{XXX_XXXXXXXXXXX_XXXXX}

    3.Flag中的内容分别是:①0-1000的数字,②纽约的一个区,③10000-15000的数字,并且用下划线进行连接。

    此题,无需判断,题目已给出,只需对照结合Python中的hashlib模块编写脚本进行破解即可。


    2018金融业CTF题---- Encrypted Traffic

    题目内容如下图:

    下图.webp.jpg

    考点:与上一题相似,但此题需自行判断使用的HASH类型。

    分析:

    1.获取加密后的密码字段值:ac22543d5382cbf48b6ebcf6e40f123d9ca4b91f9998e4c2f2422402

    2.知悉是SHA系列哈希算法----从SHA的特征(红框)判断:SHA-224

    224.webp.jpg

    3.ATM取款密码----取款密码为6位纯数字

    4.加盐之后的哈希值,并且盐为用户名拼音,为zhangsanfeng

    5.提交格式:flag{密码_哈希算法_盐}----flag{密码_SHA224_zhangsanfeng}

    分析后,发现其实这题不难,只要对密码进行遍历后结合zhangsanfeng使用脚本进行暴力攻击(如zhangsanfeng123456或123456zhangsanfeng)

    当然此题,也可使用大佬写的工具进行判断HASH类型。用法很简单,可先通过github下载后,进入到对应的路径下:

    路径下.webp.jpg

    在红色框中输入对应的hash值即可:

    即可.webp.jpg

    发现结果:

    发现.webp.jpg

    里面给出多种可能,一般的结果为Most Probable中所提到的。
    最后再结合Python中的hashlib模块进行编写脚本即可。

    实验吧-让我进去

    对于上面的小儿科,接下来这个可就是大咖了,需先学习一下MD5的算法原理,再进行解题会更容易一些。

    题目链接:让我进去
    题目:相信你一定能拿到想要的。

    Hint:你可能希望知道服务器端发生了什么…

    格式:CTF{}

    解题链接: http://ctf5.shiyanbar.com/web/kzhan.php

    考点:Hash长度扩展攻击----依赖于HASH算法的设计缺点进行利用(度了一下,哈希长度扩展攻击(hash length extension attacks)是指针对某些允许包含额外信息的加密散列函数的攻击手段。该攻击适用于在消息与密钥的长度已知的情形下,所有采取了 H(密钥 ∥ 消息) 此类构造的散列函数。MD5和SHA-1等基于Merkle–Damgård构造的算法均对此类攻击显示出脆弱性)

    在开始讲题目之前,先进行一波MD5基础学习

    术语、运算符

    QQ截图20181017151400.jpg

    填充位

    何为填充位?实际就是当数据的长度不够我们的标准,那么就得把它进行填充,直到达到标准为止。标准:(要使补位后的消息长度)mod 512 = 448
    举个例子:
    ndsec----ascii码:’n’=110,’d’=100,’s’=115,’e’=101,’c’=99
    对应的二进制:0110 1110,0110 0100,0111 0011,0110 0101,0110 0011。该字符串长度为40bit,很明显40 % 512 = 40 < 448,因此需要补位至448位。
    补位需注意第一位补1,其余补0(小编认为这里的1应该是标志位,0应该是为了是其数据尽可能小):0110 1110 0110 0100 0111 0011 0110 0101 0110 0011 1000 …省略404个0,为了看起来更方便,转换为16进制:6E647365 63800000 …省略96个0。


    添加长度

    填充位数后,要进行的便是添加长度位,顾名思义,就是表示原始数据长度,上述例子的长度为40bit,即00000000 00000028,需要注意的是这里是指原始数据长度,不算填充位的长度,若原始数据长度小于2^64,则直接表示即可,反之,则需要用长度的低64位进行表示,即长度 mod (2^64)


    所需使用的初始常数以及函数

    4个初始常数:A=0x01234567,B=0x89ABCDEF,C=0xFEDCBA98,D=0x76543210
    4个非线性函数:

    F(X,Y,Z) = (X ^ Y) || ((~X) ^ Z)

    G(X,Y,Z) = (X ^ Z) || (Y ^ (~Z))

    H(X,Y,Z) = X XOR Y XOR Z

    I(X,Y,Z) = Y XOR (X || (~Z))


    计算消息摘要

    把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。

    利用上述的原理可自行编写MD5的加密代码,当然这些只是给想深入学习的同学一些编写思路基础,小编懒散惯了,还是比较喜欢用现成的工具来玩:

    工具安装(建议在kali中安装,因为环境都已经有了,比较方便):

    [PHP] 纯文本查看 复制代码
    git clone [url]https://github.com/bwall/HashPump[/url]
    
    cd HashPump
    
    make
    
    make install


    开始解题

    进入解题链接后,发现登录框(又是登录框)。

    登录.webp.jpg
    惯用套路,想着看源码、抓包分析…
    这题直接看源码是不行的,只能抓包,发现在cookie中有个source字段(默认置0):

    默认.webp.jpg

    把source置为1后发送,发现返回了源码:

    源码.webp.jpg

    进行代码审计(这里偷了个懒,看了大佬的writeup),发现源码给出了secret值长度为15,要满足$COOKIE["getmein"] === md5($secret . urldecode($username . $password))并且urldecode($username) === "admin" && urldecode($password) != "admin"才可以获得flag,并且初始srcret.adminadmin进行md5后的值也是已知的,故可利用md5,sha1这类hash函数分块hash的特性,直接利用已知的第一块的hash值对后面的块进行hash。username输入admin,password是输入攻击后的值。此处需通过工具,得到:

    得到.webp.jpg

    如上,对应输入初始的hash值,需要输入的初始的admin,secret值长度+前面的admin的长度(即15+5=20),以及最后需要添加的参数(用于结合Hash长度扩展攻击绕过password不许为admin的条件)。得到对应的cookie值以及Hash长度扩展后的值,注意此处需要将\x替换为%后再输入password中:

    中.webp.jpg

    最后获得flag值,过程艰难,需要对MD5的原理进行理解一下,便会理解此题的解题思路。

    学习小建议

    Hash函数学习起来有些困难,变得越来越枯燥无味,甚至在学习过程中也会变得毫无头绪,但是大佬给的建议是结合题目进行学习,在学习中解题,在解题中学习,可以让一些原本枯燥无味的学习过程转换成在解题中不断克服难题后学习的喜悦,这是一种很不错的学习方法,值得我们好好学习一下。

    qrcode_for_gh_223e082fe8a7_344.jpg


    本帖被以下淘专辑推荐:

    • · Crypto|主题: 1, 订阅: 0
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册