压缩包是一种常见的文件类型,其基本原理是查找文件内的重复字节,并建立一个相同字节的“词典”文件,并用一个代码表示,比如在文件里有几处有一个相同的词“中华人民共和国”,用一个代码表示并写入“词典”文件,这样就可以达到缩小文件的目的。
无论是什么压缩软件,其目的就只有一个:减少冗余数据。例如某行字是“000011111”,就可以压缩为“0(4)1(5)”,在保证数据没有受损的同时,减少其占用的体积
常见于ctf比赛中的压缩包类型有zip,rar,大部分题目也主要围绕这两种类型的压缩包出题。
大部分压缩包隐写考点主要在压缩包的文件结构上做手脚,通过修改文件中的某些字节达成一些效果,例如让一个正常的没有加密的压缩包变为加密压缩包,例如在压缩包的固定某几个字节存入数据等等。
有些题目将压缩包隐藏在图片中或者一段base64编码后的文本中,那么不认识压缩包文件格式的话就无法很好的辨认出来,因此认识压缩包的文件头对于解题有很好的帮助。
首先是zip类型压缩包,这类的文件头比较好辨别,其开头为PK,而对应的hex则为504B,更完整的为504B0304,通常看见这段hex就需要意识到其是zip压缩包,在010editor中可以看到:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
其次是rar文件,此类文件头更容易辨别,因为在文本格式下打开其头三个字母为Rar,与其文件类型一致,而其hex串为52617221,如图:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
rar5的文件头为 52 61 72 21 1A 07 01 00
rar4的文件头为 52 61 72 21 1A 07 00 ,文件尾为 C4 3D 7B 00 40 07 00
题目直接给出如上文本,通过前面对于压缩文件格式的了解能够认识到此为zip文件(文件头504b0304)。
利用cyberchef将hex转为压缩包文件并导出:
在已知压缩包被加密的情况下,根据部分信息生成字典来爆破压缩包的密码,如已知压缩包密码为6位纯数字、生日日期、姓名首字母等等,通过生成特定字典来对压缩包密码进行爆破,做法较为简单,通常利用工具ARCHPR进行爆破。
利用ARCHPR进行爆破
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
事实上大部分压缩软件是通过压缩包中全局方式位标记判断压缩包是否加密,当一个没有加密的压缩包被修改了全局方式位标记后再打开时会发现压缩软件提示需要输入密码,但此时无论输入任何密码都无法解压该压缩包。
zip
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
该标志位为奇数时(如01)表示压缩包加密,偶数表示未加密(00),因此将上图一压缩包标志位修改为奇数后即可将压缩包转变为加密压缩包(伪加密)。
该标志位实际上位于压缩包的504b0304xxxx字节之后,比较容易发现。
而rar文件的伪加密与zip不同,其加密直接肉眼看较难找到,通常需要利用010editor的文件模板来识别。
如上图,该加密位位于block内的HEAD_FLAGS内的PASSWORD_ENCRYPTED字段中,将其修改为1即可形成伪加密。
CRC32:CRC本身是“冗余校验码”的意思,CRC32则表示会产生一个32bit(8位十六进制数)的校验值。在产生CRC32时,源数据块的每一位都参与了运算,因此即使数据块中只有一位发生改变也会得到不同的CRC32值,利用这个原理我们可以直接爆破出加密文件的内容,但是CRC32值也存在被碰撞的可能,也就是会出现内容不一样但是CRC32值一样的情况,所以利用CRC32碰撞的方法得知压缩文件的内容,一般是在被压缩的文件很小的情况下,通常在10个字节以内。
利用github上的开源软件或者自写脚本爆破即可。
0x292b7c58
result:
K9Qt3R
OpaH_9
TJIZeV
ZEVjYX
apMAX2
hxb_
lbHNOt
pAgb_0
0xee8d8709
result:
C0UUMf
C0UUMf
FXzHSX
HWexoV
LSxyn5
SmMjU9
WiPkTZ
XzA6rY
aNNOBv
hXVATS
l08mQt
l08mQt
th1s_
uZfL6B
wfcRo_
0x5ca2e8e5
result:
BG54Xg
G3UuGM
KMbfOV
PwJtu9
TsWutZ
bTIQbv
kBQ_tS
secret
明文攻击是一种较为高效的攻击手段,原理是当你不知道一个zip的密码,但是你有zip中的一个已知文件(文件大小要大于12Byte)时,因为同一个zip压缩包里的所有文件都是使用同一个加密密钥来加密的,所以可以用已知文件来找加密密钥,利用密钥来解锁其他加密文件。在压缩文件时输入的密码,首先被转换成3个32bit的key,所以可能的key的组合是2^96,如果用暴力穷举的方式是不太可能的,除非密码比较短或者有个厉害的字典。压缩软件用这3个key加密所有包中的文件,所有文件的key是一样的,如果我们能够找到这3个key,就能解开所有的文件。如果我们找到加密压缩包中的任意一个文件,这个文件和压缩包里的文件是一样的,我们把这个文件用同样的压缩软件同样的压缩方式进行无密码的压缩包(这里可以通过比较压缩后文件的CRC32值来判断,如果一样,则使用的是同样的压缩方式和软件),得到的文件就是我们的Known plaintext(已知明文)。用这个无密码的压缩包和有密码的压缩包进行比较,分析两个包中相同的那个文件,抽取出两个文件的不同点,就是那3个key了,如此就能得到key。两个相同文件在压缩包中的字节数应该相差12个byte,就是那3个key了。虽然我们还是无法通过这个key还原出密码,但是我们已经可以用这个key解开所有的文件,所以已经满足我的要求了,得到其中加密的其他文件。
题目示例
例如某道题第二关压缩包中存在与第一关一样的文件,说明是明文攻击。使用winrar加密`富婆通讯录.png`
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
使用Advanced Archive Password Recovery进行明文攻击得到密码。fvcktw123
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
DOCX是一个压缩文件,其中包含XML,Image,Binary等不同格式的数据。我们可以看到DOCX文件的内容。docx文件比doc文件所占用空间更小。docx格式的文件本质上是一个ZIP文件。将一个docx文件的后缀改为ZIP后是可以用解压工具打开或是解压的。
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
同样的是504b0304打头,也就是zip专属的文件头,解压后可得到如下内容:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
这个比较好理解,就是在压缩包中注释信息位中放入一些信息,使用常规的解压缩包软件即可查看到该信息,如图:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
这个其实与前面提到的识别文件头有关系,大部分情况下都是给出一个文件后缀为zip或者rar格式,但直接解压发现会报错:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
这时候查看文件头发现并不是熟悉的文件头,因此需要手动添加上文件头:
![隐写术之各类常见压缩包类型隐写总结 隐写术之各类常见压缩包类型隐写总结]()
原文始发于微信公众号(SAINTSEC):隐写术之各类常见压缩包类型隐写总结
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/3958518.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论