Linux 取证

初始信息收集

基本信息

首先,建议准备一些带有已知良好的二进制文件和库USB(你可以只获取 Ubuntu 并复制 /bin/sbin/lib/lib64 文件夹),然后挂载 USB,并修改环境变量以使用这些二进制文件:

export PATH=/mnt/usb/bin:/mnt/usb/sbin
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64

一旦您配置了系统以使用良好且已知的二进制文件,您可以开始提取一些基本信息:

date # 日期和时间(时钟可能被倾斜,可能在不同的时区)
uname -a #OS info
ifconfig -a || ip a # #网络接口(提示模式?)
ps -ef # 运行进程
netstat -anp # 过程和端口
lsof -V # Open files
netstat -rn; route # 路由表 Routing table
df; mount # 自由空间和安装设备 Free space and mounted devices
free # Meam和交换空间 Meam and swap space
w # 谁有连接 Who is connected
last -Faiwx # Logins
lsmod # What is loaded
cat /etc/passwd #Unexpected data?
cat /etc/shadow #Unexpected data?
find /directory -type f -mtime -1 -print # 在目录的最后一分钟找到修改后的文件 Find modified files during the last minute in the directory

可疑信息

在获取基本信息时,您应该检查以下异常情况:

  • Root进程通常以较低的PID运行,因此如果您发现一个具有较大PID的Root进程,可能存在可疑情况

  • 检查/etc/passwd中没有shell的用户的注册登录

  • 检查/etc/shadow中没有shell的用户的密码哈希值

内存转储

为了获取正在运行的系统的内存,建议使用LiME

要进行编译,您需要使用与受害机器使用的相同内核

请记住,您不能在受害机器上安装LiME或任何其他东西,因为这将对其进行多个更改。

因此,如果您有一个相同版本的Ubuntu,可以使用apt-get install lime-forensics-dkms

在其他情况下,您需要从GitHub下载LiME,并使用正确的内核头文件进行编译。要获取受害机器的确切内核头文件,您只需将目录/lib/modules/<kernel version>复制到您的机器上,然后使用它们来编译LiME:

LiME支持3种格式:

  • 原始格式(将每个段连接在一起)

  • 填充格式(与原始格式相同,但右侧位填充为零)

  • Lime格式(推荐的带有元数据的格式)

LiME还可以用于通过网络发送转储,而不是将其存储在系统上,使用类似于:path=tcp:4444

磁盘镜像

关闭系统

首先,您需要关闭系统。这并不总是一个选择,因为有时系统将是一台公司无法承受关闭的生产服务器。 有两种方式可以关闭系统,一种是正常关闭,另一种是**“拔插头”关闭**。第一种方式将允许进程按照通常的方式终止,并且文件系统将被同步,但也会允许可能的恶意软件破坏证据。"拔插头"的方法可能会导致一些信息丢失(由于我们已经对内存进行了镜像,所以不会丢失太多信息),而恶意软件将没有任何机会对此做任何事情。因此,如果您怀疑可能存在恶意软件,只需在系统上执行**sync**命令,然后拔掉电源。

对磁盘进行镜像

重要的是要注意,在将您的计算机连接到与案件相关的任何内容之前,您需要确保它将以只读方式挂载,以避免修改任何信息。

磁盘镜像预分析

对没有更多数据的磁盘镜像进行镜像制作。

搜索已知恶意软件

修改的系统文件

一些Linux系统具有验证许多已安装组件完整性的功能,这是一种有效的方法来识别异常或不合适的文件。例如,在Linux上,rpm -Va旨在验证使用RedHat软件包管理器安装的所有软件包。

恶意软件/Rootkit 检测工具

阅读以下页面,了解可以用于查找恶意软件的工具:

恶意软件分析

搜索已安装的程序

软件包管理器

在基于 Debian 的系统中,/var/lib/dpkg/status 文件包含有关已安装软件包的详细信息,而 /var/log/dpkg.log 文件记录了软件包安装时的信息。 在 RedHat 和相关的 Linux 发行版中,rpm -qa --root=/mntpath/var/lib/rpm 命令将列出系统上 RPM 数据库的内容。

其他

并非所有已安装的程序都会在上述命令中列出,因为某些应用程序在某些系统上不可用作为软件包,必须从源代码安装。因此,检查诸如 /usr/local/opt 等位置可能会发现其他已从源代码编译和安装的应用程序。

另一个好主意是检查$PATH中的常见文件夹,查找与已安装软件包无关的二进制文件

恢复已删除的运行二进制文件

检查自启动位置

计划任务

服务

恶意软件通常会作为新的未授权服务嵌入系统。Linux有一些脚本用于在计算机启动时启动服务。初始化启动脚本 /etc/inittab 调用其他脚本,如 rc.sysinit 和 /etc/rc.d/ 目录下的各种启动脚本,或者在一些旧版本中是 /etc/rc.boot/。在其他版本的Linux中,如Debian,启动脚本存储在 /etc/init.d/ 目录中。此外,一些常见的服务在 /etc/inetd.conf/etc/xinetd/ 中启用,具体取决于Linux的版本。数字取证人员应检查每个启动脚本中是否存在异常条目。

  • /etc/inittab

  • /etc/rc.d/

  • /etc/rc.boot/

  • /etc/init.d/

  • /etc/inetd.conf

  • /etc/xinetd/

  • /etc/systemd/system

  • /etc/systemd/system/multi-user.target.wants/

内核模块

在Linux系统上,内核模块通常用作恶意软件包的rootkit组件。内核模块是根据 /lib/modules/'uname -r'/etc/modprobe.d 目录中的配置信息以及 /etc/modprobe/etc/modprobe.conf 文件在系统启动时加载的。应检查这些区域是否存在与恶意软件相关的项目。

其他自启动位置

Linux使用几个配置文件在用户登录系统时自动启动可执行文件,这些文件可能包含恶意软件的痕迹。

  • /etc/profile.d/* , /etc/profile , /etc/bash.bashrc 在任何用户账户登录时执行。

  • ∼/.bashrc , ∼/.bash_profile , ~/.profile , ∼/.config/autostart 在特定用户登录时执行。

  • /etc/rc.local 传统上在所有正常系统服务启动后执行,即在切换到多用户运行级别的过程结束时。

检查日志

在受损系统上查找所有可用的日志文件,以寻找恶意执行和相关活动的痕迹,例如创建新服务。

纯日志

记录在系统和安全日志中的登录事件,包括通过网络登录,可以揭示恶意软件入侵者在特定时间通过给定账户访问受损系统的情况。系统日志中可以捕获与恶意软件感染相关的其他事件,包括在事件发生时创建新服务或新账户。 有趣的系统登录日志:

  • /var/log/syslog (debian) 或 /var/log/messages (Redhat)

  • 显示系统的一般消息和信息。这是全局系统活动的数据日志。

  • /var/log/auth.log (debian) 或 /var/log/secure (Redhat)

  • 保存成功或失败的登录和认证过程的认证日志。存储位置取决于系统类型。

  • cat /var/log/auth.log | grep -iE "session opened for|accepted password|new session|not in sudoers"

  • /var/log/boot.log:启动消息和引导信息。

  • /var/log/maillogvar/log/mail.log:用于邮件服务器日志,方便查看在服务器上运行的 postfix、smtpd 或与电子邮件相关的服务信息。

  • /var/log/kern.log:保存内核日志和警告信息。内核活动日志(例如 dmesg、kern.log、klog)可以显示特定服务的重复崩溃,可能表明安装了不稳定的木马版本。

  • /var/log/dmesg:设备驱动程序消息的存储库。使用 dmesg 命令查看此文件中的消息。

  • /var/log/faillog:记录失败的登录信息。因此,用于检查潜在的安全漏洞,如登录凭据被盗和暴力攻击。

  • /var/log/cron:记录与 Crond 相关的消息(cron 作业)。例如,cron 守护程序启动作业的时间。

  • /var/log/daemon.log:跟踪正在运行的后台服务,但不以图形方式表示。

  • /var/log/btmp:记录所有失败的登录尝试。

  • /var/log/httpd/:包含 Apache httpd 守护程序的 error_log 和 access_log 文件的目录。所有 httpd 遇到的错误都记录在 error_log 文件中。考虑内存问题和其他与系统相关的错误。access_log 记录通过 HTTP 进入的所有请求。

  • /var/log/mysqld.log/var/log/mysql.log:记录每个调试、失败和成功消息的 MySQL 日志文件,包括 MySQL 守护程序 mysqld 的启动、停止和重启。系统根据目录决定。RedHat、CentOS、Fedora 和其他基于 RedHat 的系统使用 /var/log/mariadb/mariadb.log。然而,Debian/Ubuntu 使用 /var/log/mysql/error.log 目录。

  • /var/log/xferlog:保存 FTP 文件传输会话。包括文件名和用户发起的 FTP 传输等信息。

  • /var/log/*:始终检查此目录中的意外日志

在入侵或恶意软件事件中,Linux系统的日志和审计子系统可能被禁用或删除。由于Linux系统的日志通常包含有关恶意活动的最有用信息,入侵者经常删除它们。因此,在检查可用的日志文件时,重要的是查找可能表示删除或篡改的间隙或乱序条目。

命令历史

许多Linux系统配置为为每个用户账户保留命令历史记录:

  • ~/.bash_history

  • ~/.history

  • ~/.sh_history

  • ~/.*_history

登录

使用命令 last -Faiwx 可以获取已登录用户的列表。 建议检查这些登录是否合理:

  • 有任何未知用户吗?

  • 有任何不应该有shell登录的用户吗?

这很重要,因为攻击者有时可能将 /bin/bash 复制到 /bin/false 中,以便像 lightdm 这样的用户可以登录。

请注意,您也可以通过阅读日志来查看此信息。

应用程序痕迹

  • SSH: 使用SSH连接到受损系统或从受损系统连接到其他系统会在每个用户帐户的文件中留下记录(∼/.ssh/authorized_keys∼/.ssh/known_keys)。这些记录可以揭示远程主机的主机名或IP地址。

  • Gnome桌面: 用户帐户可能有一个 ∼/.recently-used.xbel 文件,其中包含有关在Gnome桌面上运行的应用程序最近访问的文件的信息。

  • VIM: 用户帐户可能有一个 ∼/.viminfo 文件,其中包含有关VIM使用情况的详细信息,包括搜索字符串历史和使用vim打开的文件的路径。

  • Open Office: 最近使用的文件。

  • MySQL: 用户帐户可能有一个 ∼/.mysql_history 文件,其中包含使用MySQL执行的查询。

  • Less: 用户帐户可能有一个 ∼/.lesshst 文件,其中包含有关less使用情况的详细信息,包括搜索字符串历史和通过less执行的shell命令。

USB日志

usbrip 是一个用纯Python 3编写的小型软件,用于解析Linux日志文件(根据发行版,可能是/var/log/syslog*/var/log/messages*)以构建USB事件历史表。

了解所有已使用的USB设备是很有趣的,如果您有一个授权的USB设备列表,那么查找"违规事件"(使用不在该列表中的USB设备)将更加有用。

安装

示例

示例 1:收集易失性数据

要从Linux系统中收集易失性数据,可以使用以下命令:

示例 2:收集磁盘镜像

要从Linux系统中收集磁盘镜像,可以使用以下命令:

示例 3:分析磁盘镜像

要在Linux中分析磁盘镜像,可以使用以下命令:

示例 4:分析日志文件

要在Linux中分析日志文件,可以使用以下命令:

示例 5:分析网络流量

要在Linux中分析网络流量,可以使用以下命令:

示例 6:分析内存转储

要在Linux中分析内存转储,可以使用以下命令:

检查用户账户和登录活动

检查 /etc/passwd/etc/shadow安全日志,查找异常的名称或在已知未经授权事件附近创建和使用的账户。还要检查可能的sudo暴力攻击。 此外,检查 /etc/sudoers/etc/groups 等文件,查找给用户授予的意外特权。 最后,查找没有密码或密码容易猜测的账户。

检查文件系统

文件系统数据结构可以提供与恶意软件事件相关的大量信息,包括事件的时间恶意软件的实际内容。 恶意软件越来越多地被设计为阻碍文件系统分析。一些恶意软件会更改恶意文件的日期时间戳,以使时间线分析更加困难。其他恶意代码被设计为仅将某些信息存储在内存中,以最小化存储在文件系统中的数据量。 为了应对这些反取证技术,有必要仔细关注文件系统日期时间戳的时间线分析,以及存储在可能发现恶意软件的常见位置的文件。

  • 使用 autopsy 可以查看可能有助于发现可疑活动的事件时间线。您还可以直接使用 Sleuth Kitmactime 功能。

  • 检查 $PATH 内是否有意外的脚本(可能是一些sh或php脚本?)

  • /dev 中的文件曾经是特殊文件,您可能会在这里找到与恶意软件相关的非特殊文件。

  • 查找异常或隐藏的文件目录,例如“.. ”(点 点 空格)或“..^G ”(点 点 控制-G)

  • 系统上的 /bin/bash 的 Setuid 副本 find / -user root -perm -04000 –print

  • 检查已删除的inode的日期时间戳,如果在同一时间删除了大量文件,则可能表明恶意活动,例如安装了rootkit或木马服务。

  • 由于inode是按照下一个可用的方式分配的,因此在大约相同时间放置在系统上的恶意文件可能会被分配连续的inode。因此,在定位到恶意软件的一个组件后,检查相邻的inode可能会很有成效。

  • 还要检查目录,如 /bin/sbin,因为新文件或修改文件的修改时间可能很有趣。

  • 按创建日期对目录中的文件和文件夹进行排序,以查看最近的文件或文件夹(通常是最后一个)。

您可以使用 ls -laR --sort=time /bin 检查文件夹中最近的文件。 您可以使用 ls -lai /bin |sort -n 检查文件夹中文件的inode。

请注意,攻击者可以修改时间以使文件看起来合法,但他无法修改inode。如果您发现一个文件表明它的创建和修改时间与同一文件夹中的其他文件相同,但是inode意外地更大,那么该文件的时间戳已被修改。

比较不同文件系统版本的文件

查找添加的文件

查找修改的内容

在对Linux系统进行法医调查时,重要的是要识别任何可能与案件相关的修改内容。这可以包括修改后的文件、目录或系统配置。

要查找修改后的内容,您可以使用各种工具和技术。一种常见的方法是将系统的当前状态与已知的良好状态进行比较。这可以通过创建系统文件和配置的基线,然后将其与当前状态进行比较来完成。

一个可用于此目的的工具是find命令。通过使用-newer选项,您可以搜索在特定日期和时间之后修改的文件。例如,以下命令将找到过去24小时内修改的所有文件:

您还可以使用stat命令获取有关文件的详细信息,包括其上次修改时间。例如,以下命令将显示文件的最后一次修改时间:

通过分析修改后的内容,您可能能够发现与案件相关的重要证据或线索。重要的是以法医上合理的方式记录和保存任何调查结果,以确保其在必要时在法庭上的可接受性。

查找已删除的文件

在进行Linux取证时,能够找到已删除的文件非常重要。即使文件已被删除,通常仍然可以从文件系统中恢复。

一种查找已删除文件的方法是使用grep命令在磁盘镜像的未分配空间中搜索特定的文件签名。文件签名是用于识别文件类型的唯一字节模式。

使用grep搜索已删除文件,可以使用以下命令:

  • -a选项将磁盘镜像视为文本文件。

  • -b选项打印匹配模式的字节偏移量。

  • -E选项启用扩展正则表达式。

  • -o选项仅打印行的匹配部分。

  • -P选项启用Perl兼容的正则表达式。

<file_signature>替换为要搜索的特定文件签名,将<disk_image>替换为磁盘镜像文件的路径。

通过在未分配空间中搜索文件签名,您可能能够找到已删除的文件,这些文件可以在取证调查中提供有价值的证据。

其他过滤器

-diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

仅选择已添加(A)、已复制(C)、已删除(D)、已修改(M)、已重命名(R)以及其类型(即常规文件、符号链接、子模块等)已更改(T)、未合并(U)、未知(X)或已破坏配对(B)的文件。可以使用任意组合的过滤字符(包括无)。当将*(全部或无)添加到组合中时,如果比较中存在与其他条件匹配的文件,则选择所有路径;如果没有与其他条件匹配的文件,则不选择任何内容。

此外,这些大写字母可以转换为小写字母以进行排除。例如,--diff-filter=ad排除已添加和已删除的路径。

请注意,并非所有的差异都可以包含所有类型。例如,从索引到工作树的差异永远不会有已添加的条目(因为差异中包含的路径集受限于索引中的内容)。类似地,如果禁用了对复制和重命名类型的检测,那么复制和重命名条目将不会出现。

参考资料

最后更新于

这有帮助吗?