破解Zip加密文件经常使用的几种方法

前言

在互联网的浪潮中,你们也许碰到过这种状况:html

从网络上下载了一个zip文件,最后却发现它是用密码保护的,或者本身用密码加密了一个很重要zip文件,可是一段时间后忘记了密码,没法打开。这个时候,咱们就可能就须要对这个加密文件进行破解了。java

而随着计算机性能的提升,不少人可能以为找到一个zip文件的密码是一件很简单的事情。git

我将从一个Web安全狗&CTF选手的角度去解析如何去找到/破解一个Zip文件~github

01.Zip属性隐藏

咱们先从最简单的开始讲起,可能不少人没有去注意文件属性一栏,每每有时候,加密者会把密码放在属性里面,例以下图:算法

咱们能够看到,这个Zip压缩文件的密码就是www.cnblogs.com了~shell

02.Zip伪加密

Zip伪加密是在文件头的加密标志位作修改,进而再打开文件时识被别为加密压缩包~安全

一个 Zip文件由三个部分组成:bash

压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志 网络

下面咱们来看下这个例子:编辑器

压缩源文件数据区: 

50 4B 03 04:这是头文件标记(0x04034b50) 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
00 00:扩展记录长度 
6B65792E7478740BCECC750E71ABCE48CDC9C95728CECC2DC849AD284DAD0500 
压缩源文件目录区: 
50 4B 01 02:目录中文件文件头标记(0x02014b50) 
3F 00:压缩使用的 pkware 版本 
14 00:解压文件所需 pkware 版本 
00 00:全局方式位标记(有无加密,这个更改这里进行伪加密,改成09 00打开就会提示有密码了) 
08 00:压缩方式 
5A 7E:最后修改文件时间 
F7 46:最后修改文件日期 
16 B5 80 14:CRC-32校验(1480B516) 
19 00 00 00:压缩后尺寸(25) 
17 00 00 00:未压缩尺寸(23) 
07 00:文件名长度 
24 00:扩展字段长度 
00 00:文件注释长度 
00 00:磁盘开始号 
00 00:内部文件属性 
20 00 00 00:外部文件属性 
00 00 00 00:局部头部偏移量 
6B65792E7478740A00200000000000010018006558F04A1CC5D001BDEBDD3B1CC5D001BDEBDD3B1CC5D001 

压缩源文件目录结束标志: 

50 4B 05 06:目录结束标记 
00 00:当前磁盘编号 
00 00:目录区开始磁盘编号 
01 00:本磁盘上纪录总数 
01 00:目录区中纪录总数 
59 00 00 00:目录区尺寸大小 
3E 00 00 00:目录区对第一张磁盘的偏移量 
00 00:ZIP 文件注释长度

咱们能够进行大胆的猜测:

若是把一个zip文件的文件头或者加密标志位进行适当修改,那就可能会改变文件的可读性~

咱们能够用16进制编辑器添加文件头或文件尾,便可修复zip。

上面这种方法相对比较麻烦,不太容易操做,在Mac OS及部分Linux(如Kali)系统中,能够直接打开伪加密的zip压缩包,此时咱们但愿有种简便而通用的方法该怎么办呢?

咱们推荐使用下面这种方法:

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

ZipCenOp.jar的下载我已经传到了本地,点击下载便可~

下面举个例子,以下是个被加密的文件,理由很简单,文件夹后面跟了一个*~

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

java -jar ZipCenOp.jar r xxx.zip

咱们对其使用如上命令进行解包,得下图所示:

咱们再看下这个文件:

发现文件夹后面跟的*消失了,说明这个文件就是伪加密文件~

固然啦,咱们也能够对Zip文件进行伪加密~

java -jar ZipCenOp.jar e xxx.zip

03.暴力破解

顾名思义,就是逐个尝试选定集合中能够组成的全部密码,知道遇到正确密码~

而字典攻击的效率比爆破稍高,由于字典中存储了经常使用的密码,所以就避免了爆破时把时间浪费在脸滚键盘类的密码上~

而若是已知密码的某几位,如已知6位密码的第3位是a,那么能够构造 ??a??? 进行掩码攻击,掩码攻击的原理至关于构造了第3位为a的字典,所以掩码攻击的效率也比爆破高出很多~

对这一类的zip问题,Windows下我使用的是ARCHPR~

点击开始,进行爆破便可~下面是个演示,就花了4s的时间爆破出密码是MIT~

 

而所谓的字典攻击其实就是在字典选择合适的状况下,用很短的时间就能找到密码~若是须要字典的朋友能够私聊滴滴我,我能够发给你~

实例以下所示:

若是对Wifi密码破解感兴趣的同窗能够关注个人B站ID:Angel_Kitty,我录制过关于Wifi破解的视频,视频ID是:https://www.bilibili.com/video/av25852173/

而掩码攻击就是经过已知密码的某几位进行构造,以下示例咱们构造了??T进行爆破,仅花了81ms就破解了~

04.明文攻击

明文攻击是一种较为高效的攻击手段,大体原理是当你不知道一个zip的密码,可是你有zip中的一个已知文件(文件大小要大于12Byte)或者已经经过其余手段知道zip加密文件中的某些内容时,由于同一个zip压缩包里的全部文件都是使用同一个加密密钥来加密的,因此能够用已知文件来找加密密钥,利用密钥来解锁其余加密文件~

此时咱们能够尝试用ARCHPR或者pkcrack进行明文攻击~

更新明文攻击这部分文档:http://www.javashuo.com/article/p-mheewqkz-bz.html

举个例子,下载连接在这里

咱们能够看到readme.txt是加密压缩包里的readme.txt的明文,因此能够进行明文攻击~

将readme.txt压缩成.zip文件,而后在软件中填入相应的路径便可开始进行明文攻击,这里咱们用ARCHPR进行演示~

可能有些朋友会说ARCHPR怎么行不通啊,通常是版本不对的问题~

若是仍是有问题怎么办呢?那就尝试用下pkcrack

下载连接在这里:https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html

彷佛网站平常会崩,因此我把文件上传到了本地~

Windows版本:https://files.cnblogs.com/files/ECJTUACM-873284962/pkcrack-1.2.2-win32.zip

Linux版本:https://files.cnblogs.com/files/ECJTUACM-873284962/pkcrack-1.2.2.tar.gz

有些朋友在Windows下会出现以下错误:

那是由于pkcrack只支持32位的,因此运行这个须要在XP系统下进行

而选择Linux的话则不须要这么麻烦,直接安装就行了,还有一种更快的办法~

我已经把项目上传到Github上,文件在这里:https://github.com/AngelKitty/CTF-Tools/tree/master/pkcrack

咱们写个shell脚本就行了~

#!/bin/bash -ex

wget https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack/pkcrack-1.2.2.tar.gz
tar xzf pkcrack-1.2.2.tar.gz
cd pkcrack-1.2.2/src
make

mkdir -p ../../bin
cp extract findkey makekey pkcrack zipdecrypt ../../bin
cd ../../

把文件保存,改成install.sh,而后跑到当前目录下,给它加一个执行权限x

chmod 777 install.sh

或者直接能够:

chmod u+x install.sh

而后运行install.sh

./install.sh

而后当前目录下会生成一个bin的文件夹,咱们直接进入bin文件夹下,看到有pkcrack文件,直接对文件进行明文破解

./pkcrack -c "answer/key.txt" -p readme.txt -C Desktop.zip -P readme.zip

-C:要破解的目标文件(含路径)

-c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始)

-P:压缩后的明文文件

-p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置)

至于其余选项参看./pkcrack --help

pkcrack还有一个重要的选项是-d,后面跟一个文件名,好比decrypt.zip,表示解密后的zip文件输出。听说这个命令能够加快解密时间,我尝试过之后发现并无快多少,因此我花了两个小时还没跑出来密码QAQ

05.CRC32碰撞

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

在产生CRC32时,源数据块的每一位都参与了运算,所以即便数据块中只有一位发生改变也会获得不一样的CRC32值,利用这个原理咱们能够直接爆破出加密文件的内容~

具体算法实现参考百度百科:https://baike.baidu.com/item/CRC32/7460858?fr=aladdin

咱们看个CRC32碰撞的例子:

flag是4位数,且CRC32值为56EA988D

咱们能够写出以下脚本:

#coding=utf=8
import binascii
real = 0x56EA988D
for y in range(1000,9999):
    if real == (binascii.crc32(str(y)) & 0xffffffff):
        print(y)
print('End')

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

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

拓展与补充

相关文章
相关标签/搜索