Berd's Playground

_(:з」∠)_

@FENGberd3 weeks ago

02/3
21:24
CTF

HackTM CTF 2020 Writeup

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 里是不会显示的, 很容易被人忽略掉. 不过在我这里并没有碰到这个问题.

HackTM CTF 2020 Writeup