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

24 KiB
Raw Blame History

Linux 取证


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

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

从零开始学习 AWS 黑客技术,成为 htARTE (HackTricks AWS 红队专家)

其他支持 HackTricks 的方式:

初始信息收集

基本信息

首先,建议携带一个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 进程 通常具有较低的 PIDS因此如果你发现一个具有较大 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种格式

  • Raw每个段连续拼接在一起
  • Padded与raw相同但右侧位填充零
  • 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
<figure><img src="../../.gitbook/assets/image (3) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>

\
使用 [**Trickest**](https://trickest.com/?utm_campaign=hacktrics&utm_medium=banner&utm_source=hacktricks) 来轻松构建并**自动化工作流程**,这些工作流程由世界上**最先进**的社区工具提供支持。
立即获取访问权限:

{% 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"

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

检查自启动位置

计划任务

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.logMySQL日志文件记录每个调试、失败和成功消息包括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

示例

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
  • 审查已删除节点的日期时间戳,以查找大量文件在同一时间被删除,这可能表明恶意活动,如安装 rootkit 或木马化服务。
  • 由于节点是按下一个可用的基础分配的,大约在同一时间放置在系统上的恶意文件可能会被分配连续的节点。因此,定位到恶意软件的一个组件后,检查相邻节点可能会很有成效。
  • 还要检查像 /bin/sbin 这样的目录,因为新文件或修改文件的修改或更改时间可能很有趣。
  • 查看按创建日期而非字母顺序排序的目录中的文件和文件夹很有意思,以便查看哪些文件或文件夹是最新的(通常是最后的文件夹)。

您可以使用 ls -laR --sort=time /bin 检查文件夹中最新的文件
您可以使用 ls -lai /bin |sort -n 检查文件夹内文件的节点

{% hint style="info" %} 请注意,攻击者可以修改文件的时间以使文件看起来合法,但他不能修改节点。如果您发现一个文件显示它是在与同一文件夹中的其他文件同时创建和修改的,但节点异常地大,那么该文件的时间戳被修改了。 {% endhint %}

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

查找新增文件

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

查找修改过的内容

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

查找已删除的文件

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的最新版本或下载HackTricks的PDF吗?查看订阅计划

通过向hacktricks仓库hacktricks-cloud仓库提交PR分享您的黑客技巧


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

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