HackThisSite - Forensic Mission 3

Challenge

Forensic 3 — PapaSmurphey's Pizza

The local police just arrested a suspect believed to be the notorious PapaSmurphey, an online pizza trader. A flash drive was recovered from the scene and was copied; poorly. As best as you can, examine the contents for any incriminating evidence on the suspect. This challenge has several steps. The completion password will look like this: HTS{the_answer}

File Download / Password: (提交字段名 forensic3,POST 回关卡页自身)

状态:未通关(partially verified),已走通从图片里切出被故意改坏的加密 RAR 这一步, 卡在归档密码截断的归档上。不编造 HTS{...}

素材清单

附件 forensic_3.rar 解开后是 flashdrive/ 下 8 个文件(7z tEverything is Ok,rar 本身没坏):

1
2
3
4
5
6
7
49ZfDSNg.jpg                     90658   680x992 JPEG(其实是一张三格漫画)
bitcoin.pdf 184292 PDF 1.4,9 页
DYNAMITE - Winamp 5.0RC8crk.mp3 2230928 MPEG layer III 48kHz
Hack This Site!.url 55 Windows Internet Shortcut(内容就是 hackthissite.org)
legrandelibrary.xlsx 12871 xlsx,作者 Sam
shh.jpg 10376722 500x500 **灰度** JPEG,尺寸与体积严重不符
siggies.txt 54743 十六进制文件签名对照表

siggies.txt 是一张文件签名/魔数对照表(TGA、MOV、MOF……), 题面用它给出提示:类型按魔数判断,不以扩展名为准。

一张 500×500 的灰度 JPEG 不可能有 10 MB。binwalk 直接给出结构:

1
binwalk extracted/flashdrive/shh.jpg
1
2
0          0x0       JPEG image, total size: 32346 bytes
10371574 0x9E41F6 JPEG image, total size: 5148 bytes

也就是说:第一张 JPEG 在 32346 字节处结束文件最尾部还嵌了第二张 JPEG(205×80, 用视觉模型读出来是一个 GLOzMe 的 logo),两者之间有约 10.3 MB 的未识别数据。 这段数据的开头是:

1
5a 61 72 21 1a 07 00   Zar!....

Rar!\x1a\x07\x00 是 RAR4 的签名,这里的第一个字节被改成了 Z(0x5a), 正好对应题面那句 copied; poorly(原文把 poorly 加粗)。切出这段数据并把首字节改回 R(0x52):

1
2
3
4
data = bytearray(open("extracted/flashdrive/shh.jpg", "rb").read())
carved = bytearray(data[32346:10371574])
carved[0] = 0x52 # 'Z' -> 'R':修复被改坏的 RAR 签名
open("fixed.rar", "wb").write(bytes(carved))

再让 7-Zip 认它:

1
7z l -p- fixed.rar
1
ERROR: fixed.rar : Cannot open encrypted archive. Wrong password?

修复后归档结构上被接受了(这是关键进展),但它是一个文件头加密的 RAR: 主头部标志位是 0x0080MHD_PASSWORD,文件头本身被加密),所以在拿到密码之前连文件列表都读不出来。 (另外题面说拷得不好,这段归档在数据上也是不完整的,即使解密成功,能恢复的也只是前一部分。)

已确认的其它线索:

  • 尾部那张 JPEG 是 GLOzMe 的 logo(疑似嫌疑人的另一网名);
  • legrandelibrary.xlsx 的工作表是 A1:AX45,样式表里有大量纯色填充(如 FF00B050), 更像是一幅用单元格填色画的点阵图,而不是普通表格(sharedStrings 里只有 5X5X 两个串);
  • 其余素材:一张三格漫画、一份 9 页 PDF、一段 48kHz MP3。

用题目里出现的词做过的候选密码(GLOzMe/PapaSmurphey/pizza/5X5/legrandelibrary/Sam/bitcoin/shh 等) 在修好的归档上全部被拒:

1
2
$ 7z l -pGLOzMe fixed.rar      -> Cannot open encrypted archive. Wrong password?
$ 7z l -pPapaSmurphey fixed.rar -> Cannot open encrypted archive. Wrong password?

这几条候选是在修好签名之后测的(在坏签名上测会一律回 not an archive,那种结果没有意义, 这也是早点把签名修好的价值)。真正的密码应该还藏在素材里(xlsx 的点阵图、MP3 附加数据/帧间、 PDF 对象或另一张照片的内嵌数据),需要将它们逐个完全提取后串成链条。

从隐藏归档里提取的 rar2john 哈希是 $RAR3$*0*0e1577f1a4cbcbf2*b2915a6828ff978329bb5e6c1a07326f; 用 rockyou(14.3M)与大量定向词(含其它关卡已解出的答案)运行 john --format=rar-opencl均未命中。 候选答案串也试过:把 HTS{You_captured_me!}(以及不带 HTS{}、大小写变体等共 6 种)提交到现行关卡时, 服务端明确回错

1
Error! Sorry, but you've entered an incorrect password.

说明现行关卡要的不是这些串:必须靠破出归档密码来拿真答案。归档是文件头加密且被截断(copied poorly), 所以也可以考虑只恢复部分内容的路线(如 unrar r 的恢复模式)。

下一步(待办):

  1. legrandelibrary.xlsx 的单元格填充按 45×50 栅格渲染成图片再读,看是否有文字/图案;
  2. mp3:看帧间 LSB、附加数据、ffmpeg -i 元数据与谱图;
  3. bitcoin.pdfpdfid/pdf-parser 找附加对象与 JS/嵌入文件;
  4. 两张照片(漫画与 680×992 那张)做 LSB/附加数据/EXIF 复查;
  5. 拿到密码后 7z x,在解出的(可能不完整的)内容里找证据,拼成 HTS{...} 提交。 现成的中间产物都在 <hts-workspace>/challenges/hts-forensic/3/extracted/carved.rarfixed.rartail_embedded.jpgxlsx/xlsx_render*.png)。

Vulnerabilities

从闪存盘取证的场景里,拷贝的完整性本身就是证据的一部分: 本例的归档被改掉了一个签名字节、还被截断,靠魔数对照 + 字节级修复仍能还原出归档结构, 说明把文件混在图片里 + 改扩展名 + 改首字节这类手法只能阻碍直接双击查看。 需要保密的介质应整盘加密(如 BitLocker/LUKS),文件层面的伪装不构成保护。

未通关:已从 shh.jpg 切出并修复被改坏的