hacktricks/forensics/basic-forensic-methodology/linux-forensics.md

30 KiB
Raw Blame History

Linux取证

使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

☁️ HackTricks云 ☁️ -🐦 推特 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

初始信息收集

基本信息

首先,建议准备一些带有已知良好的二进制文件和库的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 #Date and time (Clock may be skewed, Might be at a different timezone)
uname -a #OS info
ifconfig -a || ip a #Network interfaces (promiscuous mode?)
ps -ef #Running processes
netstat -anp #Proccess and ports
lsof -V #Open files
netstat -rn; route #Routing table
df; mount #Free space and mounted devices
free #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

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

{% hint style="info" %} 请记住,您不能在受害机器上安装LiME或任何其他东西,因为这将对其进行多个更改。 {% endhint %}

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

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

make -C /lib/modules/<kernel version>/build M=$PWD
sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime"

LiME支持3种格式

  • 原始格式(将每个段连接在一起)
  • 填充格式(与原始格式相同,但右侧位填充为零)
  • Lime格式推荐的带有元数据的格式

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

磁盘镜像

关闭系统

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

获取磁盘镜像

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

#Create a raw copy of the disk
dd if=<subject device> of=<image file> bs=512

#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes

磁盘镜像预分析

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

#Find out if it's a disk image using "file" command
file disk.img
disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files)

#Check which type of disk image it's
img_stat -t evidence.img
raw
#You can list supported types with
img_stat -i list
Supported image format types:
raw (Single or split raw file (dd))
aff (Advanced Forensic Format)
afd (AFF Multiple File)
afm (AFF with external metadata)
afflib (All AFFLIB image formats (including beta ones))
ewf (Expert Witness Format (EnCase))

#Data of the image
fsstat -i raw -f ext4 disk.img
FILE SYSTEM INFORMATION
--------------------------------------------
File System Type: Ext4
Volume Name:
Volume ID: 162850f203fd75afab4f1e4736a7e776

Last Written at: 2020-02-06 06:22:48 (UTC)
Last Checked at: 2020-02-06 06:15:09 (UTC)

Last Mounted at: 2020-02-06 06:15:18 (UTC)
Unmounted properly
Last mounted on: /mnt/disk0

Source OS: Linux
[...]

#ls inside the image
fls -i raw -f ext4 disk.img
d/d 11: lost+found
d/d 12: Documents
d/d 8193:       folder1
d/d 8194:       folder2
V/V 65537:      $OrphanFiles

#ls inside folder
fls -i raw -f ext4 disk.img 12
r/r 16: secret.txt

#cat file inside image
icat -i raw -f ext4 disk.img 16
ThisisTheMasterSecret

使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。 立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

搜索已知恶意软件

修改的系统文件

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

#RedHat
rpm -Va
#Debian
dpkg --verify
debsums | grep -v "OK$" #apt-get install debsums

恶意软件/Rootkit 检测工具

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

{% content-ref url="malware-analysis.md" %} malware-analysis.md {% endcontent-ref %}

搜索已安装的程序

软件包管理器

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

#Debian
cat /var/lib/dpkg/status | grep -E "Package:|Status:"
cat /var/log/dpkg.log | grep installed
#RedHat
rpm -qa --root=/ mntpath/var/lib/rpm

其他

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

ls /opt /usr/local

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

#Both lines are going to print the executables in /sbin non related to installed packages
#Debian
find /sbin/ -exec dpkg -S {} \; | grep "no path found"
#RedHat
find /sbin/ exec rpm -qf {} \; | grep "is not"

使用Trickest轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

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

检查自启动位置

计划任务

cat /var/spool/cron/crontabs/*  \
/var/spool/cron/atjobs \
/var/spool/anacron \
/etc/cron* \
/etc/at* \
/etc/anacrontab \
/etc/incron.d/* \
/var/spool/incron/* \

#MacOS
ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/

服务

恶意软件通常会作为新的未授权服务嵌入系统。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/*:始终检查此目录中的意外日志

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

命令历史

许多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设备将更加有用。

安装

pip3 install usbrip
usbrip ids download #Download USB ID database

示例

Example 1: Collecting Volatile Data

示例 1收集易失性数据

To collect volatile data from a Linux system, you can use the following commands:

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

$ date
$ uname -a
$ ps aux
$ netstat -antp
$ ifconfig -a

Example 2: Collecting Disk Image

示例 2收集磁盘镜像

To collect a disk image from a Linux system, you can use the following command:

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

$ dd if=/dev/sda of=/mnt/forensics/disk_image.dd

Example 3: Analyzing Disk Image

示例 3分析磁盘镜像

To analyze a disk image in Linux, you can use the following commands:

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

$ file disk_image.dd
$ fdisk -l disk_image.dd
$ mmls disk_image.dd
$ mount -o loop,ro disk_image.dd /mnt/forensics/mount_point
$ ls -l /mnt/forensics/mount_point
$ cat /mnt/forensics/mount_point/etc/passwd

Example 4: Analyzing Log Files

示例 4分析日志文件

To analyze log files in Linux, you can use the following commands:

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

$ cat /var/log/syslog
$ cat /var/log/auth.log
$ cat /var/log/apache2/access.log
$ cat /var/log/apache2/error.log

Example 5: Analyzing Network Traffic

示例 5分析网络流量

To analyze network traffic in Linux, you can use the following commands:

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

$ tcpdump -i eth0 -w /mnt/forensics/network_traffic.pcap
$ tshark -r /mnt/forensics/network_traffic.pcap

Example 6: Analyzing Memory Dump

示例 6分析内存转储

To analyze a memory dump in Linux, you can use the following commands:

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

$ volatility -f memory_dump.raw imageinfo
$ volatility -f memory_dump.raw pslist
$ volatility -f memory_dump.raw netscan
$ volatility -f memory_dump.raw filescan
usbrip events history #Get USB history of your curent linux machine
usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user
#Search for vid and/or pid
usbrip ids download #Downlaod database
usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid

更多示例和信息请参考GitHubhttps://github.com/snovvcrash/usbrip


使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}

检查用户账户和登录活动

检查 /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。

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

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

查找添加的文件

git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/

查找修改的内容

When conducting a forensic investigation on a Linux system, it is important to identify any modified content that may be relevant to the case. This can include modified files, directories, or system configurations.

To find modified content, you can use various tools and techniques. One common approach is to compare the current state of the system with a known good state. This can be done by creating a baseline of the system's files and configurations, and then comparing it with the current state.

One tool that can be used for this purpose is the find command. By using the -newer option, you can search for files that have been modified after a specific date and time. For example, the following command will find all files modified within the last 24 hours:

find / -type f -newermt "24 hours ago"

You can also use the stat command to obtain detailed information about a file, including its modification time. For example, the following command will display the modification time of a file:

stat <file_path>

Additionally, you can check the system logs for any suspicious activities or modifications. The /var/log directory contains various log files that can provide valuable information about system events.

By identifying and analyzing modified content, you can gain insights into the actions taken on the system and potentially uncover evidence relevant to your investigation.

git diff --no-index --diff-filter=M _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/ | grep -E "^\+" | grep -v "Installed-Time"

查找已删除的文件

When conducting Linux forensics, it is important to be able to find deleted files. Even though a file may have been deleted, it is often still recoverable from the file system.

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

One way to find deleted files is by using the grep command to search for specific file signatures within the unallocated space of a disk image. File signatures are unique patterns of bytes that can be used to identify the file type.

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

To search for deleted files using grep, you can use the following command:

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

grep -a -b -E -o -P '<file_signature>' <disk_image>
  • The -a option treats the disk image as a text file.

  • The -b option prints the byte offset of the matching pattern.

  • The -E option enables extended regular expressions.

  • The -o option prints only the matching part of the line.

  • The -P option enables Perl-compatible regular expressions.

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

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

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

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

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

Replace <file_signature> with the specific file signature you want to search for, and <disk_image> with the path to the disk image file.

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

By searching for file signatures within the unallocated space, you may be able to find deleted files that can provide valuable evidence during a forensic investigation.

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

git diff --no-index --diff-filter=A _openwrt1.extracted/squashfs-root/ _openwrt2.extracted/squashfs-root/

其他过滤器

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

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

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

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

参考资料

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

你在一家网络安全公司工作吗想要在HackTricks中宣传你的公司吗?或者你想要获取最新版本的PEASS或下载PDF格式的HackTricks吗?请查看订阅计划

通过向hacktricks repo hacktricks-cloud repo 提交PR来分享你的黑客技巧。


使用Trickest可以轻松构建和自动化由全球最先进的社区工具提供支持的工作流程。
立即获取访问权限:

{% embed url="https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks" %}