难!难啊!简直是难!
参考文章: 纵横靶场工控安全wp:奇怪的文件。_Zhangyannn的博客-CSDN博客
分析
题目给出的附件文件名为“attachment1579407555bruteforce.zip”, 看起来是需要爆破, 没想到需要那么多爆破😥.
下载附件后, 解压发现有三个文件, 分别为: part1/part2/part3. 对于这种无后缀名的文件, 首先使用file
工具和binwalk
工具对文件进行结构的分析, 然而却没有任何可用的信息, file
显示该系列文件均为"data", binwalk
也没有识别出任何的文件特征.
使用Hex编辑器打开文件(我用的是Windows版应用HxD), 发现这些文件的文件魔数均为未知的.
从这三个文件名中进行猜测, 这三个文件可能跟压缩文件有关, 起初我想到的是"分卷压缩", 经过WriteUp大法才知道原来是一个压缩文件的三个部分
该系列文件的头部字节分别为:
file name | header bytes |
---|---|
part1 | 03 04 14 00 |
part2 | 01 02 3F 00 14 00 01 00 |
part3 | 05 06 |
在part1文件的起始字节中可以猜测出, 该文件可能为zip压缩文件(文件魔数为 50 4B 03 04)4. 后续两个文件可能为zip文件的尾部数据,part2和part3分别为central directory(文件目录部分)和end of central directory record.(目录部分结尾标记) 5
修复压缩文件
使用Hex编辑器对三个文件进行文件补全, 并将part2和part3的依次追加到part1的最后. 将part1命名为part1.zip, 使用zip解压软件打开, 但是无法正常显示文件. 对part1和part2进行分析, 发现part1中缺少CRC校验值, part2中缺少文件名.
part1 | part2 |
---|---|
此处应为CRC校验值 | 此处应为文件名 |
通过对zip文件结构进行分析可以知道, 在part1中存在被压缩的文件名为KeyVisual.jpg, part2中存在压缩文件的CRC校验值0x34475650. 将该两者数据分别补全, 最终得到修复后的zip文件.
补全CRC校验 | 补全文件名 |
---|---|
第一次爆破
该zip文件为加密压缩文件, 需要进行爆破. (爆破方法很多, kali下可以使用john
6. 另外由于没有任何提示, 爆破时可能需要生成无规则的字典. 本文使用Windows的工具进行破解)
在Windows下使用Advanced Archive Password Recovery工具对Zip文件进行破解, 破解模式选择"爆破(Brute force)", 勾选必要的密码元素(根据答案, 密码只包含大小写字母和数字, 因此勾选大小写字母和数字即可, 密码长度限制为7位). 最终获得密码GyxXaq9 (不看WriteUp的话想获得这个密码得猴年马月好嘛).
解压得到图片文件KeyVisual.jpg, 打开发现不存在flag相关信息.
第一次图片隐写
使用binwalk
对该图片进行分析, 显示其是一张普通图片, 不存在其它部分;
使用strings KeyVisual.jpg | grep -i flag
对该图片的Ascii字符进行查找, 未发现flag字样;
使用Stegsolve对该图片初步分析, 未发现隐写.
再次使用Hex编辑器打开该文件, 快速浏览该文件的ascii部分, 发现文件最后存在字符"KP". 进一步观察, 发现该文件的结尾字节为0x04 0x03 0x4B 0x50, 这恰好是zip文件的魔术的逆序. 编写PowerShell脚本, 对该文件的字节进行反转并输出.
$bytes = [System.IO.File]::ReadAllBytes(".\KeyVisual.jpg");
$bytes = $bytes[$bytes.Count .. 0];
[System.IO.File]::WriteAllBytes(".\new.zip", $bytes);
得到新的压缩文件new.zip, 对其进行解压, 但压缩软件提示"该压缩文件已损坏". 使用binwalk
对其内容进行分析, 发现其存在多个zip压缩部分. 使用binwalk -e new.zip
对该文件进行解包, 可得到文件"enc.pyc"和"encrypted". 根据文件名猜测前者可能为加密程序, 后者为已加密的文件.
解密文件
pyc文件为编译过的py脚本, 使用在线工具对该pyc文件进行反编译, 可得到该文件的python源代码.
# uncompyle6 version 3.5.0
# Python bytecode 3.6 (3379)
# Decompiled from: Python 2.7.5 (default, Aug 7 2019, 00:51:29)
# [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]
# Embedded file name: .\enc.py
# Compiled at: 2019-08-03 23:38:43
# Size of source mod 2**32: 627 bytes
import random, base64, sys
def KeyGenerate():
random.seed(10)
keyseed = ''
for i in range(12):
x = random.randint(32, 127)
keyseed += chr(x)
return base64.b64encode(keyseed.encode('utf-8')).decode('utf-8')
def enc(key, file):
count = 0
f = open(file, 'rb')
f1 = open('encrypted', 'wb')
for now in f:
for nowByte in now:
newByte = nowByte ^ ord(key[(count % len(key))])
count += 1
f1.write(bytes([newByte]))
if __name__ == '__main__':
key = KeyGenerate()
enc(key, sys.argv[1])
根据源码, 可以发现加密算法为异或运算, 加密密钥为随机生成, 但由于没有设置随机种子, 因此每次运行该脚本时的密钥实际上是一样的. 既为异或加密, 则解密与加密的算法和密钥相同. 修改上述python脚本, 将输出文件改名为'decrypted'(即将上述代码的第23行中的encrypted修改成decrypted), 使用该脚本对加密文件(encrypted)进行解密. 执行命令python3 ./enc.py encrypted
得到解密后的文件decrypted, 使用file
查看该文件为图片文件; 使用binwalk
发现该文件为普通图片, 不包含其它成分.
第二次图片隐写以及第二次爆破
找了很多方法,没能判断出该图片为LSB隐写。
(密码为U!lSb29)