misc-图片隐写及压缩包技巧

     在ctf-misc中,隐写题占了好一部分,所以今天来总结一下图片隐写及压缩包的破解。

         当然,最简单的就是查看属性,看看是否有经过编码过后的特殊字符,解码后可能就是密码之类的。

一.隐写

1.利用binwalk工具分离图片

1.首先将文件放到kali下,利用binwalk命令查看图片,通过查看描述可以发现图片中还隐藏了另外一张图片。

2.接着利用binwalk -e或foremost命令来分离他们。

 

 

 

 

 

 

3.在生成的目录中,我们可以发现被隐藏的图片,从而得到flag。

     (当然,作为一个win系统的菜鸡,又懒得打开虚拟机传文件去分离,所以最简便的方法是用formost直接分离所有文件,formost详细安装看这里)(也适用于压缩包)

2.stegsolve工具的利用:(LSB隐写)

1.首先打开stegsolve,并open题目图片

 

 

2.通过点击左右箭头,来查看图片在其它文件格式下的图像,然后在Gray bits格式下,发现一张隐藏的二维码,扫描二维码即可得到flag

3.在其它格式下也可能会有提示信息,例如这张图

4.在Green plane0格式下直接发现了flag

 

 

3. txt简单隐写

【此类题目可以说是最简单的一类题,通过直接使用记事本或者其它文本编辑软件,可直接查看。一般拿到图片后,大多先用记事本查看,从而判断是否为txt简单隐写。一般flag会位于文本开头或结尾,少数情况会在文本中间,这类情况后面会单独介绍】

1.拿到图片后,直接用记事本打开,在文本结尾发现了一串编码,学习过密码学的人应该很容易认出这是Unicode加密。

 

 

2.利用解码器可直接解flag

4.关键字搜索

【这类题目与txt简单隐写类似,但flag大多隐藏在文本中间,当文本过长的时候,只靠肉眼查找会浪费很多时间,我们可以直接用ctrl+f搜索关键字,例如:flag、FLAG、key、KEY或根据赛方要求的格式进行查找】

5. 十六进制文件头补全及修改

【首先,我们需要知道文件头是位于文件开头,用处承担一定任务的数据,我们可以通过文件头来判断文件类型。因此,当文件头被删除或修改后,文件可能会打不开,这种情况我们就要根据所给文件的后缀,补全或修改文件头】

1.先观察所给的文件类型,发现是jpg格式,我们就要想到jpg文件的文件头为FFD8FF(常用文件头

2.利用Winhex打开图片,查看文件的十六进制,观察后我们会发现,相比于正常的jpg文件,这张图的文件头缺失了三位

3.将文件头补全后保存,系统会自动生成一个备份文件,防止修改错误,而原文件则会变为正常图片

4.文件头修改同理,观察文件头前几位,将其修改为正确格式,保存后即可得到正常图片

 

5.最近还遇到了另一种的修改方式,就是开头是png格式,但是结尾却是FF D9(jpg文件结尾),所以需要将开头改为FFD8FFE0(jpg文件开头)

6. png格式的IHDR问题

【这类题目最大的标志:图片格式为png,或当你感觉这张图片好像被裁掉一部分时,要考虑的这类问题。这类题目的原理我理解的并不是很深刻,仅仅局限于解题方法...】

1.先查看一下原图

 

 

2.用十六进制编辑器打开图片后,我们会发现他的标志IHDR,对应左边十六进制的49 48 44 52,我们以此为界,后面的四位为图片宽度,再向后四位为图片高度

2.接下来,我们根据实际情况,将宽度和高度改为相同数值,然后保存

3.再次查看图片,发现隐藏的flag

 

 

 

7.TXT下隐藏png(暂且这么叫,因为本萌新也不知道叫什么)
如图:

解题方法:(也许比较片面,望指正)

     一般来说,winhex打开后都是flag.txt下有secret.png, 然而,png原本是看不到的,所以就要修改 A8 3C 7A(原来的)(我的结论就是在png的上下几行内),需要将7A修改为74,然后保存就有png的图片了。

二.压缩包加密

1. 伪加密

Zip伪加密与zip的文件格式有关(zip的格式详解请翻到本文的最后0x07部分),zip中有一位是标记文件是否加密的,如果更改一个未加密zip包的加密标记位,那么在打开压缩包时就会提示该文件是加密的。

对于伪加密有以下几种方法:

1. 在Mac OS及部分Linux(如Kali)系统中,可以直接打开伪加密的zip压缩包

2. 使用检测伪加密的ZipCenOp.jar,解密后如果能成功打开zip包,则是伪加密,否则说明思路错误

3. 使用16进制编辑器改回加密标记位

以HBCTF的一道题讲解这几种方法:

http://p5.qhimg.com/t01a009da383e529f49.png

如上,尝试解压压缩包时提示有密码,根据题干:比爆破更好的方法推测为伪加密,用三种方法来解此题:

1. 用除windows外的系统直接打开压缩包

在Mac OS和部分Linux系统(如Kali)中,右键解压可直接打开伪加密的zip压缩包,当然,暂未明确何种Linux能打开伪加密压缩包,如有传授,不胜感激!

2. 使用ZipCenOp.jar(需java环境) 使用方法

java -jar ZipCenOp.jar xxx.zip

http://p6.qhimg.com/t01d7a8a7a2474c4337.png

经ZipCenOp.jar解密后的压缩包可直接打开

http://p1.qhimg.com/t015bf711f1a744ff2d.png

3. 用16进制编辑器修改加密标记位

http://p1.qhimg.com/t015dbef209fe99fc31.png

如上图,修改加密标记位为00,保存,即可打开压缩包(zip文件结构

2. 爆破/字典/掩码攻击

把这三种归位一类是因为这三种方法在本质上都是逐个尝试,只不过待选密码的集合不同

1. 爆破:顾名思义,逐个尝试选定集合中可以组成的所有密码,知道遇到正确密码

2. 字典:字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,因此就避免了爆破时把时间浪费在脸滚键盘类的密码上

3. 掩码攻击:如果已知密码的某几位,如已知6位密码的第3位是a,那么可以构造 ??a??? 进行掩码攻击,掩码攻击的原理相当于构造了第3位为a的字典,因此掩码攻击的效率也比爆破高出不少

对这一类的zip问题,推荐windows下的神器AZPR

举例如下:

(1) 对爆破,以ISCC 2017 Basic-08为例,选定暴力攻击、字符集和长度后进行爆破

http://p7.qhimg.com/t018a6f366fcf9b3f21.png

http://p4.qhimg.com/t010afd7e4440281a23.png

点击开始,进行爆破,如下图,在4ms内就找到了密码为BIT

http://p0.qhimg.com/t01811a7e2dcb89cade.png

另:此题后续为简单的base64解密;爆破在密码长度小于6位时较快,因此如果在7位之内没有爆破出结果时,基本就可以考虑换个方法了;此题的正规解法是培根密码的转换

(2) 字典,还以之前的ISCC 2017 Basic-07举例,从图片中分离出一个加密的zip压缩包,爆破无果后考虑字典攻击(可从网上下载字典,但大多数题目需要自己构造字典)

http://p6.qhimg.com/t0161c303af1040467f.png

字典攻击的结果如下图,在字典选择合适的情况下,用很短的时间就能找到密码

http://p0.qhimg.com/t01f20c62ea9613230d.png

继续以此题为例,解压后的压缩包有一个txt文档和一个握手包,txt内容如下:

http://p1.qhimg.com/t016b6d12c62d06a5ad.png

因此可知握手包的密码为ISCC****的形式(*代表大写字母或数字),自己写程序构造字典

http://p9.qhimg.com/t01023e96e1a806e82c.png

运行此程序得到字典如下:

http://p4.qhimg.com/t01ebdf87a5ebae3d3a.png

之后用aircrack-ng来选中字典跑除握手包的密码如下图,不再详述

http://p5.qhimg.com/t014ad5b26364cf618f.png

(3) 掩码攻击,以ISCC 2017 Misc-06为例,题目给了一个jpg图片,用2中的方法分离出加密的压缩包,根据题目提示:注意署名, 构造????LiHua的掩码(?可在自己定义的字符集中任意选择)进行掩码攻击,如下图:

http://p6.qhimg.com/t01df197bb44c6ff8da.png

攻击结果如下,只耗费了很少的时间就找到了密码

http://p9.qhimg.com/t011e91c09434272596.png

 

3.明文攻击

明文攻击是一种较为高效的攻击手段,大致原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件,更详细的原理请读者自行谷歌

举个例子,已知 明文攻击.zip 中存在的文件 明文.txt,

因此将 明文.txt 压缩,这里需要判断明文压缩后的CRC32是否与加密文件中的一致,若不一致可以换一个压缩工具。

http://p4.qhimg.com/t0112994a09cc25c574.png

攻击过程如下:

http://p2.qhimg.com/t0170f27bf19e30b533.png

点击开始,很快就恢复了密码

http://p4.qhimg.com/t016abbabfa89c43970.png

另:当明文的大小比较小时,攻击速度会比较慢;即使有时没有恢复密码,也可以使用明文攻击,最后点保存还是能得到压缩包里内容的。

 

4. CRC32碰撞

CRC32:CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。

在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容

还是以之前HBCTF伪加密那道题为例,另一种解法就是CRC32碰撞,打开压缩包,可以看出压缩文件 flag6位数

的CRC32值为0x9c4d9a5d

http://p4.qhimg.com/t01b82b48613741c1c9.png

因此写出碰撞的脚本如下:

http://p1.qhimg.com/t01a640855d935796bf.png

要特别注意

if (binascii.crc32(str(i)) & 0xffffffff) == crc:

在 Python 2.x 的版本中,binascii.crc32 所计算出來的 CRC 值域为[-2^31, 2^31-1] 之间的有符号整数,为了要与一般CRC 结果作比对,需要将其转为无符号整数,所以加上& 0xffffffff来进行转换。如果是 Python 3.x 的版本,其计算结果为 [0, 2^32-1] 间的无符号整数,因此不需额外加上& 0xffffffff 。

脚本的运行结果如下,即为压缩文件的内容:

http://p5.qhimg.com/t01e060547556133ddc.png

再举另一个bugku中的例子,下载下来的文件是68个压缩包,并且根据binwalk的检查结果,每个压缩包里都有一个大小为4个字节,名为out.txt的压缩文件

http://p0.qhimg.com/t010586f8c300e85b02.png

用如下的脚本碰撞出所有压缩包中的数据:

http://p9.qhimg.com/t01be844b801390f33c.png

http://p7.qhimg.com/t0113a72419e06317f1.png

此题较为繁琐,之后的步骤不再展开

另:限于CPU的能力,CRC碰撞只能用于压缩文件较小的情况

5. 修改格式

这种情况花样较多,难以做一个详细的总结,因此只列举最常见的缺少文件头或文件尾。

放一个zip文件格式讲的较清楚的链接,通过对zip文件格式的了解,可以解释之前伪加密的问题,同时也可以对缺少文件头或文件尾有更直观的认识。

http://p5.qhimg.com/t0159fc55b30cd3e507.png

如上为正常zip,缺头zip和缺尾zip的binwalk扫描结果,根据扫描结果用16进制编辑器添加文件头或文件尾,即可修复zip。

   当然,也有些说法为C4 3D 7B 00 40 07 00是rar文件尾(有的wp上说这就是rar文件的问件尾,但是我好像看过别的rar文件,尾部并不是这样的),将文件头52 61 72 21 1A 07 00补上,改后缀为rar,打开后文件信息部分出现flag

三.最后

     比赛中肯定好几种知识一起用,要随机应变。

四.参考文章:

      https://blog.csdn.net/Dog_Captain/article/details/89028552        作者:Sn1Per_395                    

      https://www.anquanke.com/post/id/86211           作者:M4xW4n9

posted @ 2020-01-15 15:25  starshine0618  阅读(8179)  评论(0编辑  收藏  举报