Hack 和 / - 使用 Ext4 进行取证
从我的错误中学习,了解如何在 ext4 文件系统上收集取证数据。
撰写技术文章的一大好处是,您可以获得大量的文档资料以供参考。我告诉人们,我可能比任何人都更频繁地参考我的书籍和文章,因为虽然我可能并不总是记得执行任务的具体步骤,但我总是记得我是否写过关于如何执行它的文章。
我发现自己不时参考的一篇文章是我在 2008 年 1 月刊的《Linux Journal》上撰写的“取证入门”文章(我在《Linux Journal》上的第一篇专题文章)。在那篇文章中,我详细介绍了如何使用 Autopsy(Sleuthkit 的前端)对遭受黑客攻击的服务器执行您自己的取证调查。最近,我不得不对一台遭受 SSH 暴力攻击(使用 SSH 密钥!)的服务器进行调查,并发现我的个人文档不再有效。在本文中,我将介绍这个问题的症状,以及最终我是如何解决这个问题的。
受害者正如我所提到的,最近我对一台服务器(为了保护无辜者,我们称之为 alvin)进行了调查,该服务器受到了暴力攻击的破坏。我完全按照我在取证文章中记录的步骤进行操作。当我检测到服务器被入侵的那一刻,我立即拔掉了服务器的电源插头,立即创建了整个驱动器的映像,在单独的驱动器上创建了映像的第二个副本,我将从该副本进行工作,一旦我的证据安全,我就用干净的操作系统重新安装了受影响的服务器。
与过去的调查相比,我遇到的这个系统的第一个重大区别是数据的庞大程度。为 10-20GB 的磁盘创建映像是一回事,而驱动器是数百 GB,并且每个操作——创建初始映像、映像复制和 md5sums——都需要数小时,则是另一回事。至少可以说,这是一个缓慢的过程。一旦我有了我的工作映像,我就启动了 Autopsy 并开始了我的调查。最初,一切都很好——Autopsy 看到了映像,并且能够检测到它的分区,当我开始浏览文件系统时,我可以看到根目录的内容。
问题当我尝试使用 Autopsy 浏览文件系统时,第一个问题出现了——根目录下的所有目录似乎都是空的。我知道这不可能是正确的,但我不确定问题是什么。起初,我以为我可能只是有一个损坏的映像副本,但由于 md5sum 似乎花费了几乎与复制映像相同的时间,我再次从我的黄金母盘重新开始了映像复制,以确保万无一失。当这仍然不起作用时,我尝试从命令行使用 Sleuthkit,甚至尝试了 The Coroner's Toolkit 中的工具,但我得到了相同的结果。我以为也许 Autopsy 无法支持如此大的磁盘映像。在我进行过多的研究之前,我决定尝试将映像环回挂载,看看它是否是损坏的映像。毕竟,如果是这样,我需要在继续进行之前创建一个新的映像。
这里的挑战在于,我创建的是整个磁盘的映像,而不仅仅是单个分区的映像。通常,当您环回挂载某些东西时,您挂载的是分区的映像,语法类似于
$ sudo mount -o loop /path/to/image /mnt/image
然后,您可以像浏览任何其他已挂载的文件系统一样浏览 /mnt/image。在这种情况下,由于映像是完整分区的映像,我必须弄清楚如何在映像中向前跳过并仅挂载分区。Mount 有一个名为 offset 的选项,允许您指定在将其作为文件系统挂载之前在文件中跳过多少距离,但诀窍在于知道应该将该 offset 设置为什么值。事实证明,如果您安装了 parted,则相对容易找到 offset。首先,我对 alvin 的完整磁盘映像运行 parted,并告诉它以字节为单位打印出完整的分区表
$ sudo parted /media/Forensics2/images/alvin-sda
GNU Parted 2.2
Using /media/Forensics2/images/alvin-sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) unit
Unit? [compact]? B
(parted) print
Model: (file)
Disk /media/Forensics2/images/alvin-sda: 251059544064B
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Number Start End Size Type ...
1 32256B 242242721279B 242242689024B primary ...
2 242242752512B 249999160319B 7756407808B extended ...
5 242242753536B 249999160319B 7756406784B logical ...
(parted) quit
在这种情况下,我对第一个分区感兴趣,从这个输出中,我可以看到分区从字节 32256 开始。现在我可以使用该 offset 来环回挂载分区
$ sudo mount -o loop,ro,offset=32256 alvin-sda /mnt
请注意,我在这里以只读方式挂载了文件系统。我不想冒险向此分区写入任何新数据!从那时起,我发现我可以很好地浏览 /mnt 下的文件系统——问题似乎出在 Autopsy 和 Sleuthkit 上。我进行了研究,但我真的找不到任何证据表明我接近映像大小的上限,但尽管如此,我还是决定尝试仅创建初始分区的映像。几个小时后,Autopsy 仍然无法使用新映像,但奇怪的是,我可以很好地在我的文件系统上环回挂载分区。在尝试了无数其他方法之后,我开始意识到问题不可能是我的分区大小。一定是其他原因,那时我注意到这个文件系统是 ext4。
像 Ext3 Plus One More老实说,除了 ext4 声称在处理大量文件时速度更快,同时声称向后兼容 ext3 之外,我并没有过多考虑这个文件系统。我在一些新系统上使用了它(它是现代 Ubuntu 安装上的默认设置),并且它似乎工作正常。因为它应该向后兼容,所以我最初认为它不是我问题的起因。但在更多研究之后,我发现不仅其他用户抱怨 Sleuthkit 中缺乏对 ext4 的支持,而且向后兼容性并不像您想象的那么兼容。虽然您可以将 ext2 和 ext3 文件系统作为 ext4 挂载,但只有当 ext4 文件系统不使用区段(区段是 ext4 的一项主要新功能,因此通常会启用)时,您才能将 ext4 文件系统作为 ext3 挂载。因为我无法将这个 ext4 文件系统视为 ext3,所以 Sleuthkit 也无法做到。
因此,如果我可以环回挂载分区,那么如果 Sleuthkit 和 Autopsy 不起作用,又有什么大不了的呢?虽然能够浏览文件系统是取证工具的一个有用功能,但另一个非常有价值的功能是创建文件系统时间线的能力。文件系统时间线将所有文件组织到一个巨大的文本数据库中,其中它们根据其 MAC 时间(文件上次修改、访问或更改其元数据的时间)排序。借助文件系统时间线,如果您对攻击者可能在系统上的时间有一个很好的了解,您可以开始跟踪他们在系统上执行程序、浏览目录并将脚本解压到系统上的虚拟足迹。通常,我会让 Autopsy 为我生成此文件。幸运的是,事实证明,来自 The Coroner's Toolkit 的一个名为 mactime 的工具能够从映像或已挂载的文件系统生成时间线。以下是我用来从挂载在 /mnt 的文件系统创建时间线的命令
$ sudo mactime -d /mnt -R -g /mnt/etc/group -p
↪/mnt/etc/passwd 1/2/1970 > timeline.txt
-d 选项指定文件系统的挂载目录,-R 告诉 mactime 递归扫描该目录。-g 和 -p 选项告诉 mactime 从我的已挂载文件系统中的 group 和 passwd 文件获取组和用户 ID 信息,最后,date 指定要开始的日期范围。日期必须在 1970 年 1 月 1 日之后(我将把原因留给读者作为练习),所以我选择了第二天。
虽然我没有获得我习惯的 Autopsy 用户体验,但一旦我可以浏览文件系统并查看时间线,我就可以使用相同的调查技术。最终,我能够拼凑出攻击者何时通过弱密码入侵机器的时间线,更改了密码,以便其他人无法以相同的方式入侵,然后下载并启动 SSH 暴力攻击脚本以传播到其他服务器。
我承认我真的很惊讶地看到我最喜欢的一些取证工具不再起作用了。虽然 Linux 文件系统不断改进是件好事,但一个意想不到的缺点(或者如果您是攻击者,则可能是优点)是,取证工具必须不断升级才能在现代文件系统上工作。虽然我能够挂载分区并创建时间线,但我不知道我是否能够从分区中恢复任何已删除的文件——这是取证工具的另一个有价值的用途。尽管如此,至少如果我(或您)需要再次分析 ext4 映像,我现在已经记录了所有步骤。