编辑“︁
ZIP格式
”︁(章节)
跳转到导航
跳转到搜索
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
== 主要攻击 == === 爆破 === 这里主要介绍两款爆破使用的工具 <ul> <li><p><code>Windows</code>下的神器 [http://www.downcc.com/soft/130539.html ARCHPR]</p> <p>[[File:./figure/1.png]]</p> <p>暴力枚举,跑字典,明文攻击,应有尽有。</p></li> <li><p><code>Linux</code> 下的命令行工具 [https://github.com/hyc/fcrackzip fcrackzip]</p> <syntaxhighlight lang="shell"># -b 指定模式为暴破,-c1指定密码类型为纯数字,其它类型可以rtfm,-u这个参数非常重要不然不显示破解出来的密码,-l 5-6可以指定长度 root@kali:fcrackzip -b -c1 -u test.zip</syntaxhighlight></li></ul> <span id="crc32"></span> === CRC32 === ==== 原理 ==== <code>CRC</code> 本身是「冗余校验码」的意思,<code>CRC32</code> 则表示会产生一个 <code>32 bit</code> ( <code>8</code> 位十六进制数)的校验值。由于 <code>CRC32</code> 产生校验值时源数据块的每一个 <code>bit</code> (位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的 <code>CRC32</code> 值。 <code>CRC32</code> 校验码出现在很多文件中比如 <code>png</code> 文件,同样 <code>zip</code> 中也有 <code>CRC32</code> 校验码。值得注意的是 <code>zip</code> 中的 <code>CRC32</code> 是未加密文件的校验值。 这也就导致了基于 <code>CRC32</code> 的攻击手法。 * 文件内内容很少(一般比赛中大多为 <code>4</code> 字节左右) * 加密的密码很长 我们不去爆破压缩包的密码,而是直接去爆破源文件的内容(一般都是可见的字符串),从而获取想要的信息。 比如我们新建一个 <code>flag.txt</code>,其中内容为 <code>123</code>,使用密码 <code>!QAZXSW@#EDCVFR$</code> 去加密。 [[File:./figure/2.png]] 而我们去计算文件的 <code>CRC32</code> 值发现和上图中的 <code>CRC32</code> 值吻合。 <syntaxhighlight lang="shell">文件: flag.txt 大小: 3 时间: Tue, 29 Aug 2017 10:38:10 +0800 MD5: 202cb962ac59075b964b07152d234b70 SHA1: 40bd001563085fc35165329ea1ff5c5ecbdbbeef CRC32: 884863D2</syntaxhighlight> !!! note 在爆破时我们所枚举的所有可能字符串的 <code>CRC32</code> 值是要与压缩源文件数据区中的 <code>CRC32</code> 值所对应 <syntaxhighlight lang="python"># -*- coding: utf-8 -*- import binascii import base64 import string import itertools import struct alph = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=' crcdict = {} print "computing all possible CRCs..." for x in itertools.product(list(alph), repeat=4): st = ''.join(x) testcrc = binascii.crc32(st) crcdict[struct.pack('<i', testcrc)] = st print "Done!" f = open('flag.zip') data = f.read() f.close() crc = ''.join(data[14:18]) if crc in crcdict: print crcdict[crc] else: print "FAILED!"</syntaxhighlight> ==== 例题 ==== <blockquote>题目:<code>Abctf-2016:Zippy</code> </blockquote> 根据每个压缩包内的文件大小可以推断使用 <code>CRC32</code> 攻击手法,获得每个压缩包内的内容后连在一起 <code>Base64</code> 解码后是一个加密的压缩包,爆破获得 <code>flag</code>。 === 明文攻击 === <span id="原理-1"></span> ==== 原理 ==== * 一个加密的压缩文件 * 压缩文件的压缩工具,比如 <code>2345</code> 好压, <code>WinRAR</code> , <code>7z</code> 。 <code>zip</code> 版本号等,可以通过文件属性了解。如果是 <code>Linux</code> 平台,用 <code>zipinfo -v</code> 可以查看一个 <code>zip</code> 包的详细信息,包括加密算法等 * 知道压缩包里某个文件的部分连续内容(至少 <code>12</code> 字节) 如果你已经知道加密文件的部分内容,比如在某个网站上发现了它的 <code>readme.txt</code> 文件,你就可以开始尝试破解了。 首先,将这个明文文件打包成 <code>zip</code> 包,比如将 <code>readme.txt</code> 打包成 <code>readme.zip</code> 。 打包完成后,需要确认二者采用的压缩算法相同。一个简单的判断方法是用 <code>WinRAR</code> 打开文件,同一个文件压缩后的体积是否相同。如果相同,基本可以说明你用的压缩算法是正确的。如果不同,就尝试另一种压缩算法。 ==== 工具 ==== * Windows下的神器 [http://www.downcc.com/soft/130539.html ARCHPR] * Linux下的 [http://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html PKCrack] !!! note 建议使用 <code>Windows</code> 的 <code>ARCHPR</code>,一是速度较快,二是较稳定(之前出题时遇到过用 <code>PKCrack</code> 爆不出来的情况)。 <span id="例题-1"></span> ==== 例题 ==== <blockquote>2015广州强网杯:爆破? WP:https://www.cnblogs.com/ECJTUACM-873284962/p/9884416.html </blockquote> 首先我们拿到这样一道题,题目标题为'''爆破?''',很明显这题肯定是要用到一个破解工具,很暴力的说。 '''第一步、分析压缩包文件''' 我们下载了这个压缩包以后,我们看到文件名是 *'''.zip''' 结尾,我们可以立即想到破解压缩包常用的几种方式,我们将其压缩包解压出来,发现里面有两个文件,分别为 <code>Desktop.zip</code> 和 <code>readme.txt</code> ,我们看看 <code>readme.txt</code> 里面写了什么? [[File:./figure/readme.png|readme]] 打开以后竟然是<code>qianwanbuyaogeixuanshoukandao!!!</code> ,出题人不想让选手看到,这出题人还是有点意思。我们再看看那个 <code>Desktop.zip</code> ,我们可以看到里面有个 <code>readme.txt</code> 文件和 <code>answer</code> 文件夹, <code>answer</code> 文件夹下有 <code>key.txt</code> 文件, <code>flag</code> 应该就藏在这里了。 '''第二步、分析破解方式''' 这题目拿到手上,我们首先发现解压出来的文件和 <code>Desktop.zip</code> 压缩包中都含有同样一个文件 <code>readme.txt</code> ,而且并没有给出其他相关信息,且文件大小大于 <code>12Byte</code> ,我们再对比压缩包中的 <code>readme.txt</code> 和原压缩包中的 <code>readme.txt</code> 的 <code>CRC32</code> 的值,我们发现两个值相同,这说明解压出的 <code>readme.txt</code> 是加密压缩包里的 <code>readme.txt</code> 的明文,于是我们可以大胆地猜测这极可能是个明文加密。 [[File:./figure/compare.png|compare]] '''第三步、尝试明文攻击''' 既然我们已经知道了它是明文攻击的话,我们将对其压缩包进行破解,由于解压出的readme.txt是加密压缩包里的 <code>readme.txt</code> 的明文,将 <code>readme.txt</code> 压缩成 '''.zip''' 文件,然后在软件中填入相应的路径即可开始进行明文攻击,这里我们将介绍 <code>Windows</code> 和 <code>Ubuntu</code> 下使用不同的方式进行明文攻击。 方法一、 <code>pkcrack</code> 进行明文攻击 <code>pkcrack</code> 下载链接:https://www.unix-ag.uni-kl.de/~conrad/krypto/pkcrack.html 我们可以直接写个 <code>shell</code> 脚本下载就好了: <syntaxhighlight lang="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 ../../</syntaxhighlight> 把文件保存,改为 <code>pkcrack-install.sh</code> ,然后跑到当前目录下,给它加一个执行权限 <code>x</code> 。 <syntaxhighlight lang="shell">chmod 777 install.sh</syntaxhighlight> 或者直接可以: <syntaxhighlight lang="shell">chmod u+x install.sh</syntaxhighlight> 然后运行 <code>./pkcrack-install.sh</code> [[File:./figure/install-pkcrack.png|install-pkcrack]] 然后当前目录下会生成一个 <code>bin</code> 的文件夹,我们直接进入 <code>bin</code> 文件夹下,看到有 <code>pkcrack</code> 文件,直接对文件进行明文破解。 <syntaxhighlight lang="shell">./pkcrack -c "readme.txt" -p readme.txt -C ~/下载/misc/Desktop.zip -P ~/下载/misc/readme.zip -d ~/decrypt.zip</syntaxhighlight> 我们所用到的参数选项如下: <syntaxhighlight lang="shell">-C:要破解的目标文件(含路径) -c:破解文件中的明文文件的名字(其路径不包括系统路径,从zip文件一层开始) -P:压缩后的明文文件 -p:压缩的明文文件中明文文件的名字(也就是readme.txt在readme.zip中的位置) -d:指定文件名及所在的绝对路径,将解密后的zip文件输出</syntaxhighlight> 至于其他选项参看 <code>./pkcrack --help</code> 解密后的结果如下: [[File:./figure/pkcrack-to-flag-01.png|pkcrack-to-flag]] [[File:./figure/pkcrack-to-flag-02.png|pkcrack-to-flag]] [[File:./figure/pkcrack-to-flag-03.png|pkcrack-to-flag]] [[File:./figure/pkcrack-to-flag-04.png|pkcrack-to-flag]] 我们可以看到,我们下午 <code>1:10</code> 开始跑的,下午 <code>3:27</code> 才求解出秘钥。 我们得出了最终的flag为:'''<code>flag{7ip_Fi13_S0m3tim3s_s0_3a5y@}</code>''' '''坑点来了''' 看起来一切都很顺利的样子,同样花了两个多小时,为啥我在博客园上写了我跑了两个小时都没跑出来呢?或者说有朋友遇到了和我一样的问题,我明明和你是一样的,为啥我跑不出结果? 你们可能忽略了一些细节问题,有人曾想过原压缩包是通过什么方式压缩的嘛?还有就是我们生成的 <code>readme.zip</code> 又该以哪种方式去生成呢?我就是因为这个问题卡了整整三个月没做出来,不信的话我们可以看看第二种方法,在 <code>Windows</code> 下用 <code>ARCHPR</code> 进行明文攻击。 方法二、 <code>ARCHPR</code> 进行明文攻击 首先这题我建议大家下 <code>ARCHPR 4.53</code> 版本,我是在这个版本下测试成功的。成功截图如下: [[File:./figure/success.jpg|success]] 我相信很多朋友在用 <code>ARCHPR</code> 的时候遇到以下这种情况: [[File:figure/error.png|error]] 我当时内心是崩溃的,为啥会出现这种情况。 在后来的学习中发现,用 <code>7z</code> 压缩的文件得用 <code>7z</code> 来解压缩, <code>7z</code> 是一种使用多种压缩算法进行数据压缩的档案格式,和传统的 <code>zip</code> , <code>rar</code> 相比,它的压缩比率更大,采用的压缩算法不同,自然而然就可能出现不匹配这种情况,所以我们在解压缩原压缩包和对文件进行加密的时候得先分析出题人是用什么方式进行加解密的,所以这题的问题显而易见就出来了,经过验证,我发现出题人是用 <code>7z</code> 进行压缩的。 '''再尝试''' 我们已经发现了这个问题,我们去官网下载 <code>7zip</code> :https://www.7-zip.org/ 然后我们对原压缩文件用 <code>7z</code> 进行解压缩,然后将 <code>readme.txt</code> 用7z进行压缩即可。然后我们就可以用 <code>ARCHPR</code> 进行明文攻击了。 结果如下: [[File:./figure/attack-success.png|attack-success]] 我们将 <code>Desktop_decrypted.zip</code> 解压出来,查看 <code>answer</code> 目录下的 <code>key.txt</code> 即可。 所以最终的flag为:'''<code>flag{7ip_Fi13_S0m3tim3s_s0_3a5y@}</code>''' === 伪加密 === <span id="原理-2"></span> ==== 原理 ==== 在上文 <code>ZIP</code> 格式中的 '''核心目录区''' 中,我们强调了一个叫做通用位标记 <code>(General purpose bit flag)</code> 的 <code>2</code> 字节,不同比特位有着不同的含义。 <syntaxhighlight lang="shell">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. ...</syntaxhighlight> 在 <code>010Editor</code> 中我们尝试着将这 <code>1</code> 位修改 <code>0 --> 1</code>。 [[File:./figure/4.png]] 再打开文件发现已要求输入密码。 [[File:./figure/5.png]] 修改伪加密的方法: * <code>16</code> 进制下修改通用位标记 * <code>binwalk -e</code> 无视伪加密 * 在 <code>Mac OS</code> 及部分 <code>Linux</code>(如 <code>Kali</code> )系统中,可以直接打开伪加密的 <code>ZIP</code> 压缩包 * 检测伪加密的小工具 <code>ZipCenOp.jar</code> * 有时候用 <code>WinRar</code> 的修复功能(此方法有时有奇效,不仅针对伪加密) <span id="例题-2"></span> ==== 例题 ==== <blockquote><code>SSCTF-2017</code> :我们的秘密是绿色的 <code>WP</code>:http://bobao.360.cn/ctf/detail/197.html </blockquote> 我们在得到两个 <code>readme.txt</code>,且一个加密,一个已知,很容易想到明文攻击的手法。 注意在用明文攻击时的操作。 [[File:./figure/3.png]] 得到密码 <code>Y29mZmVl</code> 后,解压缩文件,得到另一个压缩包。 观察通用位标记位,猜测伪加密,修改后解压得到 flag。 这一题,基本涵盖了比赛中 ZIP 的常见考察手法,爆破,伪加密,明文攻击等,都在本题中出现。 === 参考文献 === * https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt * https://www.cnblogs.com/ECJTUACM-873284962/p/9387711.html * https://www.cnblogs.com/ECJTUACM-873284962/p/9884416.html * http://bobao.360.cn/ctf/detail/197.html
摘要:
请注意,所有对gamedev的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Gamedev:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
不转换
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息