从一封神秘邮件到最终Flag:手把手复现BUUCTF『俄罗斯套娃』CTF题(附PGPTool、Stegsolve实战)
从神秘邮件到Flag捕获:BUUCTF『俄罗斯套娃』全流程技术拆解
当你收到一封标题为"机密任务"的陌生邮件时,是否会好奇其中隐藏的秘密?这正是CTF竞赛中常见的挑战场景。本文将带你完整复现BUUCTF平台上的经典题目『俄罗斯套娃』,通过七层技术关卡,体验从邮件分析到最终Flag获取的全过程。
1. 初始侦察:EML邮件结构解析
任何数字调查都始于文件格式分析。题目提供的 .eml 文件是Outlook的邮件存档格式,其本质是符合RFC 5322标准的纯文本文件,包含邮件头和内容主体。用文本编辑器打开即可看到以下关键结构:
From: <sender@example.com>
To: <recipient@example.com>
Subject: 机密任务
Content-Type: multipart/mixed; boundary="----=_NextPart_000_0001"
------=_NextPart_000_0001
Content-Type: text/plain
Content-Transfer-Encoding: base64
[Base64编码的正文内容]
------=_NextPart_000_0001
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="hack.pgp"
[PGP加密文件数据]
关键操作步骤 :
- 使用Outlook或Thunderbird直接打开邮件,查看完整渲染效果
- 重点关注
Content-Disposition标记的附件部分 - 提取出两个关键文件:
Matry_Oshka.key私钥和hack.pgp加密数据
注意:某些邮件客户端可能默认隐藏附件,需手动选择"显示附件"选项
2. 密码获取:Base64与二维码的连环套
邮件正文中的 Face 字段包含Base64编码数据,解码后得到一张二维码图片。这里涉及两个技术要点:
Base64解码技巧 :
- 使用Python快速验证编码内容:
import base64
with open('face.b64') as f:
print(base64.b64decode(f.read()).decode())
二维码处理流程 :
- 将解码得到的二进制数据保存为
.png文件 - 使用
zbarimg工具扫描二维码:
zbarimg -q decoded_qr.png
- 获取密码字符串
h4ck_the_plan3t
实际比赛中,密码可能隐藏在图片的EXIF信息或像素数据中,建议同时使用
exiftool进行检查
3. PGP解密:密钥管理与工具实战
拥有私钥文件和密码后,下一步是解密 hack.pgp 文件。PGPTool提供了图形化操作界面,但了解命令行操作同样重要:
GPG命令行解密流程 :
# 导入私钥
gpg --import Matry_Oshka.key
# 解密文件(会提示输入密码)
gpg --output decrypted.bin --decrypt hack.pgp
常见问题排查表 :
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| "No secret key" | 密钥未正确导入 | 检查 gpg --list-secret-keys 输出 |
| "Bad passphrase" | 密码错误 | 确认二维码解码结果 |
| "Unsupported algorithm" | 密钥算法不兼容 | 更新GPG到最新版本 |
解密成功后得到 file.bin 文件,通过 file 命令检查其类型:
file file.bin # 输出:LZIP压缩数据
4. 文件修复:二进制分析与手动修正
当标准工具无法识别文件时,需要手动分析二进制结构。使用 xxd 查看文件头部:
xxd -l 32 file.bin
输出显示前10字节为垃圾数据,覆盖了合法的LZIP头( LZIP 魔数)。修复步骤:
- 用
dd跳过前10字节:
dd if=file.bin of=fixed.lzip bs=1 skip=10
- 解压修复后的文件:
lzip -d fixed.lzip
- 得到PDF文件
fixed.pdf
专业技巧:在010 Editor中可使用
File > Compare功能对比标准LZIP文件头
5. 隐写分析:从壁纸到数据提取
解压得到的PDF仅包含一张Windows XP经典壁纸"Bliss"。使用 pdfimages 提取图片:
pdfimages -all fixed.pdf output
Stegsolve进阶用法 :
- 在"Analyse > Frame Browser"中查看各颜色通道
- 特别关注Blue通道的LSB(最低有效位)
- 使用"Image Combiner"与原图进行XOR运算
当发现疑似二维码片段时,可尝试用Python重建完整图像:
from PIL import Image
def extract_qr_fragments(stego_img, original_img):
diff = ImageChops.difference(stego_img, original_img)
diff = diff.convert('1') # 转换为二值图像
diff.save('qr_fragment.png')
6. 非标Base64:字符替换与流处理
隐写分析得到的Base64数据包含非常规字符 - 和 _ ,需要特殊处理。Python的 base64 模块支持自定义字符替换:
import base64
corrupted_b64 = "/Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4ELCAORdABhgwwZfNTLh1bKR4pwkkcJw0DSEZd2BcWATAJkrMgnKT8nBgYQaCPtrzORiOeUVq7DDoe9feCLt9PG-MT9ZCLwmtpdfvW0n17pie8v0h7RS4dO/yb7JHn7sFqYYnDWZere/6BI3AiyraCtQ6qZmYZnHemfLVXmCXHan5fN6IiJL7uJdoJBZC3Rb1hiH1MdlFQ/1uOwaoglBdswAGo99HbOhsSFS5gGqo6WQ2dzK3E7NcYP2YIQxS9BGibr4Qulc6e5CaCHAZ4pAhfLVTYoN5R7l/cWvU3mLOSPUkELK6StPUBd0AABBU17Cf970JQABgALDhQEApzo4PbHEZ/sCAAAAAARZWg=="
# 替换规则:'-'→'+', '_'→'/'
clean_b64 = corrupted_b64.translate(str.maketrans('-_', '+/'))
decoded = base64.b64decode(clean_b64)
with open('flag.7z', 'wb') as f:
f.write(decoded)
Base64变种对照表 :
| 标准字符 | URL安全变种 | 本题变种 |
|---|---|---|
| + | - | - |
| / | _ | _ |
| = | = | (保留) |
7. 终局之战:二进制分析与Flag提取
解压得到的7z文件包含二进制数据,使用 xxd 查看可见ASCII字符串:
xxd flag.bin | grep -A 3 "flag{"
对于更复杂的二进制数据,可采用以下方法:
- 字符串提取 :
strings -n 8 flag.bin - 熵值分析 :
binwalk -E flag.bin - Hex编辑器 :手动搜索文件头尾特征
最终在文件偏移量 0x1A3 处发现Flag:
000001a0: 6c61 677b 6465 6c61 745f 697a 5f6d 7568 flag{delat_iz_muh
000001b0: 695f 736c 6f6e 617d 0a i_slona}
整个挑战犹如俄罗斯套娃,每一层都隐藏着更深的秘密。从邮件分析到二进制修复,从隐写到加密解密,这套完整的技术链路在现实取证调查中同样适用。
更多推荐


所有评论(0)