I. 引言
压缩包我们经常接触,用于对文件进行压缩存储/传输。压缩包处理在CTF比赛中是非常重要的一块,因为压缩包中可能包含重要信息:许多CTF题目会将关键信息隐藏在压缩包中,参赛者需要解压并查看其中的内容才能获取有用的线索。解密压缩是常见的CTF技能:参赛者需要掌握各种压缩文件格式的解压缩方法和工具,以及如何对压缩包进行加密和解密。压缩包处理可以提高解题效率:如果参赛者能够快速解压和查看压缩包中的文件列表和内容,就可以更快地找到关键信息,提高解题效率。对出题方而言,压缩包处理可以增加题目难度:如果一个CTF题目涉及到多个压缩包或复杂的加密算法,那么它会更加具有挑战性,考验参赛者的技术水平和耐心。
II. 常见的压缩文件格式
平时我们接触到的压缩包,主要有以下类型:zip格式、rar格式、7z格式、tar格式、gzip格式
其中zip和rar是最常见的其余7z、tar、gzip主要在linux上运行,出题常见于zip和rar,接下来我们简单介绍一下zip和rar两种压缩包
Zip压缩包:
典型特征后缀“.zip”,它的MIME格式为application/zip,zip压缩是一种有损压缩格式,即数据会因压缩而有损失,但是这种损失不会明显影响文件的质量。zip格式可以支持多种压缩算法,如存储、缩小、增强、最佳压缩等,可以根据不同的需求进行选择。zip压缩支持加密压缩。
特点1:数据记录格式:压缩源文件数据区+压缩源文件目录区+压缩源文件目录结束标志
压缩源文件数据库:[文件头+ 文件数据 + 数据描述符]
文件头: 50 4B 03 04 :这是文件头标记(0x04034b50),也可看到是“PK…”开头的
压缩源文件目录区为:50 4B 01 02
压缩源文件目录结束标志:50 4B 05 06
需要注意的加密点,每组四位数字,只和第二个数字有关系。
第二个数字为奇数时 –>加密
第二个数字为偶数时 –>未加密
① 无加密
压缩源文件数据区的全局加密应当为00 00 (50 4B 03 04两个bytes之后)
且压缩源文件目录区的全局方式位标记应当为00 00(50 4B 01 02四个bytes之后)
② 假加密
压缩源文件数据区的全局加密应当为00 00
且压缩源文件目录区的全局方式位标记应当为09 00
③ 真加密
压缩源文件数据区的全局加密应当为09 00
且压缩源文件目录区的全局方式位标记应当为09 00
RAR压缩包
典型特征“.rar”,rar 文件主要由标记块,压缩文件头块,文件头块,结尾块组成。
RAR 文件头 52 61 72 21 1A 07 00
RAR 文件尾 C4 3D 7B 00 40 07 00
伪加密:RAR的伪加密与ZIP的伪加密原理相同,号称伪加密的关键都是一个指定的位标记字段上。
PS:一般RAR伪加密的压缩包用WinRAR打开时都会显示文件头已损坏
在RAR的第24个字节,也就是010 Editor显示的文件结构中的ubyte PASSWORD_ENCRYPTED字段,修改其字段为1即可实现RAR伪加密。
或者修改第11个字节,也就是010 Editor显示的文件结构中的ubyte BLOCK_HEADERS_ENCRYPTED字段的值。修改为1即可造成RAR伪加密。
同理解法就是将其对应位置的值修改为0即可实现伪加密rar破解出来。不过一般rar在CTF中出现较少,重点还是zip的压缩包上面做文章。
了解了一些CTF中最常见压缩包格式,接下里我们分享一下如何做CTF题目。其实压缩包的题目,绝大多数是破解密码,其次是不全文件之类的提醒。
III. 实战演练:解决一个包含压缩包的CTF题目
3.1伪加密
这部分内容在第二章节里面已经讲述了,这里就不多累述了。
3.2 暴力破解
通常使用ARCHPR.exe工具来破解压缩文件,支持类型有zip、rar、ace、arj文件类型
使用场景:windows下加密过的压缩文件。
2.1. 攻击类型选择暴力破解,在范围位置根据提示选择暴力破解范围选项设置暴力破解包含的类型、开始于和结束于选项具体范围,如果没有定义则全范围暴力破解。建议使用1~9位的数字密码,以及系统自带的英文字典作为密码字典。
进行一些简单的设置,这里不用多讲
再这个图里面我们就可以获取到暴力破解的结果,这个结果就是压缩包解密密码。
PS:这里的暴力破解只针对真正加密过的压缩文件,才能进行破解,破解的时间与加密密钥的复杂度有关。对于伪加密类型的压缩包是无法通过这个工具进行破解的。
3.3明文攻击
- 明文攻击是指:加密的zip文件中你已经知道了这个ZIP加密文件中的七种一个或多个文件,推测出密钥并解密zip文件的攻击方法,相比与暴力破解,这种方法在破解密码较为复杂的压缩包时效率更高。
- 对于zip文件来说,进行明文攻击的条件是:①有一个单独的文件已知且进行压缩之后的CRC值与某个包含此文件的压缩包的CRC值相等;②明文文件的压缩算法一定要和加密的压缩文件的算法一致
+
如题:
1.在linux里面binwalk分离文件,但是失败了
在010里面打开图片,,发现尾部存在一个flag.txt,但是缺少一个包头
2.复制完后加上 50 4B,变成一个新的压缩包11.zip,打开后里面有flag.txt
进行明文攻击,因为压缩包的大小不同,可以用winrar自动进行修复
(因为flag.txt的crc32相同,但是压解压压缩包在asd文件夹中发现有good-已合并.jpg与qwe.zip两个文件,并且qwe.zip文件中flag.txt有密码,研究good-已合并.jpg,用steghide查看文件隐藏内容:steghide info filename缩后的大小都不同!而且res.zip包压缩后大小比较大)
最后用archpr明文攻击跑出flag
总结:
第一步:接下来打开ARCHPR,攻击类型选择明文,明文文件路径选择“未加密的.zip”,即:将明文文件不加密压缩后的文件;
第二步:然后加密文件选择需要破解的zip文件夹;
第三步:选择要破解的文件,点击开始,破解成功后会获得密码;
3.4 CRC32碰撞
CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit (8位十六进制数)的校验值由于CRC32产生校验值时源数据块的每一个bit (位)都参与了计算,所以数据块中即使只有一位发生了变化,也会得到不同的CRC32值,总之每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。但通常只适用于较小文本文件。zip文件中crc32为未加密文件的校验码,比如这里有一个加密的压缩包,直接双击就可以看见其中信息,而且我知道其中全是数字,便可使用脚本爆破。注:需要linux环境
如题:
题目:MISC60
题目描述:宇宙的一切的答案就是32
1.解题分析
日常binwalk分析图片,发现有32.txt文件,内容如下:
GUYDIQRQGMYDIMCBGAYDAOJQGAYDAMBQGQ7DIOJQIE7DON7FHBBEENK
GGQYTEMBQGAYDAMBQGYYDAMBQGAYDANJQGAYDAMBQGY6DERJXGQ6T
QNZUGE6TCNRVGE5EIQZXGJCTIOKEIZBDQRCCGMYTMMZRII7UIQKFIM7DE
RRZGA7TANCCGA6TAOBXIU5EEQRVIY7DCMRQGAYDAMBQGA6DAMBQGAYD
ANJQGRBDAMZQGQYECMBQGA5TAMBQGAYDANJTGQ5TAQJUG4BTQNZUIF
AUCNJRGIYDAMBQGAYDANRQGAYDAMBQGA7TAMBQGAYDANSDGJCTONB
XHA6TIMJXGE6DKMJYIRBTOMSFGQ5UIRSCHBCEEMRWGFBECQJSGRBTMQ
JWINBDGQRVGA7EEMBXGA5EGOBXGRAUCQJVGEZDAMBQGAYDAMBWGAY
DAMBQGA7TANCCGAZTANBQIEYDAMBZGAYDAMBQGAZTINRSGBATINZUGV
CDMMBQIMYTCMRQGAYDAMBQGA6DAMBQGAYDAMBVGAYDAMBQGA6DCM
SFG57DOOBXGQYTOMJWGUYTQRCDG5ZEKNBZIRDEEOCEII7DCNCBGAZTE
QJSGU6UERJSIY5TKMBUIIYDOMBYGQ7UINRQGBBTCMJSGAYDAMBQGAYD
MMBQGAYDAMBVGA7EEMBTGA7DAQJQGAYDSMBQGAYDAMBXIQ7DSMCBG
Q6TMNBSINBECRKFGEZDAMBQGAYDAMBWGAYDAMBQGAYDKMBQGAYDAM
BWG5ZEKNZUG55DONBRG5YTMNJRHBCEGNZSIU7DSRCGII5EIQRQHAYECM
BWGZDEMMBSIZDEKQZVGUYDIQRQG5YDQNRUGJBUEQKFIUYTEMBQGAYD
AMBQGYYDAMBQGAYDKMBUIIYDCMBSGE7DAMBQIEYDAMBZGAYDAMBQGA
7DINBZGBATINZXIU5EEQRVIY7DCMRQGAYDAMBQGA6DAMBQGAYDAMBVGA
YDAMBQGAYDAMBQGAYDAMBQGEYDAMRQGAYDAMBQGAYDAMBQGAYDA
MBWGYZEKNZUG55DONBVGA7EEMBRGAZDCNBQGAYECMBQGA5TAMBQGA
YDANJTGQ5TAQJUG4BTQNZUIFAUCNJRGIYDAMBQGAYDANRQGAYDAMBQG
A7TAMBQGAYDAMBQGAYDAMBQGAYDCMBQGIYDAMBQGAYDANBVGAYDAM
BQGA6EGMSFG57DOOBXGQ7TANCCGAYTAMRRGQYDAMCBGAYDAOJQGAY
DAMBQGM7DMMRQIE7DONBVIQ6DAMCDGEYTEMBQGAYDAMBQGYYDAMBQ
GAYDANJQGAYDAMBQGAYDAMBQGAYDAMBRGAYDEMBQGAYDAMBQHBATA
MBQGAYDANRRGJCTONBXHA6TINJQGRBDAMJQGIYTIMBQGBATAMBQHEYD
AMBQGAYDORBUHEYECNBXGY7DEQ7CIFCUKMJSGAYDAMBQGAYDMMBQG
AYDAMBQGUYDAMBQGAYDAMBQGAYDAMBQGAYTAMBSGAYDAMBQGAYEG
RRQGAYDAMBQGY6TERJXGQ6TQNZUGUYDIQRQGUYDMMBQGAYDAMBQGA
YDIMBQGA7DAMCDIMYDAMBQGAYDCNBQGEYDAMBQGAYDAMA=
观察字符包含大写字母和数字4-7,判断其为base32加密,解密后结果如下:
# 第一组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0900 0000 4>49 0A>7 7\xe58BB5F4 12000000 06000000 0500 0000 6<2E74=874
1=1651:DC72E49DFB8DB31631B?DAEC>2F90
?04B0=08 7E:BB5F> 12000000 0<000000
# 第一组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0;00 0000 534;0A47 \x03874AAA5 12000000 06000000 0?000000 6C2E7478=4
171<518DC72E4;DFB8DB261BAA24C6A6CB3B
50>B070: C874AAA5 12000000 06000000
# 第三组 文件头+文件数据+数据描述(共69字节)
?04B0304 0A00 0900 0000 3462 0A47 45D600C1 12000000 0<000000 0500 0000 <12E7~7874
1716518DC7rE49DFB8DB>14A032A25=BE2F;
504B0708 4?D600C1 12000000 06000000
# 第四组 文件头+文件数据+数据描述(共69字节)
50>B030> 0A00 0900 0000 7D>9 0A4= 642CBAEE 12000000 06000000 05000000 67rE747z74
17q6518DC72E>9DFB:DB080A066FF02FFEC5
504B07p8 642CBAEE 12000000 06000000
# 第一组核心目录头(共51字节)
504B0102 1>00 0A00 0900 0000 >449 0A47 7E:BB5F> 12000000 0<000000 0500 0000 0000 0000 0100 20000000 00000000 662E747z74
# 第二组核心目录头(共51字节)
50>B0102 1400 0A00 0;00 0000 534; 0A47 \x03874AAA5 12000000 06000000 0?00 0000 0000 0000 0100 20000000 45000000 <C2E7~7874
# 第三组核心目录头(共51字节)
?04B0102 1400 0A00 0900 0000 3>62 0A>7 45D<00C1 12000000 06000000 0500 0000 0000 0000 0100 20000000 8A000000 612E7478=4
# 第四组核心目录头(共51字节)
504B0102 1400 0A00 0900 0000 7D49 0A47 6>2C\xe2AEE 12000000 06000000 0500 0000 0000 0000 0100 20000000 CF000000 6=2E74=874
# 核心目录记录结束
504B0506 0000 0000 0400 0>00 CC000000 14010000 0000
根据对应数据相等,得到?:5,=:7,>:4,::8,<:6,;:9,\xe5:E,\x03:C,\xe2:B,~:4,r:2,z:8,p:0,q:1,替换后得到zip压缩文件二进制代码如下:
# 第一组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0900 0000 4449 0A47 7E8BB5F4 12000000 06000000 0500 0000 662E747874
1716518DC72E49DFB8DB31631B5DAEC42F90
504B0708 7E8BB5F4 12000000 06000000
# 第一组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0900 0000 53490A47 C874AAA5 12000000 06000000 05000000 6C2E747874
1716518DC72E49DFB8DB261BAA24C6A6CB3B
504B0708 C874AAA5 12000000 06000000
# 第三组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0900 0000 3462 0A47 45D600C1 12000000 06000000 0500 0000 612E747874
1716518DC72E49DFB8DB414A032A257BE2F9
504B0708 45D600C1 12000000 06000000
# 第四组 文件头+文件数据+数据描述(共69字节)
504B0304 0A00 0900 0000 7D49 0A47 642CBAEE 12000000 06000000 05000000 672E747874
1716518DC72E49DFB8DB080A066FF02FFEC5
504B0708 642CBAEE 12000000 06000000
# 第一组核心目录头(共51字节)
504B0102 1400 0A00 0900 0000 4449 0A47 7E8BB5F4 12000000 06000000 0500 0000 0000 0000 0100 20000000 00000000 662E747874
# 第二组核心目录头(共51字节)
504B0102 1400 0A00 0900 0000 5349 0A47 C874AAA5 12000000 06000000 0500 0000 0000 0000 0100 20000000 45000000 6C2E747874
# 第三组核心目录头(共51字节)
504B0102 1400 0A00 0900 0000 3462 0A47 45D600C1 12000000 06000000 0500 0000 0000 0000 0100 20000000 8A000000 612E747874
# 第四组核心目录头(共51字节)
504B0102 1400 0A00 0900 0000 7D49 0A47 642CBAEE 12000000 06000000 0500 0000 0000 0000 0100 20000000 CF000000 672E747874
# 核心目录记录结束
504B0506 0000 0000 0400 0400 CC000000 14010000 0000
根据通用位标识0900可知zip文件为加密压缩文件,无法直接解压。由未压缩大小06000000可知每个文件均为6个字符,CRC32校验码为7E8BB5F4、C874AAA5、45D600C1、642CBAEE(转化后为f4b58b7e、a5aa74c8、c100d645、eeba2c64),可以采用crc32碰撞的办法解出4个原文,源码如下:
import binascii
import string
def crack_crc():
print('-------------Start Crack CRC-------------')
# 这个例子对于CRC值有多个的爆破
crc_list = [0xf4b58b7e, 0xa5aa74c8, 0xc100d645, 0xeeba2c64]#文件的CRC32值列表,注意顺序
comment = ''
chars = string.printable
for crc_value in crc_list:
for char1 in chars:
char_crc = binascii.crc32(char1.encode())#获取遍历字符的CRC32值
calc_crc = char_crc & 0xffffffff#将获取到的字符的CRC32值与0xffffffff进行与运算
if calc_crc == crc_value:#将每个字符的CRC32值与每个文件的CRC32值进行匹配
print('[+] {}: {}'.format(hex(crc_value),char1))
comment += char1
print('-----------CRC Crack Completed-----------')
print('Result: {}'.format(comment))
if __name__ == '__main__':
crack_crc()
3.5 压缩包隐写
比如给出一堆字符或数字,仔细观察为某种进制,将其解码为十六进制,观察其文件头是压缩包或者是其他格式,修改后缀名后解压得flag
3.6 在文件中隐藏压缩包
在CTF压缩包隐写中最为常见,多用于在一个文件中隐藏一个压缩包
原理:以jpg格式为例,完整的JPG由FF D8开头,FF D9结束,图片浏览器会忽略FF D9之后的内容,因此可以在JPG文件之后加入其他的文件。
利用:formost、dd等工具,将其进行分离
IIII. 结论
今天我们分享了压缩包的处理技巧,压缩包题型也是多种多样,重要内容是对压缩包的头的理解、压缩包算法、CRC值、ARCHPR破解工具的使用(当然还有很多工具可以使用),通常压缩包也是配合其他技能一起出题。压缩包的处理效率往往体现在信息收集能力差异上面的。解题压缩包,我觉得最重要是获取关键信息的能力上,许多CTF题目会将关键信息隐藏在压缩包中。掌握压缩包处理技巧可以帮助参赛者快速找到并提取这些关键信息,从而更快地解决问题。而且压缩包的关键信息会在题目上通过各种各样方式(或直接或间接)的告诉给选手,选手需重视这些信息,往往都是破题的关键。