• MISC:压缩包取证(zip爆破、明文攻击、伪加密、CRC32碰撞)


    zip压缩包开头为50 4B 03 04,即常说的PK头。
    在这里插入图片描述

    zip文件由三部分组成:压缩的文件内容源数据、压缩的目录元数据、目录结束标识结构
    在这里插入图片描述

    1、爆破(暴力,字典,掩码

    爆破:逐个尝试选定集合中的可以组成的所有密码,直到遇到正确的密码。
    分为暴力破解、掩码破解、字典破解这几种
    1、暴力破解:选择密码范围,长度等,由软件组合生成密码进行破解
    2、掩码破解:知道密码中的一部分,只需要按照规则构造其余部分进行破解
    3、字典破解:通常是多数用户常用的一些密码集合,导入字典文件用字典中的密码进行破解(取决你的字典)

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

    • Windows下的神器 ARCHPR
      暴力枚举,跑字典,明文攻击,应有尽有
      在这里插入图片描述

    • Linux 下的命令行工具 fcrackzip

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

    2、明文攻击

    明文攻击:

    • 找到压缩包内其中一个已知的文件文件大小要大于12Byte),用相同的压缩软件压缩算法去压缩无密码压缩包,得到明文。
    • 通过比较两个压缩包相同位置不同的12个字节,就可以还原出3个key,绕过密码提取出所有的文件。
    • 注意明文攻击需要CRC32值相同才行。

    一个例子:

    • 现有加密压缩包
      在这里插入图片描述

    • 以及一个包含测试1的伪加密的压缩包(CRC32相同,>12字节)
      在这里插入图片描述

    • 进行明文攻击
      在这里插入图片描述
      在这里插入图片描述

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

    3、伪加密

    伪加密zip

    • 紫色部分从PK开始数第9位,灰色部分第6,7列,都改为0900则是伪加密。
      若是没有加密的zip文件,两处标记都是00 00。
      在这里插入图片描述
    • 破解伪加密的zip,只要把压缩文件目录区(紫色部分) 的全局方式标记改为00 00即可解密
    • 除windows外的系统(如kali)可直接打开伪加密压缩包

    4、CRC32碰撞

    什么是CRC32

    • CRC 本身是「冗余校验码」的意思,CRC32 则表示会产生一个 32 bit ( 8 位十六进制数) 的校验值。由于 CRC32 产生校验值时源数据块的每一个 bit (位) 都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的 CRC32 值。
    • CRC32 校验码出现在很多文件中比如 png 文件,同样 zip 中也有 CRC32 校验码。值得注意的是 zip 中的 CRC32 是未加密文件的校验值

    CRC32攻击

    • 这也就导致了基于 CRC32 的攻击手法。
      文件内内容很少 (一般比赛中大多为 4 字节左右)
      加密的密码很长
    • 我们不去爆破压缩包的密码,而是直接去爆破源文件的内容 (一般都是可见的字符串),从而获取想要的信息。

    一个例子:

    • 我们新建一个 flag.txt,其中内容为 123,使用密码 !QAZXSW@#EDCVFR$ 去加密
      在这里插入图片描述

    • 我们去计算文件的 CRC32 值发现和上图中的 CRC32 值吻合
      在这里插入图片描述

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

      # -*- coding: utf-8 -*-
      import zlib
      import base64
      import string
      import itertools
      import struct
      
      # 爆破所有可能的crc,存起来
      alph = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/='
      crcdict = {}
      print("computing all possible CRCs...")
      for x in itertools.product(list(alph), repeat=3):
          st = ''.join(x)
          testcrc = zlib.crc32(st.encode('utf8'))
          crcdict[testcrc] = st
      print("Done!")
      print(crcdict)
      
      # 判断crc是否在集合中
      f = open('flag.zip','rb')
      data = f.read()
      f.close()
      crc = "".join('%s' %id for id in data[14:18])
      if crc in crcdict:
          print(crcdict[crc])
      else:
          print("FAILED!")
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
    • 推荐一个好用的6位的CRC32爆破工具
      下载:https://github.com/theonlypwner/crc32
      使用:python crc32.py reverse 你的crc32密文(密文需要加上0x变成16进制)

    • 以2022ZJ省赛misc3为例,可以crc32小附件得到密码(或者再大一点,可以明文攻击解包)
      在这里插入图片描述
      在这里插入图片描述

  • 相关阅读:
    ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-2-02:开发环境搭建
    MATLAB算法实战应用案例精讲-【数据分析】数据仓库-数据治理
    【Pytorch安装】windows下,安装了torch但是import torch失败
    虚拟机安装-ubuntu
    【浅记】分而治之
    数商云采购协同系统邀请招标实施步骤 | 助力建筑工程企业采购工作降本增效
    Java集合(Collection List Set Map)
    缓冲区的奥秘:解析数据交错的魔法
    小程序授权获取昵称
    Java正则表达式 提取文本中所有的匹配数据
  • 原文地址:https://blog.csdn.net/qq_33957603/article/details/126929545