0x00 前言
题目地址: https://ctfx.hacktm.ro/
今天也是0分咸鱼呢.jpg
睡了一觉起来就剩两小时了, 还在 Web 里面卡到时间结束… 没想到其实取证更好做.
0x01 Strange PCAP
一个基础的 PCAP 取证题, 拿到文件先大致扫一眼发现有很多 USB Massive Storage 包, 初步猜测是要在这里面找 flag.
顺着一个一个翻数据包, 在 Frame 1224 发现了 ZIP 文件头和 Flag.txt 的字样, 提取出来看看.
提取数据后发现是一个加密压缩包, 用 010 Editor 查看发现是真加密. 接下来我们就得找密码了, 初步猜测一下可能得翻键盘发的 HID 包, 因为之前见到过 USB HID 的数据包类型.
往下翻果然看到大量 URB_INTERRUPT 类型. 我们将这些数据包用 tshark 导出, 详细过程可参考 奶冰的 2020 新年红包 Writeup 的第二关, 此处不再赘述.
参考 USB Keyboard 数据包格式, 可以得知每个包的第一个 Byte 对应控制键状态, 第三个 Byte 对应的是输入的键.
再结合 USB HID Keyboard scan codes 可以构造下面的脚本对数据包进行分析.
usb_codes = {
0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$",
0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
0x2C:" ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}", 0x32:"#~",
0x33:";:", 0x34:"'\"", 0x36:",<", 0x37:".>"
}
data = ''
for x in open("xd","r").readlines():
code = int(x[4:6],16)
print(x[4:6])
if code == 0:
continue
if code == 0x28:
print('ENTER!')
print(data)
data = ''
continue
upper = 0
if int(x[0:2],16) == 0x02 or int(x[0:2],16) == 0x20:
upper = 1
data += usb_codes[code][upper]
print(data)
解析后就得到了压缩包密码, 完成.
0x02 RR
拿到题目发现是三个img, 其中两个大小相同, 另外一个大小为 0.
根据题目意思 “One of my drives failed” 猜测这个大小为 0 的文件就是那个损坏的磁盘, 而根据两个盘能 “recovering all my files” 可能是组了 RAID 阵列.
但是这个题还有一个坑, img 文件的开头被填了一段无效的分区表, 采用 file 命令或者用 mdadm 直接检查是不会识别为 RAID 盘的. 用 binwalk 查看我们可以找到正确的 offset.
这里用 dd 简单的裁剪一下这个文件, 再用 mdadm 查看就能看到详细的 RAID 信息了, 确实是一个 RAID5.
接下来用 losetup 创建 loop 然后执行 mdadm --assemble --run /dev/md0 --readonly /dev/loop0 /dev/loop1
直接挂载硬盘就可以了. 这里不用 losetup -o 而要用 dd 处理文件是因为碰到了一些神秘 Bug.
在挂载后的硬盘中找到了 Flag, 完成.
0x03 Find My Pass
下载后解压得到一个 HackTM.vmem, 经典的 VMem 取证.
首先用 volatility -f HackTM.vmem imageinfo
扫描镜像, 得知系统是 Win7SP1x86.
然后用 volatility -f HackTM.vmem --profile=Win7SP1x86 pslist
查看运行中的进程, 发现里面有一个 KeePass.exe
, 经典++
执行 volatility -f HackTM.vmem --profile=Win7SP1x86 memdump -p 3620 -D .
导出 KeePass 的内存 dump 文件, 然后顺手用 strings 导出一下 txt 备用.
从 KeePass Wiki 中可以得知内存中会存在一段 XML 形式的数据, 直接用文本编辑器搜索我们刚才导出的字符串就可以找到.
当然, 这段 XML 并没有包含我们需要的信息, 可以注意到 MemoryProtection/ProtectPassword
为 True, XML中是不会有明文密码的. 进一步搜寻还发现了一个 nothinghere.7z
可能也会用到
还记得 刚才的 Wiki 中也有提到文件头么? 直接用 010 Editor 打开内存 dump 文件, 搜索这个文件头我们就可以找到数据. 比较麻烦的是这里找到了三个结果, 通常情况下如果有多个结果可以选择导出最长并且中间没有大块 00 的数据.
尝试用 KeePass 直接打开这个 KDBX, 发现我们还需要提供 Master Password. 这里就只能去之前的 VMEM 里继续找了, 在 dump 里想找这个是比较难的.
执行 volatility -f HackTM.vmem --profile=Win7SP1x86 clipboard -v
查看剪贴板, 发现这里有一个迷之字符串有点像密码
很幸运的是这就是 KDBX 的密码, 数据库中 Jason 的密码是 123456789, 和 nothinghere.7z 的密码并不匹配.
但是根据题目中的提示 “I use my one safe password where I want to keep everything safe from hackers.”, 用 dmVZQmdzOlUrcEBlRj87dHQ3USVBIn
去解压 nothinghere.txt 即可得到 flag.
0x04 Secrets Communicated
下载解压后得到了一个 7.3 GB 的 img 文件, 用 fdisk -l
查看, 在最下面找到明显是 /data 的分区.
计算出偏移量是 512 * 4751360 = 2432696320
, 直接挂载 userdata.
接下来就是让人头大的取证时间了… 这个设备里装了最少 5 个 IM 应用, 而且使用记录显示这些应用都被打开过.
翻了一圈以后在 Facebook Messenger > threads_db2 里面找到了一个神秘字符串, 但这并不是 flag.
回头检查内部存储, 发现 DCIM/Camera 里面有一张图片, 但是试了很多方法也没发现里面有隐藏信息.
再来检查 Download 里面那个奇怪的文件, 发现这是一个有密码的 zip, 尝试将刚才的神秘字符串作为密码即可解压成功拿到 flag.
这里其实有个坑, 这个文件名称在某些 shell 里是不会显示的, 很容易被人忽略掉. 不过在我这里并没有碰到这个问题.