Zip已知明文攻击类题目

之前打某DASCTF的时候,做了一道zip已知明文攻击的misc。赛后咱自己简单研究了一下这种类型的题,本来想整理一下的,结果拖了一段时间。

利用条件

zip已知明文攻击针对的是ZipCrypto加密算法的缺陷。只要知道其中至少12个字节的明文(其中至少8个字节连续)和明文在加密后的数据流中对应的位置(相对于文件起始的偏移量),就可以用已知明文攻击破解密钥。知道的明文量越多,破解速度越快。而且由于zip不加密压缩文件内的目录和文件名,我们可以根据压缩包内文件类型对应的文件头和文件结构获得更多明文信息,从而更容易达成实施破解的条件。

另外需要注意该方法可以用于ZipCrypto Store类型的压缩包加密。ZipCrypto Deflate类型加密的明文是经过Deflate的,所以很难直接利用。AES类型的加密则完全不适用。

破解工具:

  • ARCHPR 常见的压缩包破解工具。其中的”明文”选项对应的就是这种攻击方式。
  • bkcrack 专门实现这种攻击方式的破解工具,比ARCHPR好用得多,破解也更快。

另外详细的利用方法和技巧可以参考https://www.freebuf.com/articles/network/255145.html。咱没必要自己再总结了感觉。

一些CTF题

西湖论剑2022-take_the_zip_easy

从NSSCTF题库随便找了一道题。题目标签上有明文攻击,就拿来试一试。

先用bkcrack看一看压缩包结构:

bkcrack -L ./zipeasy.zip
Archive: ./zipeasy.zip
Index Encryption Compression CRC32 Uncompressed Packed size Name
----- ---------- ----------- -------- ------------ ------------ ----------------
0 ZipCrypto Deflate b260855d 693704 499938 dasflow.pcapng
1 ZipCrypto Store 26d557c0 502415 502427 dasflow.zip

可以看到zipeasy.zip压缩包里有两个文件,dasflow.pcapng和dasflow.zip,其中dasflow.zip的加密方法为ZipCrypto Store

另外可以观察到,两个文件的大小差不多,因此猜想dasflow.zip就是dasflow.pcapng的用deflate压缩后的文件。从而可以猜测dasflow.zip文件结构的文件名位置的明文就是”dasflow.pcapng”14个字节,相对于dasflow.zip的起始位置的偏移量为30。加上zip文件头的50 4B 03 04,一共就有了18个字节,连续的有14个字节,已经满足了bkcrack的攻击条件。

echo -n "dasflow.pcapng" > ./plain.txt
bkcrack -C ./zipeasy.zip -c dasflow.zip -p ./plain.txt -o 30 -x 0 504B0304

破解只需要几分钟。

[22:09:35] Z reduction using 6 bytes of known plaintext
100.0 % (6 / 6)
[22:09:35] Attack on 1038290 Z values at index 37
Keys: 2b7d78f3 0ebcabad a069728c
67.7 % (703430 / 1038290)
[22:15:40] Keys
2b7d78f3 0ebcabad a069728c

得到ZipCrypto的XYZ密钥,就能解密zip了。实际上有了XYZ密钥就可以直接把zip文件密码改掉了。

bkcrack -C ./zipeasy.zip -k 2b7d78f3 0ebcabad a069728c -U zipeasy_123.zip 123

然后用123打开压缩包,就得到了明文的dasflow.pcapng。

接下来就是流量分析了。和zip明文攻击没啥关系了倒是,但也是misc手该干的活,咱随便分析一下。

直接用foremost扫一下就能扫出来个加密zip。流量里有很明显的哥斯拉webshell流量,挨个把发给木马的请求解密出来能发现有一条是运行sh解压压缩包的。

cmdLine Psh -c “cd “/var/www/html/upload/“;zip -o flag.zip /flag -P airDAS1231qaSW@” 2>&1methodName execCommand

用密码”airDAS1231qaSW@”解密刚才扫出来的zip,就能得到flag。

DASCTF{7892a81d23580e4f3073494db431afc5}

ACTF新生赛2020-明文攻击

从BUUCTF上找到的,很早之前做过。当时大概是拿ARCHPR一把梭的,这次用bkcrack再做一下。

给了两个文件,图片woo.jpg和加密的压缩包res.zip。res.zip中有flag.txt和secret.txt,都是ZipCrypto Deflate模式。

首先就是从图片woo.jpg提取其中隐藏的zip压缩包并补齐文件头,没什么好说的。提取为woo.zip,是没有加密的Deflate模式压缩包,其中有明文的flag.txt,crc与res.zip中的flag.txt相同。因此可以用flag.txt对res.zip进行已知明文攻击。

但要注意的是res.zip中flag.txt是ZipCrypto Deflate模式,其对应的明文不是flag.txt的内容,而是经过Deflate压缩过的flag.txt,实际上就是woo.zip文件结构中的文件数据部分。

woo.zip

将woo.zip中这17字节截取出来,写入plain文件中,作为明文对res.zip进行已知明文攻击

bkcrack -C ./res.zip -c "flag.txt" -p ./plain -o 0
[15:52:25] Z reduction using 10 bytes of known plaintext
100.0 % (10 / 10)
[15:52:26] Attack on 711315 Z values at index 6
Keys: 251dfe00 ec858db2 6e8a0dff
64.4 % (458300 / 711315)
[15:58:58] Keys
251dfe00 ec858db2 6e8a0dff

然后就可以解锁res.zip了。

bkcrack -C ./res.zip -k 251dfe00 ec858db2 6e8a0dff -U res_123.zip 123

用123打开压缩包中的secret.txt,得到flag

ACTF{3te9_nbb_ahh8}

DASCTF2023十月赛-SecretZip

就是上个月DASCTF上学长带着做的那道题。

题目总共给了三个文件。”flag.zpaq”、”key”、”purezip.zip”。

其中zpaq是另外一种加密压缩文件,需要密码,可以从https://github.com/zpaq/zpaq/releases下载解压程序。用十六进制编辑器打开可以看到末尾的提示:

the password is md5(the plaintext of the secret key which length is 3 bytes)

purezip.zip是模式为ZipCrypto Deflate的压缩包,其中包含一个”secret key.zip”。key是个乱码的文件。猜测key实际上就是purezip.zip中”secret key.zip”的经过Deflate压缩的明文的一部分。尝试直接拿key对purezip.zip作已知明文攻击。因为已知的明文很多所以破解速度很快。

bkcrack -C ./purezip.zip -c "secret key.zip" -p ./key -o 0
[14:13:05] Z reduction using 60 bytes of known plaintext
100.0 % (60 / 60)
[14:13:05] Attack on 134901 Z values at index 6
Keys: e63af7cc 55ef839d dc10b922
12.1 % (16325 / 134901)
[14:13:11] Keys
e63af7cc 55ef839d dc10b922

很快就能破解出XYZ密钥。把”purezip.zip”压缩包解开,得到”secret key.zip”,其中有一个”secret key.txt”。查看属性发现有注释"password is two bytes"。直接用hashcat爆破,掩码用?b?b。

zip2john ./secret\ key.zip
hashcat -a 3 -m 17210 "\$pkzip\$1*1*2*0*26*1a*b03bbac4*0*2c*0*26*b2a4*dcacb1d7118dcbb0a3c3095ff7aef52ea8a22685025ca1fb90b36e42057e2f151462a0969ae1*$/pkzip$" ?b?b

可以得到密码是$HEX[9c07],也就是\x9c\x07。密码都是不可打印字符,正常用压缩软件解压可能有点困难,可以选择用python解压。

import zipfile

with zipfile.ZipFile("./secret key.zip") as z:
z.setpassword(b"\x9c\x07")
z.extractall()

然后就可以打开”secret key.txt”了。

e48d3828 5b7223cc 71851fb0

看起来是ZipCrypto的XYZ密钥。记得之前找到的提示flag.zpaq的密码就是长度为3字节的secret key明文的md5,大概说的就是这个XYZ密钥所对应的原密码。用bkcrack还原一下:

bkcrack -k e48d3828 5b7223cc 71851fb0 -r 3 ?b
[15:15:46] Recovering password
length 0-6...
Password: ??? (as bytes: 8b e7 dc)
Some characters are not in the expected charset. Continuing.
[15:15:46] Could not recover password

得到密码是\x8b\xe7\xdc三个字节,是不可打印字符,用python算一下这三个字节的md5,作为密码解开flag.zpaq。

import hashlib
print(hashlib.md5(b"\x8b\xe7\xdc").hexdigest())
# bb9cceb294113270da5eaed47a545f55
zpaq.exe x .\flag.zpaq -key 'bb9cceb294113270da5eaed47a545f55'

就可以得到flag.txt了。

DASCTF{8ed70caa-dc92-4817-b111-0d4fc9f6f8ec}

评论