【CTF 攻略】CTF比赛中关于zip的总结

在线wifi跑包 金刚包跑包 cap跑包 hccapx ewsa在线 就来 握手包跑包

各位好 又见面了 我是曹操 今天给大家带来一篇新的教程

希望各位细心学习 低调用网

跑包字典下载zip

预估稿费:300RMB 投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

前言

在CTF比赛的MISC和CRYPTO中,经常需要处理zip压缩包。本文将对zip方面的知识进行总结。

本文中用到的所有文件和工具都可在这个网盘中找到。

目录

隐写篇

0x01. 通过进制转换隐藏信息

0x02. 在图片中隐藏压缩包(图种)

加密篇

0x03. 伪加密

0x04. 爆破/字典/掩码攻击

0x05. 明文攻击

0x06. CRC32碰撞

格式篇

0x07. 修改格式

0x01. 通过进制转换隐藏信息

这种方法比较简单,我们以一道题目为例进行讲解(题目来自ISCC 2017 Basic-04)。题目给出了一个txt文档,我们先观察一下数据。

经过观察,所有数据都在16进制能表示的范围之内。因此,我们尝试使用十六进制编码解密。下面是一个Python脚本的示例:

import binascii

data = "..."
decoded_data = binascii.unhexlify(data)
print(decoded_data)

运行结果中可能存在大量乱码,但我们仍然能够看到flag.txt。因此,我们猜测txt中的这段字符是zip包的16进制表示(同时开头的PK也暗示这是一个zip包,PK是zip格式发明者Phil Katz的名称缩写,zip的前两个字母就用了PK)。

我们将这段字符导入到16进制编辑器中,这里以010editor为例。导入后选择”Save As”(快捷键ctrl + shift + s),给新文件命名时加上后缀.zip,保存后发现zip文件是正常的。因此,我们证明了这个思路是正确的。

另外,除了16进制的编码转换,有时还会遇到2进制编码的转换,思路相同,不再赘述。

0x02. 在图片中隐藏压缩包(图种)

这种方法是最常见的zip隐藏方式,多用于在一张图片中隐藏一个压缩包。原理是:以jpg格式的图片为例,一个完整的JPG文件由FF D8开头,FF D9结尾,图片浏览器会忽略FF D9以后的内容,因此可以在JPG文件中加入其他文件。

我们以一道题目为例进行讲解(ISCC 2017 Basic-07)。对于这种隐写,最简单的方法是使用Kali下的binwalk进行检测。在终端中输入以下命令:

binwalk 图片名

检测结果会显示图片中存在压缩包。

分离这个压缩包有至少两种方法:

  1. 利用Linux下的foremost工具。在终端中输入以下命令:
foremost 图片名

foremost默认的输出文件夹为output,在这个文件夹中可以找到分离出的zip文件。

  1. 更简单粗暴的方法是直接将图片的后缀改为.zip,然后解压即可(这种方法虽然简单快速,但如果隐写了多个文件时可能会失败)。

另外,本题的后续步骤为构造字典,爆破握手包。

0x03. 伪加密

Zip伪加密与zip的文件格式有关。zip中有一位是标记文件是否加密的,如果更改一个未加密zip包的加密标记位,那么在打开压缩包时就会提示该文件是加密的。

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

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

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

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

我们以HBCTF的一道题目为例进行讲解。题目给出了一个伪加密的zip压缩包。我们可以尝试以下三种方法来解题:

  1. 用除Windows外的系统直接打开压缩包。在Mac OS和部分Linux系统(如Kali)中,右键解压可直接打开伪加密的zip压缩包。

  2. 使用ZipCenOp.jar(需要Java环境)。使用以下命令解密压缩包:

java -jar ZipCenOp.jar -d 压缩包名

解密后的压缩包可以直接打开。这种方法最为便捷。

  1. 用16进制编辑器修改加密标记位。打开压缩包,找到加密标记位,将其修改为00,保存,即可打开压缩包。

0x04. 爆破/字典/掩码攻击

这三种方法本质上都是逐个尝试密码的方式,只不过待选密码的集合不同。

  1. 爆破:逐个尝试选定集合中可以组成的所有密码,直到找到正确密码。

  2. 字典:字典攻击的效率比爆破稍高,因为字典中存储了常用的密码,避免了爆破时浪费时间。

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

对于这一类的zip问题,推荐使用Windows下的AZPR工具。

举个例子,对于爆破,我们以ISCC 2017 Basic-08为例。选定暴力攻击、字符集和长度后进行爆破。点击开始,进行爆破。在很短的时间内找到了密码为BIT。

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

对于字典攻击,我们以之前的ISCC 2017 Basic-07为例。从图片中分离出一个加密的zip压缩包后,进行字典攻击。字典攻击的结果如下图所示,在选择合适的字典的情况下,用很短的时间就能找到密码。继续以此题为例,解压后的压缩包中有一个txt文档和一个握手包。根据txt内容,我们可以得知握手包的密码为ISCC***的形式(代表大写字母或数字)。我们可以编写程序构造字典,然后使用aircrack-ng来破解握手包的密码。

对于掩码攻击,我们以ISCC 2017 Misc-06为例。题目给出了一个jpg图片,我们用之前介绍的方法分离出加密的压缩包。根据题目提示,我们构造????LiHua的掩码进行攻击。攻击结果如下图所示,只耗费了很少的时间就找到了密码。

0x05. 明文攻击

明文攻击是一种高效的攻击手段。大致原理是,当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12字节)时,可以利用已知文件来找到加密密钥,然后用密钥来解锁其他加密文件。更详细的原理请读者自行搜索。

举个例子,我们已知明文攻击.zip中存在的文件明文.txt。我们将明文.txt压缩,需要判断压缩后的CRC32是否与加密文件中的一致。如果不一致,可以尝试使用其他压缩工具。

0x06. CRC32碰撞

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

我们以之前提到的HBCTF伪加密题目为例。打开压缩包,可以看到压缩文件flag6位数的CRC32值为0x9c4d9a5d。我们可以编写一个脚本来进行碰撞攻击。

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

CRC碰撞的脚本运行结果如下,即为压缩文件的内容。

再举一个bugku中的例子,下载下来的文件是68个压缩包,并且根据binwalk的检查结果,每个压缩包里都有一个大小为4个字节,名为out.txt的压缩文件。我们可以编写以下脚本来碰撞出所有压缩包中的数据。

此题较为繁琐,后续步骤不再展开。另外,限于CPU的能力,CRC碰撞只能用于压缩文件较小的情况。

0x07. 修改格式

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

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

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

总结

Zip不仅是我们生活中常用的一种文件格式,也经常在CTF比赛中遇到。本文对CTF中zip的相关知识进行了总结,希望对读者有所帮助。

赞(0)