从神秘邮件到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加密文件数据]

关键操作步骤

  1. 使用Outlook或Thunderbird直接打开邮件,查看完整渲染效果
  2. 重点关注 Content-Disposition 标记的附件部分
  3. 提取出两个关键文件: 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())

二维码处理流程

  1. 将解码得到的二进制数据保存为 .png 文件
  2. 使用 zbarimg 工具扫描二维码:
zbarimg -q decoded_qr.png
  1. 获取密码字符串 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 魔数)。修复步骤:

  1. dd 跳过前10字节:
dd if=file.bin of=fixed.lzip bs=1 skip=10
  1. 解压修复后的文件:
lzip -d fixed.lzip
  1. 得到PDF文件 fixed.pdf

专业技巧:在010 Editor中可使用 File > Compare 功能对比标准LZIP文件头

5. 隐写分析:从壁纸到数据提取

解压得到的PDF仅包含一张Windows XP经典壁纸"Bliss"。使用 pdfimages 提取图片:

pdfimages -all fixed.pdf output

Stegsolve进阶用法

  1. 在"Analyse > Frame Browser"中查看各颜色通道
  2. 特别关注Blue通道的LSB(最低有效位)
  3. 使用"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{"

对于更复杂的二进制数据,可采用以下方法:

  1. 字符串提取 strings -n 8 flag.bin
  2. 熵值分析 binwalk -E flag.bin
  3. Hex编辑器 :手动搜索文件头尾特征

最终在文件偏移量 0x1A3 处发现Flag:

000001a0: 6c61 677b 6465 6c61 745f 697a 5f6d 7568  flag{delat_iz_muh
000001b0: 695f 736c 6f6e 617d 0a                   i_slona}

整个挑战犹如俄罗斯套娃,每一层都隐藏着更深的秘密。从邮件分析到二进制修复,从隐写到加密解密,这套完整的技术链路在现实取证调查中同样适用。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐