压缩包

zip

文件头 50 4B 03 04(PK )


RAR

文件头 52 61 72 21 1A 07 01 00(Rar! )


文件尾&注释



明文攻击

条件:

完整的明文文件

明文文件需要被相同的压缩算法标准压缩(也可理解为被相同压缩工具压缩)

明文对应文件的加密算法需要是 ZipCrypto

该攻击需要至少 12 个字节的已知明文。 其中至少 8 个必须是连续的。 连续的已知明文越大,攻击速度越快。

注意利用文件中固定不变的字节


bkcrack

kimci86/bkcrack: Crack legacy zip encryption with Biham and Kocher's known plaintext attack. (github.com)

-L 查询加密方式

Store为未压缩,Deflate为压缩过

zipcrypto和AES是加密算法,store和deflate是压缩算法


例题:ZIP已知明文攻击深入利用_明文攻击密码软件-CSDN博客

ZIP深入明文攻击 已更新(2021湖湘杯某取证题&美团鱿鱼游戏)_zipcrypto deflate-CSDN博客


ZipCrypto Store

bkcrack

-C 指定攻击压缩包

-c 指定攻击的文件(压缩包里的文件,密文部分)

-p 指定明文文本(明文部分)

-o -p参数指定的明文 在压缩包内目标文件的偏移量(-p + -o)

-x 指定偏移量+对应的十六进制

tips

-o 搭配文件文本偏移量

-x 搭配十六进制偏移量

这里的偏移量都是在要攻击的压缩包里的偏移量


1、

.\bkcrack.exe -C 攻击压缩包 -c 攻击文件 -x 偏移量 十六进制
.\bkcrack.exe -C "D:\比赛ing\羊城杯2023附件\Easy_VMDK.zip" -c flag.vmdk -x 0 4B444D5601000000030000

.\bkcrack.exe -C 攻击压缩包 -c 攻击文件 -k key -d 保存路径
.\bkcrack.exe -C "D:\比赛ing\羊城杯2023附件\Easy_VMDK.zip" -c flag.vmdk -k e6a73d9f 21ccfdbc f3e0c61c -d "D:\比赛ing\羊城杯2023附件\flag.vmdk"

-k 上一步爆出来的key(主密钥)

文件保存

-d 指定保存路径

有了key可以直接爆破密码的,但这里密码是32位,算了,爆密码用法在deflate那部分


2、

注-o 0被我省略了

.\bkcrack.exe -C 攻击压缩包 -c 攻击文件 -p 明文文本 -o 偏移量
.\bkcrack.exe -C "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\Easy_VMDK.zip" -c flag.vmdk -p "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\1.txt" 

1.txt

然后是和上面一样的提取

.\bkcrack.exe -C "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\Easy_VMDK.zip" -c flag.vmdk -p "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\1.txt" -k e6a73d9f 21ccfdbc f3e0c61c -d flag.vmdk

ZipCrypto Deflate

先给hint.jpg用ZipCrypto Deflate算法压缩

两个crc循环冗余校验码相同,基本可以认为两个hint.jpg是一样的


bkcrack

bkcrack -C encrypted.zip -c cipher -P plain.zip -p plain
.\bkcrack.exe -C "D:\比赛ing\古剑山misc\幸运饼干\flag.zip" -c hint.jpg -P "D:\比赛ing\古剑山misc\幸运饼干\hint.zip" -p hint.jpg

破密码

-r 指定密码,-r 10,指定十位数,-r 1..14 指定1-14位数

.\bkcrack.exe -k key -r 位数 ?p
.\bkcrack.exe -k afb9fee3 f8795353 f6de1d4e -r 1..14 ?p

sv@1v3z就是密码


文件恢复

.\bkcrack.exe -C "D:\比赛ing\古剑山misc\幸运饼干\flag.zip" -c admin.txt -k afb9fee3 f8795353 f6de1d4e -d admin.txt

对于deflate压缩过的数据,提取后需要用inflate.py脚本解压缩

注:windows的powershell <> 有特殊含义,先输入cmd换成使用cmd

python3 .\tools\inflate.py 文件1 文件2
python3 .\tools\inflate.py <admin.txt> admin1.txt

文件1为提取出来的deflate压缩文件,文件2为保存解压缩deflate的文件



AAPR(Advanced Archive Password Recovery)

选择明文攻击-->选择flag.zip和hint.zip压缩包


总结

.\bkcrack.exe -C 攻击压缩包 -c 压缩包内文件 -x 0 4B444D5601000000030000
.\bkcrack.exe -C "D:\比赛ing\羊城杯2023附件\Easy_VMDK.zip" -c flag.vmdk -x 0 4B444D5601000000030000


.\bkcrack.exe -C 攻击压缩包 -c 攻击文件 -p 明文文本 -o 偏移量
.\bkcrack.exe -C "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\Easy_VMDK.zip" -c flag.vmdk -p "D:\比赛ing\Easy_VMDK的附件\tempdir\MISC附件\1.txt" 


.\bkcrack.exe -C 攻击压缩包 -c 攻击文件 -p 明文文本 -o 偏移量 -x 十六进制
bkcrack -C 1.zip -c flagornot.zip -p plain.txt -o 30 -x 0 504B0304


.\bkcrack.exe -C 攻击压缩包 -c 想提取的文件 -k key -d 保存路径 
.\bkcrack.exe -C "D:\比赛ing\古剑山misc\幸运饼干\flag.zip" -c admin.txt -k afb9fee3 f8795353 f6de1d4e -d admin.txt


python3 .\tools\inflate.py 文件1 文件2    //解压缩
python3 .\tools\inflate.py <admin.txt> admin1.txt


.\bkcrack.exe -k key -r 1..14 ?p    //破密码
.\bkcrack.exe -k afb9fee3 f8795353 f6de1d4e -r 1..14 ?p

常用文件头字节

如果知道加密压缩包里的压缩包的压缩包文件名(套娃),可用压缩包文件名作为爆破条件在压缩包里的名字是放在压缩包的第三十个字节

.\bkcrack.exe -C "D:\比赛ing\take_the_zip_easy的附件\zipeasy.zip" -c dasflow.pcapng -p "C:\Users\86139\Desktop\1.txt" -o 30 -x 0 504B0304

image-20240127172223395


LICENSE.txt

                    GNU GENERAL PUBLIC LICENSE

robots.txt

User-agent: * 

html

<!DOCTYPE html>

xml

<?xml version="1.0" encoding="UTF-8"?>


伪加密

具体看这篇文章CTF-伪加密_ctf 伪加密-CSDN博客

压缩源文件数据区

50 4B 03 04:文件头
14 00:解压文件所需 pkware 版本
01 00:全局方式位标记(判断有无加密)


压缩源文件目录区

50 4B 01 02:目录中文件文件头标记
1F 00:压缩使用的 pkware 版本
14 00:解压文件所需 pkware 版本
01 00:全局方式位标记(判断有无加密,00 00改为01 00打开就会提示有密码了)

压缩源文件目录结束标志

50 4B 05 06:目录结束标记


判断

当文件头那的标志位为奇数时为真加密(假设源文件目录区正常)

偶数时,当源文件目录区标志位为奇数时为伪加密,否则未加密


掩码攻击


crc32碰撞

每个文件都有唯一的CRC32值,即便数据中一个bit发生变化,也会导致CRC32值不同。若是知道一段数据的长度和CRC32值,便可穷举数据,与其CRC32对照,以此达到暴力猜解的目的。


当加密压缩包大小很小时尝试(几个字节)

第一次写jio本

# crc碰撞
from binascii import crc32

# 有多少位(字节)循环多少次
for b in range(128):  # 范围根据题目需要改
    for k in range(128):
        for q in range(128):
            for i in range(128):
                string = chr(b) + chr(k) + chr(q) + chr(i)
                if crc32(string.encode()) == 十六进制:  # 0xDE65C01B
                    print(string)


遍历文件夹中的很多zip:

#coding:utf-8
import zipfile
import string
import binascii
 
def CrackCrc(crc):
    for i in dic :
        for j in dic:
            for p in dic:
                for q in dic:
                    s=i+j+p+q
                    if crc == (binascii.crc32(s) & 0xffffffff):
                        print(s)    
 
def CrackZip(): 
    for I in range(54):
        # 压缩文件遍历
        file = 'chunk' + str(I) + '.zip'
        f = zipfile.ZipFile(file, 'r')
        GetCrc = f.getinfo('data.txt')
        crc = GetCrc.CRC
        #以上3行为获取压缩包CRC32值的步骤
        CrackCrc(crc)

dic = string.ascii_letters + string.digits + '+/='
CrackZip()
posted @ 2024-01-19 18:06  ^cyi^  阅读(154)  评论(0编辑  收藏  举报