HASH函数烧脑大作战

本期讲解一下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

题目内容如下图:

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

分析:

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

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

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

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

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

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

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

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

发现结果:

里面给出多种可能,一般的结果为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基础学习

术语、运算符

位(bit)

字节(Byte)

字(word)

1 word = 4 Byte = 32 bit

符号

对应意思

^

逻辑与

||

逻辑或

XOR

逻辑异或

~

逻辑取反

填充位

何为填充位?实际就是当数据的长度不够我们的标准,那么就得把它进行填充,直到达到标准为止。标准:(要使补位后的消息长度)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中安装,因为环境都已经有了,比较方便):

git clone https://github.com/bwall/HashPump
cd HashPump
make
make install

开始解题

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

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

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

进行代码审计(这里偷了个懒,看了大佬的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是输入攻击后的值。此处需通过工具,得到:

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

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

学习小建议

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

致铁粉们:为了防止跟斗哥走散,请星标一下【漏斗社区】,这样无论你在地球的哪一端,我们都能愉快的玩耍啦。

原文发布于微信公众号 - 漏斗社区(newdooneSec)

原文发表时间:2018-09-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏架构说

Effective STL(21) 永远让比较函数对相同元素返回false

问题描述: 昨天一哥们些的程序,在定义比较函数的时候是这样写的 bool cmp(const T& a, const T& b) { if (a >=...

3729
来自专栏yw的数据分析

data.table包使用应该注意的一些细节

  注意默认nThread=getDTthreads(),即使用所有能用的核心,但并不是核心用的越多越好,本人亲自测试的情况下,其实单核具有较强的性能,只有在数...

761
来自专栏来自地球男人的部落格

tensorflow中取值

最近在写用tensorflow的程序时,中途遇到想取出tensorflow中的返回值是什么,可是其返回值也是一个tensor。用了两种方法,试图将tensor直...

2236
来自专栏Android相关

散列表(Hash Table)

散列表是一种以平均O(1)时间插入、删除和查找的数据结构,可是类似于findMax,findMin等操作则需要以O(N)的时间才能完成

1763
来自专栏华章科技

10道Hadoop面试真题及解题思路

首先是这一天,并且是访问百度的日志中的IP取出来,逐个写入到一个大文件中。注意到IP是32位的,最多有个2^32个IP。同样可以采用映射的方法, 比如模1000...

742
来自专栏申龙斌的程序人生

零基础学编程018:条件语句

学习了《零基础学编程017:画出我的公众号LOGO》之后,可以用几行代码,画出一个螺旋渐开线。 from turtle import * for i in r...

3526
来自专栏JMCui

策略模式.

    网上介绍设计模式的文章有很多,好文也不少。作为设计模式的初学者,实在不敢多加造次。就仅以此文作为我记忆的备忘录吧!

1113
来自专栏图形学与OpenGL

WebGL画点程序v2

本文程序实现画一个点的任务,如下图。其中,点的位置坐标由Javascript传到着色器程序中,而不是直接给定(“硬编码”)在顶点着色器中。

1144
来自专栏王亚昌的专栏

FFMPEG-如何对视频按时长切片与压缩

本文介绍如何用ffmpeg开源组件按时长进行切片,举一个例子,一个视频网站,拿到一个时长1.5小时的电影,用户点击播放时,常用的技术方案就是把一个完整的大文件,...

1421
来自专栏xcywt

编译到底做了什么(***.c -> ***.o的过程)

 (第一次写博客,好激动的说.......) 我们知道,一个程序由源代码到可执行文件往往由这几步构成: 预处理(Prepressing)-> 编译(Compil...

2055

扫码关注云+社区

领取腾讯云代金券