攻防世界-Mysterious-GIF
⭕、知识点
1、binwalk数字取证/二进制数据隐写
2、GIF注释扩展/GIF文件结构
3、python脚本编写/批量解压缩/命令行
4、openssl工具/非对称解密
5、JPG文件格式
一、题目

一个GIF图片

二、解题
1、右键查看属性无信息
2、观察GIF没有隐藏帧,拆帧26帧没有新发现
3、foremost提出一个压缩包00005125.zip
解压一次得到temp.zip 111kB
解压temp.zip得到partaa.enc 1kB
明显不对劲,解压出来的文件反而比压缩包小很多
4、temp.zip丢进010看一下

发现是通过在压缩包末尾添加冗余数据实现多个压缩包嵌套隐写
压缩包1-压缩包2-压缩包3....
而且通过查看器可以看出每个压缩包里都有个partxx.enc,应该是加密文件
5、编写脚本把temp.zip里的所有隐写压缩包提取出来
脚本和压缩包temp.zip放在一起
pos = []
start_idx = 0
with open("temp.zip","rb") as f:
data = f.read()
while(1):
idx = data.find(b"\x50\x4b\x03\x04", start_idx)
if idx == -1:
break
pos.append(idx)
start_idx = idx +1
print(pos)
pkg_num = len(pos)
print(pkg_num)
for i in range(pkg_num):
with open(f"pkg{i}.zip","wb") as f:
if i < pkg_num - 1:
f.write(data[pos[i]:pos[i+1]])
else:
f.write(data[pos[i]:])
6、批量解压文件
import zipfile
import os
name_lists = os.listdir()
for name in name_lists:
if name.endswith('.zip'):
with zipfile.ZipFile(name) as zf:
zf.extractall(".")
得到一堆enc后缀的文件,应该是加密过的,需要找到密钥解密
6、【这一步是看wp学到的】GIF格式下可能有注释块,单凭windows的属性-详细信息是看不到的
identify -format "%c" 382e5c74bb7b4214ac6b855e503a56b9.gif > hex 查看有没有注释信息

得到HEX数据,转文本得一串base64字符串

这个就是密钥
7、使用openssl解密
先要把密钥改为PCK8封装格式,加上首尾即可
with open("k","r") as f:
with open("key","w") as k:
k.write("-----BEGIN PRIVATE KEY-----\n")
k.write(f.read())
k.write("\n-----END PRIVATE KEY-----")
8、尝试解密一个enc发现有是JFIF,但只要一小部分,应该是需要把所有的解密然后拼接成jpg
9、批量解密数据并组合成jpg
import os
with open("flag","wb") as f:
for name in os.listdir():
if name.endswith('.enc'):
out_name = name[:-4]
os.system(f"openssl pkeyutl -decrypt -in {name} -inkey key -out {out_name}")
with open(out_name,'rb') as o:
f.write(o.read())
把flag改名为flag.jpg,打开得到flag

三、答案
FelicityIsFun
四、总结
学到了GIF注释块信息的提取办法

浙公网安备 33010602011771号