讲一下CTF里面压缩包题目

前面我记得有人把作业发到论坛里面,是一个掩码爆破的题目,今天有人又利用crc32碰撞还原原文,正好以前做过一些这种培训,翻了一下以前的课件,直接copy出来给大家学习一下。有啥问题可以在贴内提问,有时候这些ctf的tick在实际生活中也是能用到的。

压缩包分析

ZIP格式压缩包分析

文件结构

ZIP 文件主要由三部分构成,分别为

压缩源文件数据区 核心目录 目录结束
local file header + file data + data descriptor central directory end of central directory record
  • 压缩源文件数据区中每一个压缩的源文件或目录都是一条记录,其中
    • local file header :文件头用于标识该文件的开始,记录了该压缩文件的信息,这里的文件头标识由固定值 50 4B 03 04 开头,也是 ZIP 的文件头的重要标志
    • file data :文件数据记录了相应压缩文件的数据
    • data descriptor :数据描述符用于标识该文件压缩结束,该结构只有在相应的 local file header 中通用标记字段的第 3 bit 设为 1 时才会出现,紧接在压缩文件源数据后
  • Central directory 核心目录
  • 记录了压缩文件的目录信息,在这个数据区中每一条纪录对应在压缩源文件数据区中的一条数据。

主要攻击

爆破

这里主要介绍两款爆破使用的工具

image

暴力枚举,跑字典,明文攻击,应有尽有。

  • Linux 下的命令行工具 fcrackzip

    # -b 指定模式为暴破,-c1指定密码类型为纯数字,其它类型可以rtfm,-u这个参数非常重要不然不显示破解出来的密码,-l 5-6可以指定长度
    root@kali:fcrackzip -b -c1 -u test.zip
    

CRC32

原理

CRC 本身是「冗余校验码」的意思,CRC32 则表示会产生一个 32 bit ( 8 位十六进制数) 的校验值。由于 CRC32 产生校验值时源数据块的每一个 bit (位) 都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的 CRC32 值。

CRC32 校验码出现在很多文件中比如 png 文件,同样 zip 中也有 CRC32 校验码。值得注意的是 zip 中的 CRC32 是未加密文件的校验值。

这也就导致了基于 CRC32 的攻击手法。

  • 文件内内容很少 (一般比赛中大多为 4 字节左右)
  • 加密的密码很长

我们不去爆破压缩包的密码,而是直接去爆破源文件的内容 (一般都是可见的字符串),从而获取想要的信息。

比如我们新建一个 flag.txt,其中内容为 123,使用密码 !QAZXSW@#EDCVFR$ 去加密。

而我们去计算文件的 CRC32 值发现和上图中的 CRC32 值吻合。

文件: flag.txt
大小: 3
时间: Tue, 29 Aug 2017 10:38:10 +0800
MD5: 202cb962ac59075b964b07152d234b70
SHA1: 40bd001563085fc35165329ea1ff5c5ecbdbbeef
CRC32: 884863D2

在爆破时我们所枚举的所有可能字符串的 CRC32 值是要与压缩源文件数据区中的 CRC32 值所对应

明文攻击

原理
  • 一个加密的压缩文件
  • 压缩文件的压缩工具,比如 2345 好压, WinRAR7zzip 版本号等,可以通过文件属性了解。如果是 Linux 平台,用 zipinfo -v 可以查看一个 zip 包的详细信息,包括加密算法等
  • 知道压缩包里某个文件的部分连续内容 (至少 12 字节)

如果你已经知道加密文件的部分内容,比如在某个网站上发现了它的 readme.txt 文件,你就可以开始尝试破解了。

首先,将这个明文文件打包成 zip 包,比如将 readme.txt 打包成 readme.zip

打包完成后,需要确认二者采用的压缩算法相同。一个简单的判断方法是用 WinRAR 打开文件,同一个文件压缩后的体积是否相同。如果相同,基本可以说明你用的压缩算法是正确的。如果不同,就尝试另一种压缩算法。

工具

伪加密

原理

在上文 ZIP 格式中的 核心目录区 中,我们强调了一个叫做通用位标记 (General purpose bit flag)2 字节,不同比特位有着不同的含义。

Bit 0: If set, indicates that the file is encrypted.

(For Method 6 - Imploding)
Bit 1: If the compression method used was type 6,
   Imploding, then this bit, if set, indicates
   an 8K sliding dictionary was used.  If clear,
   then a 4K sliding dictionary was used.
...
Bit 6: Strong encryption.  If this bit is set, you should
   set the version needed to extract value to at least
   50 and you must also set bit 0.  If AES encryption
   is used, the version needed to extract value must
   be at least 51.
...

010Editor 中我们尝试着将这 1 位修改 0 --> 1

再打开文件发现已要求输入密码。

修改伪加密的方法:

  • 16 进制下修改通用位标记
  • binwalk -e 无视伪加密
  • Mac OS 及部分 Linux(如 Kali ) 系统中,可以直接打开伪加密的 ZIP 压缩包
  • 检测伪加密的小工具 ZipCenOp.jar
  • 有时候用 WinRar 的修复功能(此方法有时有奇效,不仅针对伪加密)

RAR格式压缩包分析

文件结构

RAR 文件主要由标记块,压缩文件头块,文件头块,结尾块组成。

其每一块大致分为以下几个字段:

名称 大小 描述
HEAD_CRC 2 全部块或块部分的 CRC
HEAD_TYPE 1 块类型
HEAD_FLAGS 2 阻止标志
HEAD_SIZE 2 块大小
ADD_SIZE 4 可选字段 - 添加块大小

Rar 压缩包的文件头为 0x 52 61 72 21 1A 07 00

紧跟着文件头(0x526172211A0700)的是标记块(MARK_HEAD),其后还有文件头(File Header)。

主要攻击

爆破

伪加密

RAR 文件的伪加密在文件头中的位标记字段上,用 010 Editor 可以很清楚的看见这一位,修改这一位可以造成伪加密。

其余明文攻击等手法依旧同 ZIP 中介绍的一样。

34 个赞

佬够速度 直接过来膜拜

1 个赞

学习一下

1 个赞

学习一下

1 个赞

插眼

1 个赞

群除我佬

1 个赞

学习一下

1 个赞

两年没接触这个了

1 个赞

学习一下

1 个赞

学生时期去打打这种比赛挺好的

1 个赞

话说 crc校验和 穷举还原的方法 适用场景甚少对吧

1 个赞

学习两下

1 个赞

好好看内容

1 个赞

学习下~
没弄过ctf,单纯简单的安卓逆向~

1 个赞

学习学习

1 个赞

坛除我佬

1 个赞

学习

1 个赞

#ctf添加

插个眼慢慢看

1 个赞

纯纯干知识,mark一手

1 个赞