从一封神秘邮件到最终Flag:手把手复现BUUCTF『BSidesSF2019』套娃题全流程
当你收到一封标题为"bWF0cnlvc2hrYQ=="的神秘邮件时,是否想过这串看似随机的字符背后隐藏着什么?这正是BUUCTF平台BSidesSF2019赛题"matryoshka"(俄罗斯套娃)的精妙之处——层层嵌套的谜题等待被逐一解开。本文将带你完整复现这道经典CTF隐写题的解题全流程,从最初的EML文件分析到最终的Flag获取,每个步骤都配有详细的操作指南和工具使用技巧。
1. 初始文件分析与邮件解密
EML文件是Outlook等邮件客户端使用的标准邮件存储格式。面对题目提供的attachment.eml文件,我们有多种解析方式:
- 邮件客户端直接查看:使用Outlook、Thunderbird等软件打开
- 文本编辑器解析:用VS Code/Sublime等查看原始内容
- 在线解析工具:如EML Viewer等网页工具
关键操作步骤:
- 用文本编辑器搜索
Content-Disposition: attachment定位附件部分 - 提取两个关键文件:
- Matry_Oshka.key(PGP私钥)
- hack.pgp(加密数据)
在邮件正文的"Face"部分,我们发现一段Base64编码数据。使用 The X在线解码器 解析后,得到一张二维码图片,扫描后获得密码:h4ck_the_plan3t。
注意:某些Base64解码器可能无法正确处理邮件中的换行符,建议先清理格式或使用命令行工具:
echo "BASE64内容" | base64 -d > output.png2. PGP解密与文件提取
获得私钥和密码后,我们需要使用PGP工具解密hack.pgp文件。推荐使用开源工具PGPTool:
- 访问 PGPTool官网
- 点击"Key ring" → "Import PGP Key"导入Matry_Oshka.key
- 输入密码
h4ck_the_plan3t - 选择hack.pgp文件进行解密
解密后得到file.bin文件。通过file命令识别文件类型:
file file.bin # 输出:file.bin: data使用binwalk分析文件结构:
binwalk file.bin # 输出示例: # DECIMAL HEXADECIMAL DESCRIPTION # ------------------------------------------------------------------ # 0 0x0 LZIP compressed data3. 处理LZIP压缩文件
LZIP是一种不太常见的压缩格式,需要特殊处理:
- 用010 Editor打开file.bin
- 删除文件头部的10个字节(LZIP魔数)
- 保存为file.lz
- 使用lzip解压:
lzip -d file.lz解压后得到file.bin.out,实际是一个PDF文件。重命名后打开,发现是经典的Windows XP默认壁纸"Bliss"。
4. 图片隐写分析
将PDF中的图片导出为bliss.png,使用Stegsolve进行分析:
- 打开Stegsolve → "File Format"查看文件结构
- 切换到"Image Combiner"模式
- 对比原图与题目图片(原图可从 维基媒体 获取)
- 在Blue通道发现异常数据,疑似二维码内容
专业技巧:Stegsolve的"Analyse → Data Extract"功能可以快速检查各通道的LSB信息
5. 非标准Base64处理
从图片中提取的数据包含特殊Base64编码:
/Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4ELCAORdABhgwwZfNTLh1bKR4pwkkcJw0DSEZd2BcWATAJkrMgnKT8nBgYQaCPtrzORiOeUVq7DDoe9feCLt9PG-MT9ZCLwmtpdfvW0n17pie8v0h7RS4dO/yb7JHn7sFqYYnDWZere/6BI3AiyraCtQ6qZmYZnHemfLVXmCXHan5fN6IiJL7uJdoJBZC3Rb1hiH1MdlFQ/1uOwaoglBdswAGo99HbOhsSFS5gGqo6WQ2dzK3E7NcYP2YIQxS9BGibr4Qulc6e5CaCHAZ4pAhfLVTYoN5R7l/cWvU3mLOSPUkELK6StPUBd0AABBU17Cf970JQABgALDhQEApzo4PbHEZ/sCAAAAAARZWg==关键点在于-和/字符替换了标准Base64的+和/。使用Python处理这种非标编码:
from base64 import b64decode base64data = "/Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4ELCAORdABhgwwZfNTLh1bKR4pwkkcJw0DSEZd2BcWATAJkrMgnKT8nBgYQaCPtrzORiOeUVq7DDoe9feCLt9PG-MT9ZCLwmtpdfvW0n17pie8v0h7RS4dO/yb7JHn7sFqYYnDWZere/6BI3AiyraCtQ6qZmYZnHemfLVXmCXHan5fN6IiJL7uJdoJBZC3Rb1hiH1MdlFQ/1uOwaoglBdswAGo99HbOhsSFS5gGqo6WQ2dzK3E7NcYP2YIQxS9BGibr4Qulc6e5CaCHAZ4pAhfLVTYoN5R7l/cWvU3mLOSPUkELK6StPUBd0AABBU17Cf970JQABgALDhQEApzo4PbHEZ/sCAAAAAARZWg==" with open('flag.7z','wb') as f: f.write(b64decode(base64data, altchars='-/'))参数说明:
altchars='-/'表示用-替换+,用/替换标准Base64中的/(实际是保持不变)- 该方法要求altchars必须至少包含两个字符
6. 最终Flag提取
解压得到的flag.7z文件后,使用CyberChef或hex编辑器查看内容。最终获取Flag:
flag{delat_iz_muhi_slona}完整工具链总结:
| 步骤 | 工具 | 关键参数/技巧 |
|---|---|---|
| 邮件解析 | Outlook/文本编辑器 | 查找Content-Disposition |
| Base64解码 | the-x.cn | 注意换行符处理 |
| PGP解密 | PGPTool | 密码h4ck_the_plan3t |
| 文件分析 | binwalk/010 Editor | LZIP头删除 |
| 图片隐写 | Stegsolve | Blue通道分析 |
| 非标Base64 | Python | altchars参数 |
| 最终解码 | CyberChef | 自动识别文件类型 |
这道题的精妙之处在于它模拟了真实的数字取证场景——从邮件分析开始,经过多重编码转换和隐写技术,最终揭露隐藏信息。在实际操作中,可能会遇到各种环境问题,比如:
- PGPTool的Java环境兼容性问题
- lzip工具在Windows下的安装配置
- Stegsolve的Java版本要求
- Python处理二进制数据时的编码错误
建议在Linux环境下使用虚拟机或Docker容器搭建统一的CTF解题环境,避免因系统差异导致的问题。对于想深入钻研的玩家,可以尝试用Python自动化部分流程,比如将Stegsolve的分析过程用OpenCV重现,或编写完整的解题脚本。