WriteUp: ext 文件恢复 HZ & file

前言

第一道题出处不明。

本体见这里

第二道题是 xman 排位赛的 file 题目。

本体见这里

HZ

这一部分内容是 8.3 就写过的。

信息收集

拿到文件后一看是二进制,因此首先需要确定是什么类型的文件。

binwalk 一下可以看到 ext 和 zip 等关键词,猜测是硬盘镜像。

file 一下确认是 ext3 的镜像文件。

DiskGenius

其实到这一步卡了半个月,当时就卡在不知道用什么工具读这个文件。

后来在 XMAN 听师傅讲课的时候提起了 DiskGenius 猛然想起来 DiskGenius 可以读各种镜像文件,赶紧试了试。

根目录

其中 lost+found 是 ext3 文件系统的数据碎片,这里是空文件夹,同时上面的 .ls 也是空的。

aaa 是单纯的文本文件,全是 k 和换行,意义不明。

比较有趣的是 TODO.me ,内容是

1
2
3
- 下班后一定要记得要给花浇水
- 家里的熊孩子总是乱删我电脑里的文件,愁死了,有时间了得想个办法。
- 去邻居家里取下快递

猜测应该是出题人想留下的 hint,可能是希望让我们用 strings 扫出来,但是我用 strings 只能看到那个 aaa 的内容,grep 一下也没看到 Todo.me 的内容。

到这里就只剩下 .hide 了。

secret.odg

.hide 里面只有一个 secret.odg。

根据 DiskGenius 的提示应该是一个 OpenOffice 的文件,不过用 MSWord 也可以打开。

上面是一个矢量图形,下面是一段话,不过没看懂 7 个 M 什么意思,但是可以猜出来这里是出题人埋的坑,意思是 flag 不在这里。

所以这条路到这里就停止了,后来我又找到了另一篇文章,才有了新思路。

fsstat && ext3grep

这里用的工具是 fsstat 和 ext3grep,fsstat 我的 kali 自带的就有,猜测 Debian 的发行版应该都有,重点是 ext3grep。

ext3grep

ext3grep 我没有找到现有的 binary 所以只能自己 build。

它的源代码在这里,要编译的话需要 cmake 和 make。

同时 ext3grep 依赖了 e2fslibs-dev 需要安装。

1
sudo apt install e2fslibs-dev -y

然后问题是 make 的时候报错如下

按照编译器的提示修改还是会报错,所以这里我的解决办法就是全注释掉,反正都是 reserved。

但是注释掉再 make 还是会出错

但是这里按照编译器提示修改就可以编译通过了,最后 make install 后就可以使用 ext3grep 了。

恢复文件

这里我们首先用 fsstat HZ 查看镜像信息。

比较重要的是这里的 Root Directory: 2,其中的 2 马上就会用到。

然后用 ext3grep --inode 2 HZ 查看文件目录。

可以看到有一个 `.f1@gggggggggggg.swp` 不出意外就是它了。

接着用 ext3grep --restore-file .f1@gggggggggggg.swp hz 恢复指定的文件

经常用 vim 的同学相信对这种文件再熟悉不过了,我们直接用 vim -r RESTORED_FILES/.f1@gggggggggggg.swp 恢复它的内容。

然后我们就可以拿到 flag 了。

正向构造

这道题目到此本来就应该结束了,但是我比较好奇的是题目本身是如何构造出来的,最后在一番尝试后成功正向复现了题目。

创建新的空白分区

为了省事,这里直接在虚拟机上添加了一块大小为 5MB 的硬盘,在 Linux 中为 /dev/sdb

格式化 && 挂载

这里很关键的一点是,我们需要把新的硬盘格式化为 ext3,否则没法直接装载。

这里用到的是 mkfs。

1
mkfs -t ext3 /dev/sdb

然后就可以正常的装载了。

1
mount /dev/sdb ./test

制作 flag

各种干扰性质的文件就不再制作了,这里为了能产生一个 vim 的 swp 文件,我们直接 vim flag.txt,并且输入 flag 内容

然后我们 kill 掉这个 vim 进程后再看当前目录文件

然后把它 rm 掉就完成 flag 的制作了。

制作镜像

制作镜像前还有一个坑就是得先卸载硬盘,这样做出来才能被恢复。

1
umount /dev/sdb

接着用 dd 制作镜像。

1
dd if=/dev/sdb of=./t

最后检查制作效果

到这里正向的全部过程也就弄清楚了。

file

这部分是 8.11 写的,没想到写完 HZ 的 WriteUp 没多久就真的遇到了磁盘文件恢复的题目,所以就放到一起吧。

extundelete & ext4magic

常规用 DG 打开发现是很多猫片,没什么特别的。

由于不是 ext3 而是 ext4 所以这次用到的神器是 extundelete,用法不多介绍,一把梭就行

1
extundelete --restore-all file -o out

然后可以看到结果

和上面如出一辙,也是一个 vim 的 swp 文件。

ext3 恢复

然后我试了试用 extundelete,原来也是可以恢复上面 HZ 的。

恢复出来的效果也更好一些,其中 f1@gggggggggggg 打开就是之前 aaa 的内容,看起来本意是想干扰我们发现那个 swp 文件吧。

ext4 正向构造

讲的时候还是按照 ext3 的方式构造的(只需要用 mkfs.ext4 代替 mkfs.ext3 即可),结果直接翻车,当场没有恢复出来。

后来一直在尝试,发现 extundelete 这个很玄学,似乎删除文件比较多的时候才比较有用。最后发现按照上面 ext3 的构造方法,用 ext4magic 这个神器能扫出来(应该是结合了文件头扫描)。

这里放一张截图就可以说明了。

这样 ext4 分区的硬盘镜像我们也能正常的正向构造啦!

网上大部分都是推荐了 extundelete 几乎没有人提到 ext4magic,但是根据构造经验 extundelete 是很容易恢复不出来的,只有 ext4magic 能正常恢复出来,而且其实用 ext4magic 做上面两道题效果同样很好。

后记

其实文件恢复题还是工具题,只要见过就很好做了。

万一下次就出了呢(逃

2018.8.11 更新

奶中了呀,真的出了耶。

参考资料

Forensics/4g3n7 5m17h r3l04d3d
一次Hbase删库的故障恢复-EXT4文件恢复原理分析