Linux 目录

/boot/ & /efi/

/boot/ 和 /efi/ 目录存储启动系统所需的基本文件。这包括启动配置文件、内核参数等。在这些目录中,还可以找到当前和之前的内核版本,以及初始 ramfs。

/etc/

/etc/ 目录传统上是系统级配置文件和相关数据的中央存储库。这些文件中的大多数以明文形式容易访问。配置文件通常带有以 .d 扩展名标记的关联目录,允许包含额外的配置片段。需要注意的是,位于用户 /home/ 目录中的用户特定配置文件可以优先于 /etc/ 中的系统级配置。

Purpose  用途 Path  路径 Description  描述
用户账户和密码 /etc/passwd 包含用户账户信息
用户账户和密码 /etc/shadow 密码哈希
组信息 /etc/group 用户组
系统配置 /etc/hostname 主机名
系统配置 /etc/hosts 本地DNS解析
系统配置 /etc/issue 登录前显示的文本
系统配置 /etc/issue.net 远程登录前显示的文本
系统配置 /etc/os-release 操作系统信息
网络配置 /etc/network/ , /etc/netplan/ , or /etc/NetworkManager/ 网络配置文件
网络配置 /etc/iptables//etc/iptables.rules 存储防火墙规则
服务与软件配置 /etc/cron.d//etc/cron.daily/ 计划任务(cron 作业)的配置。
服务和软件配置 /etc/sudoers 访问的配置。
系统日志 /etc/rsyslog.conf or /etc/syslog-ng/syslog-ng.conf 系统日志配置。
系统日志 /etc/logrotate.conf 日志轮转配置。
安全配置 /etc/security/ 与系统安全相关的配置文件。
安全配置 /etc/ssh/sshd_config SSH 服务器配置。
安全配置 /etc/pam.d/ 可插拔认证模块配置。
包管理 /etc/apt/ APT 包管理器(Debian/Ubuntu)的配置。
包管理 /etc/yum.conf and /etc/yum.repos.d/ YUM 软件包管理器(RHEL/CentOS)的配置。
主机名解析 /etc/resolv.conf DNS 解析器配置。
服务器配置 /etc/apache2//etc/nginx/ 标准 Web 服务器配置目录。
数据库配置 /etc/mysql/ MySQL 或 MariaDB 的配置文件。
数据库配置 /etc/postgresql/ PostgreSQL 的配置。
Shell 配置 ~/.bashrc~/.bash_profile~/.zshrc/etc 用户特定的 shell 配置文件可以在用户的家目录中找到,而全局的 shell 配置在 /etc 。
用户特定配置 /etc/skel/ 包含为新用户账户提供的默认文件和目录。

/tmp/

/tmp/ 目录用于临时存储文件。在某些 Linux 发行版中, /tmp/ 的内容可能会使用 tmpfs 虚拟内存文件系统存储在系统 RAM 中。在取证镜像中,使用 tmpfs 挂载 /tmp/ 的系统可能会显示为空。

/run/

/run/ 目录是一个位于 RAM 中的 tmpfs 挂载目录,在取证镜像上可能会为空。在运行中的系统上,该目录包含运行时信息,如 PID 和锁文件、systemd 运行时配置等。日志或配置文件中可能会引用 /run/ 中的文件和目录。

/home/ & /root/

/home/ 目录是用户主目录的默认位置。用户的主目录包含用户创建或下载的文件,包括配置文件、缓存、数据、文档、媒体、桌面内容以及其他用户拥有的文件。root 用户的主目录通常是 root 文件系统的 /root/ 。这些主目录对取证调查员来说非常重要,因为它们提供了有关系统人类用户的信息。用户主目录的创建时间戳可能表明用户账户何时首次被添加。

Purpose用途 Path路径 Description描述
用户文档和文件 /home/<username> 用户的个人文件,包括文档、图片、视频和其他数据,通常存储在子目录中。
浏览痕迹 ~/.mozilla/ and ~/.config/google-chrome/ Firefox 和 Chrome 网络浏览器用户配置文件的目录。这些目录可能包含浏览历史记录、书签和缓存文件。
浏览缓存文件 ~/.cache 浏览器为加快未来访问速度而存储的网页资源(如图片、脚本和样式表)的临时本地副本。
隐藏目录 ~/.<directory-name> like ~/.config~/.ssh 许多配置文件和目录以点开头,这些通常包含各种应用程序的设置和偏好。
桌面环境设置 ~/.config/ 用户特定的桌面环境(例如 GNOME、KDE)的设置可以在这个目录中找到。
历史记录 ~/.bash_history 用户的 Shell(例如 Bash)的命令历史记录存储在这个文件或类似位置。
邮件客户端 ~/.thunderbird/ Thunderbird 邮件客户端数据存储位置。
消息应用程序 ~/.config 消息数据可能存储在此目录或应用程序特定的目录中。
桌面环境日志 ~/.local/share or ~/.config 用户的桌面环境的日志和使用数据可以在这几个目录中找到。
访问和修改时间戳 /home/ 家目录中文件和目录相关的时间戳可以指示文件创建、修改或访问的时间。这些时间戳是文件系统的固有属性。
最近使用文件 ~/.local/share/recently-used.xbel 最近访问或类似文件的列表。
SSH 和 PGP 密钥 ~/.ssh/~/.gnupg/ SSH 和 PGP 密钥可以在这几个目录中找到。
系统日志 ~/.local 一些系统日志和已安装应用程序的日志可能存储在这个目录或其他隐藏目录中。
下载的文件 /home/<username>/Downloads 用户经常将文件下载到他们的目录中。
云存储同步 ~/.dropbox or ~/.config/google-drive-ocamlfuse 如果用户使用 Dropbox 或 Google Drive 等云存储服务,同步数据和配置设置可以在这些目录中找到。

/bin/、/sbin/、/usr/bin/和/usr/sbin/

可执行程序的标准位置是 /bin/ 、 /sbin/ 、 /usr/bin/ 和 /usr/sbin/ 。这些目录最初是为了将程序分组,分别供用户、管理员、启动过程或单独挂载的文件系统使用。如今, /bin/ 和 /sbin/ 通常会链接到 /usr/ 中的相应目录,在某些情况下, /bin/ 、 /sbin/ 和 /usr/sbin/ 也会链接到一个包含所有程序的 /usr/bin/ 目录。

/lib/ and /usr/lib//lib/ 和 /usr/lib/

/lib/ 目录在当今大多数 Linux 系统中通常符号链接到 /usr/lib/ 。这包括共享库代码(也适用于多个平台)、内核模块、编程环境支持(头文件)等。 /lib/ 目录还包含许多软件包的默认配置文件。

/usr/

/usr/ 目录包含系统大部分静态只读数据。这包括可执行文件、库、文档等。大多数 Linux 系统会将 /bin/ 、 /sbin/ 和 /lib/ 符号链接到 /usr/ 子目录中的对应文件。这里位于此处的、不属于任何已安装软件包的文件可能具有法证意义,因为它们是在正常软件安装过程之外添加的。这些可能是具有 root 访问权限的用户手动安装的文件,或者是恶意行为者放置的不授权文件。

/var/

/var/ 目录包含变化的系统数据(变量),并且通常在重启后仍然存在。 /var/ 下的子目录从取证角度来看特别有趣,因为它们包含日志、缓存、历史数据、持久临时文件、邮件和打印子系统等。

Purpose用途 Path路径 Description描述
系统日志 /var/log/ 这个目录包含记录各种系统事件和活动的系统日志,包括登录尝试、服务启动和系统错误。常见的日志文件包括 /var/log/auth.log 、 /var/log/syslog 和 /var/log/messages 。
包管理日志 /var/log/dpkg.log or /var/log/yum.log 这些日志记录了软件包的安装、更新和移除,可以提供有关系统软件变化的信息。
打印后台处理程序文件 /var/spool/cups/ 通用 UNIX 打印系统(CUPS)将打印作业信息存储在此目录中,可能揭示打印作业历史记录。
邮件服务器数据 /var/mail/ or /var/spool/mail/ 邮箱和与电子邮件相关的证据通常存储在这里。
数据库文件 /var/lib/ 像 MySQL 或 PostgreSQL 这样的数据库存储其数据文件和日志。
临时文件 /var/tmp/ and /var/run/ 临时文件和目录可能包含诸如非正常关机日志或已执行进程的残留物等证据。
cron 和计划任务 /var/spool/cron/crontabs/ 有关计划任务的详细信息可以在这类文件中找到,其中可能包括由 cron 作业执行的脚本和命令。
服务器日志 /var/log/apache2/ or /var/log/nginx/ 如果安装了 Web 服务器,访问和错误日志可以提供有关 Web 活动的洞察。
打印机日志 /var/log/cups/ 与打印机相关的日志。
DHCP 和网络日志 /var/log/ DHCP 客户端和服务器日志。
安全和认证数据 /var/log/secure or /var/log/auth.log 这些日志记录认证和安全相关的事件,包括登录尝试和 SSH 连接。
软件包缓存 /var/cache/apt/archives/ or /var/cache/yum/ 软件包缓存可能包含已下载的软件包文件,这些文件可能具有法证价值。
系统状态信息 /var/lib/misc/ 此目录可能包含系统状态信息,包括与网络和硬件相关的文件。
会话信息 /var/run/utmp and /var/log/wtmp 这些文件记录用户登录和注销会话。
内核日志 /var/log/kern.log or /var/log/dmesg 与内核相关的日志。
软件更新信息 /var/lib/update-notifier/package-data-downloads/ 此目录可能包含与软件更新相关的数据。

/dev/、/sys/ 和 /proc/

Linux 还有其他几个 tmpfs 和伪文件系统,在系统运行时看似包含文件,包括 /dev/ 、 /sys/ 和 /proc/ 。这些目录提供了设备或内核数据结构的表示,但内容实际上并不存在于普通文件系统中。在检查取证镜像时,这些目录可能是空的。

/media/

/media/ 目录用于存放动态创建的挂载点,用于挂载外部可移动存储设备,如 CD-ROM 或 USB 驱动器。在检查取证镜像时,此目录可能是空的。在日志、文件系统元数据或其他持久化数据中引用 /media/ 可能提供有关用户连接(已挂载)的外部存储设备的信息。

/opt/

/opt/ 目录包含附加包,这些包通常按供应商名称或包名称分组。这些包可能会创建一个自包含的目录树来组织它们自己的文件(例如, bin/ 、 etc/ 和其他常见子目录)。

/lost+found/

每个文件系统的根目录上可能存在一个 /lost+found/ 目录。如果运行文件系统修复(使用 fsck 命令),并且找到一个没有父目录的文件,该文件(有时称为孤儿文件)会被放置在 /lost+found/ 目录中,以便可以恢复。这些文件没有它们原始的名称,因为包含文件名的目录未知或缺失。

Linux持久化

计划任务

你可以使用 cron 作业来在特定时间或间隔安排任务。crontab 文件中的条目(例如 /etc/crontab,或使用 crontab -e 的每个用户的 crontab)可用于启动脚本或命令。

例如,你可以使用 crontab -l 来获取 crontab 数据:

1
2
3
linuxforensics@ubuntu:~$ crontab -l

0 2 * * /bin/sh backup.sh

SSH Authorized_keys

授权密钥文件,位于 ~/.ssh/.authorized_keys,指定了可用于登录该文件配置的用户账户的 SSH 密钥。

启动应用程序

许多 Linux 桌面环境,如 GNOME 和 KDE,允许用户通过图形设置配置启动应用程序。这些通常是用户特定的,可以通过桌面设置进行配置。

/etc/rc.local

这是一种在启动时运行自定义脚本的传统方法。/etc/rc.local 脚本在系统初始化结束时被执行。

Shell Profile 文件

您可以将命令添加到像 ~/.bashrc~/.bash_profile 或 ~/.profile 这样的 shell profile 文件中。这些命令将在用户每次登录时被执行。

自动启动目录

一些桌面环境使用自动启动目录来启动用户特定的应用程序。例如,在 GNOME 中,你可以将.desktop 文件放在 ~/.config/autostart/

服务管理工具

可以使用像 chkconfig 或 update-rc.d(用于 SysV Init)这样的工具来管理服务和它们的运行级别配置。

用户会话启动脚本

在某些情况下,您可能希望在用户会话开始时执行脚本或程序。您可以通过向适当的 shell 启动文件添加命令(例如 ~/.xprofile),或使用桌面环境的会话管理器来实现这一点。

常见的 Linux 日志机制

Linux 中有几种值得注意的日志机制:

  1. Syslog: Syslog 是一种标准的日志协议,用于收集和发送网络中的日志消息。Linux 系统通常使用 syslog 将日志数据存储在不同的日志文件中,这些文件通常位于 /var/log/ 目录。常见的日志文件包括 /var/log/messages/var/log/auth.log 和 /var/log/syslog。这些日志可以提供有关系统和应用程序活动的宝贵信息,例如失败的登录尝试或服务启动。
  2. Systemd Journal: Systemd,许多 Linux 发行版中常见的初始化系统,使用 systemd journal 进行日志记录。Journalctl 是用于查询和检查这些日志的命令行工具。与传统平面文本日志文件相比,该 journal 提供了结构化且更全面的信息,包括时间戳、进程 ID 和严重级别等元数据。
  3. Auditd: Linux 审计框架允许对系统活动进行详细监控,包括文件访问、进程创建和用户认证。Auditd 是用户空间组件,将其数据记录到 /var/log/audit/audit.log。这是一个强大的工具,用于跟踪变更和潜在的安全事件,常用于合规性较高的环境。
  4. SysmonForLinux: 这是一个类似于 Windows Sysmon 的工具,用于监控和记录系统活动,包括进程、网络连接和文件系统写入。SysmonForLinux 以 XML 格式将事件记录到 /var/log/syslog。它特别适用于端点检测与响应(EDR)场景。

Syslog

组件 描述
日志来源 支持 syslog 的程序
配置文件位置 /etc/rsyslogd.conf /etc/rsyslogd.d/conf /etc/syslog-ng/
守护进程 /usr/sbin/rsyslogd (由 systemd 启动的服务)
网络日志主机 UDP 端口 514(配置为@host)
本地日志文件 /var/log/* (按设施和严重程度)
例如,在基于 Debian 的系统上查看最近的 syslog 条目:
1
2
3
4
5
6
7
8
9
10
11
12
clubs@htb[/htb]$ tail -n 10 /var/log/syslog

Feb 26 15:45:01 ubuntu CRON[12345]: (root) CMD ( cd / && run-parts --report /etc/cron.hourly)
Feb 26 15:46:12 ubuntu systemd[1]: Started Time & Date Service.
Feb 26 15:47:23 ubuntu kernel: [ 1234.567890] eth0: link up
Feb 26 15:48:34 ubuntu sshd[67890]: Accepted publickey for john from 10.10.16.14 port 22 ssh2
Feb 26 15:49:45 ubuntu sudo: john : TTY=pts/0 ; PWD=/home/john ; USER=root ; COMMAND=/usr/bin/apt update
Feb 26 15:50:56 ubuntu apt[23456]: Updating package lists...
Feb 26 15:51:07 ubuntu systemd-logind[789]: New session 1 of user john.
Feb 26 15:52:18 ubuntu NetworkManager[890]: <info> [1234567890.123] dhcp4 (eth0): state changed unknown -> bound
Feb 26 15:53:29 ubuntu rsyslogd: [origin software="rsyslogd" swVersion="8.32.0" x-pid="7785" x-info="<https://www.rsyslog.com>"] rsyslogd was HUPed
Feb 26 15:54:40 ubuntu anacron[34567]: Job `cron.daily' terminated

该输出可以揭示未经授权访问或 cron 作业执行等模式。在取证中,我们经常使用 grep 等工具来过滤特定事件,例如 grep "Failed password" /var/log/auth.log ,以发现暴力破解尝试。

扩展到其他机制

在 Linux 取证中,也有一些常见的高级或专业日志选项:

  1. 内核环形缓冲区(dmesg):记录内核消息,如硬件检测或驱动问题,存储在一个环形缓冲区中。可通过 dmesg 命令或启动时的 /var/log/dmesg 访问。用于调查启动时异常或设备连接问题。
  2. 应用特定日志 : 许多服务维护自己的日志,例如 Apache (/var/log/apache2/access.log) 或 MySQL (/var/log/mysql/error.log)。这些日志提供了关于网络流量或数据库查询的详细信息,通常通过 logrotate 在 /etc/logrotate.d/ 中进行轮转。
  3. ELK Stack or Splunk Integration : 在企业环境中,日志会被转发到 Elasticsearch、Logstash、Kibana(ELK)或 Splunk 等集中式系统进行聚合和分析。检查 /etc/rsyslog.d/ 目录下的转发配置,以检测数据窃取或监控设置。

例如,要检查内核日志,我们可以使用以下命令:

1
2
3
4
5
6
7
clubs@htb[/htb]$ dmesg | tail -n 5

[12345.678901] usb 1-1: new high-speed USB device number 2 using xhci_hcd
[12345.789012] usb 1-1: New USB device found, idVendor=0781, idProduct=5581, bcdDevice= 1.00
[12345.890123] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[12345.901234] usb 1-1: Product: Ultra
[12345.912345] usb-storage 1-1:1.0: USB Mass Storage device detected

在调查日志时,应通过复制到取证镜像来保留原始文件。使用 Plaso 的 log2timeline 等工具创建超级时间线,将日志与文件时间戳关联起来。通过 /etc/logrotate.conf 进行日志轮转和压缩可能会隐藏旧事件,因此需要检查 /var/log/*.gz 中的归档文件。

Systemd Journal

可以使用 man systemd.journal-fields 来识别可用于搜索的字段:

可信日志字段 描述
_PID_UID_GID 日志条目来源进程的进程 ID、用户 ID 和组 ID,以十进制字符串格式显示。注意,通过 forked 进程的”stdout”或”stderr”获取的条目将包含父进程(该进程启动了与 systemd-journal 的连接)的有效凭证。
_COMM_EXE_CMDLINE 该日志条目所源自的进程的名称、可执行路径和命令行。
_CAP_EFFECTIVE= 该日志条目来源进程的有效功能(7)。
_AUDIT_SESSION_AUDIT_LOGINUID 该日志条目所源自进程的会话和登录 UID,由内核审计子系统维护。
_SYSTEMD_CGROUP=_SYSTEMD_SLICE=_SYSTEMD_UNIT=_SYSTEMD_USER_UNIT= 会话中的控制组路径、systemd 层级所有者 UID、systemd 切片单元名称、systemd 用户管理器中的单元名称(如果有)、systemd 用户单元或 systemd 会话的所有者 ID(如果有),以及 systemd 用户的所有者 UID。
_SELINUX_CONTEXT= 该进程的日志条目来源的 SELinux 安全上下文(标签)。

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
clubs@htb[/htb]$ journalctl --utc --since "2023-10-15 18:00:00" --until "2023-10-15 19:00:00" -D /home/linuxforensics/Desktop/cases/scenario1/collection/uploads/auto/var/log/journal/894062f9af204645a289e8016977fe6c/ -u httpd.service _PID=27804 -o json-pretty

{
"__CURSOR" : "s=abcdef1234567890;i=1234;b=567890abcdef1234;m=123456789;t=5f1234567890a;x=bcdef1234567890",
"__REALTIME_TIMESTAMP" : "1697383200000000",
"__MONOTONIC_TIMESTAMP" : "123456789",
"_BOOT_ID" : "567890abcdef1234",
"PRIORITY" : "6",
"_UID" : "0",
"_GID" : "0",
"_SYSTEMD_SLICE" : "system.slice",
"_MACHINE_ID" : "894062f9af204645a289e8016977fe6c",
"_HOSTNAME" : "ubuntu",
"SYSLOG_FACILITY" : "3",
"SYSLOG_IDENTIFIER" : "httpd",
"MESSAGE" : "Server started successfully",
"_TRANSPORT" : "journal",
"_PID" : "27804",
"_COMM" : "httpd",
"_EXE" : "/usr/sbin/httpd",
"_CMDLINE" : "/usr/sbin/httpd -DFOREGROUND",
"_CAP_EFFECTIVE" : "0",
"_SYSTEMD_CGROUP" : "/system.slice/httpd.service",
"_SYSTEMD_UNIT" : "httpd.service",
"_SYSTEMD_INVOCATION_ID" : "12345678-90ab-cdef-1234-567890abcdef"
}
<SNIP>

为增强取证分析,考虑导出日志进行离线审查。使用 journalctl -o export > journal.export 创建二进制导出文件,该文件可以在其他地方使用 journalctl --import journal.export 导入。为持久化存储,配置 /etc/systemd/journald.conf 设置 Storage=persistent,确保日志在重启后仍保存在 /var/log/journal/ 中。在调查中,结合过滤器进行目标搜索,例如使用 journalctl -u ssh.service -p err 查找 SSH 错误。像 journalctl --vacuum-time=2weeks 这样的工具可以清理旧条目,但在取证中应禁用此功能以保留数据。对于远程日志,在 journald.conf 中启用转发功能,通过 SystemLogSocket 将日志发送到中央服务器进行聚合。

Auditd

aureport

aureport 工具从审计日志文件生成摘要报告,将数据聚合为可读格式,如事件计数或用户活动摘要。默认情况下,它会查询 /var/log/audit/ 目录中的所有 audit.log 文件来创建报告。您可以使用 aureport 选项 -if file_name 命令指定不同的文件来运行报告。Aureport 通过处理审计日志文件(默认 /var/log/audit/audit.log)并使用选项来指定报告类型来工作,例如 -a 用于认证,-f 用于文件,或 -u 用于用户(例如 aureport -a 用于认证事件的摘要)。它可以按时间筛选(-ts/-te),解释数据(-i),并以适合进一步分析的格式输出,从硬编码的事件类别中提取数据,生成聚合统计数据,如成功/失败计数。

示例命令使用:

1
2
3
4
5
6
7
8
9
linuxforensics@ubuntu:~$ sudo aureport --input /home/linuxforensics/Desktop/cases/scenario1/collection/uploads/auto/var/log/audit/audit.log --login

Login Report
============================================
# date time auid host term exe success event
============================================
1. 02/26/2025 15:00:01 1000 ? /dev/pts/0 /usr/sbin/sshd yes 7050
2. 02/26/2025 15:01:12 0 ? /dev/pts/1 /bin/bash no 5678
<SNIP>
ausearch

Ausearch 用于调查审计追踪,通过搜索日志来查找特定事件,例如失败的登录或文件访问,这对于安全分析、调试以及在事件响应过程中重建行动序列至关重要。默认情况下,ausearch 搜索 /var/log/audit/audit.log 文件。您可以使用 ausearch 选项 -if file_name 命令指定不同的文件。在一个 ausearch 命令中提供多个选项,相当于在字段类型之间使用 AND 运算符,在相同字段类型的多个实例之间使用 OR 运算符。

这样的命令可能看起来像这样:

1
2
3
4
5
6
linuxforensics@ubuntu:~$ sudo ausearch -if /home/linuxforensics/Desktop/cases/scenario1/collection/uploads/auto/var/log/audit/audit.log -m ADD_USER -m DEL_USER -m ADD_GROUP -m USER_CHAUTHTOK -m DEL_GROUP -m CHGRP_ID -m ROLE_ASSIGN -m ROLE_REMOVE -i

----
time->Wed Feb 26 15:02:23 2025
type=USER_CHAUTHTOK msg=audit(1234567890.123:456): pid=12345 uid=0 auid=1000 ses=1 subj=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 msg='op=PAM:chauthtok acct="john" exe="/usr/bin/passwd" hostname=? addr=? terminal=pts/0 res=success'
<SNIP>

要列出所有 ausearch 选项,我们可以使用 man ausearch。完整的 Auditd 文档可以在这里找到 这里 。

审计日志基于文本但结构化,包含字段如 type=、msg=audit(timestamp:event_id):以及键值对(例如 pid=、uid=)。这种格式有助于解析;使用脚本或工具如 awk/grep 进行提取。对于高级分析,通过 audispd 插件转发日志以集成 ELK Stack。

通过规则扩展监控网络变化:

1
linuxforensics@ubuntu:~$ auditctl -a always,exit -F arch=b64 -S socket -k network_mod

在调查中,使用 chattr +i /var/log/audit/audit.log 使日志不可变以防止篡改。与 journalctl 或 syslog 关联以获得更全面的视图——例如,将 Auditd 的系统调用事件与 journal 时间戳进行匹配。

例如,进行状态检查:

1
2
3
4
5
6
7
8
9
10
linuxforensics@ubuntu:~$ sudo auditctl -s

enabled 1
failure 1
pid 1234
rate_limit 0
backlog_limit 8192
lost 0
backlog 0
loginuid_immutable 0 unlocked

SysmonForLinux

支持的事件
事件 ID 描述
1 记录新进程创建时的日志。
3 记录机器上的 TCP/UDP 连接。
4 记录 Sysmon 服务的状态(已启动或已停止)。
5 进程终止时的日志。
9 进程从驱动器执行读取操作时的日志。
11 记录文件创建或覆盖时的日志。
16 当本地 Sysmon 配置更新时的日志。
23 当文件被进程删除时的日志。
安装与配置

要安装 SysmonForLinux,为你的 Ubuntu 发行版添加微软的仓库:

1
2
3
4
5
6
7
cry0l1t3@ubuntu:~$ wget -qO- <https://packages.microsoft.com/keys/microsoft.asc> | sudo apt-key add - 

cry0l1t3@ubuntu:~$ sudo add-apt-repository "deb [arch=amd64] <https://packages.microsoft.com/ubuntu/$>(lsb_release -rs)/prod $(lsb_release -cs) main"

cry0l1t3@ubuntu:~$ sudo apt update && sudo apt install sysmonforlinux -y

cry0l1t3@ubuntu:~$ sudo sysmon -i sysmonconfig.xml # <- Start with this command for a custom config, or without for defaults

配置使用 XML 文件来过滤事件,例如:

1
2
3
4
5
6
7
<Sysmon schemaversion="4.90">
<EventFiltering>
<ProcessCreate onmatch="exclude">
<Image>/bin/ls</Image>
</ProcessCreate>
</EventFiltering>
</Sysmon>

我们可以使用以下方式更新配置:

1
linuxforensics@ubuntu:~$ sudo sysmon -c newconfig.xml

SysmonLogView

SysmonLogView 旨在提升 Linux 系统上 Sysmon 日志输出的可用性。它主要用于将 Sysmon 生成的 XML 格式事件日志(/var/log/syslog)转换为更易于人类阅读的结构化文本格式,使我们能够更轻松地解析、分析和排错系统活动,而无需处理原始 XML 的杂乱信息。它通过从标准输入(stdin)读取 syslog 数据,并将处理后的过滤输出写入标准输出(stdout)来工作,从而可以轻松集成到管道或脚本中,用于实时监控或批量处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
linuxforensics@ubuntu:~$ sudo /opt/sysmon/sysmonLogView -h

SysmonLogView v1.0 - Converts Sysmon syslog XML to human readable form
Sysinternals - www.sysinternals.com
By Kevin Sheldrake
Copyright (C) 2021 Microsoft Corporation

Usage:
sysmonLogView [<options>]
-e Only display events with matching eventID. Specify comma-separated list
of eventIDs and/or multiple -e switches.
-r Only display events within the specified range of recordIDs. Specify
min,max. If min is missing, start from the beginning; if end is missing,
continue to end.
-t Only display events within the specified time stamps. Specify start,end.
Time format is YYYY-MM-DD HH:MM[:SS[.nnn]] where nnn is milliseconds.
If start is missing, start at beginning; if end is missing, continue to
the end.
-f For events that have a particular field, only display events that match
the given value (case sensitive). e.g. '-f Image=/bin/touch'
-E Only display the specified fields for the specified event. Specify
<eventID>=<comma-separated list of fields>. Can use multiple times.
-X Print a blank link between events.
-h Display this help.
-? Display this help.

Supply input data on standard input; writes to standard output. By default all
events are displayed but switches can be used to only display certain events,
and to only display certain fields within the events that are displayed.

Wrap arguments in quotes (e.g. "<argument>") if argument contains spaces.

Typical usage:
sudo tail -f /var/log/syslog | sudo /opt/sysmon/sysmonLogView
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
linuxforensics@ubuntu:~$ cat /home/linuxforensics/Desktop/cases/HacktiveLegion_15102023/ubuntu/var/log/syslog | sudo /opt/sysmon/sysmonLogView

UtcTime: 2023-10-15 18:00:01.234
ProcessGuid: {ff032593-1234-5678-90ab-cdef12345678}
ProcessId: 12345
Image: /bin/bash
CommandLine: bash script.sh
CurrentDirectory: /home/john
User: john
LogonGuid: {00000000-0000-0000-0000-000000000000}
LogonId: 1000
TerminalSessionId: 1
IntegrityLevel: Medium
Hashes: SHA256=abcdef1234567890
ParentProcessGuid: {ff032593-8765-4321-09ba-fedcba987654}
ParentProcessId: 67890
ParentImage: /usr/sbin/sshd
ParentCommandLine: sshd: john [priv]
<SNIP>
取证技巧

在调查中,将日志管道传输到像 jq 这样的工具进行类似 JSON 的解析: grep "sysmon" /var/log/syslog | jq . 。通过配置 rsyslog 将 Sysmon 事件转发到 SIEM(例如,ELK)。通过 /etc/logrotate.d/syslog 旋转日志以保留历史记录。但是,你需要确保 eBPF 支持内核 4.18+。你可以使用 sysmon -? config 测试配置。

例如,过滤进程创建:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
linuxforensics@ubuntu:~$ sudo tail -f /var/log/syslog | grep "EventID>1" | sudo /opt/sysmon/sysmonLogView -f EventID=1

Event SYSMONEVENT_CREATE_PROCESS
RuleName: -
UtcTime: 2025-11-03 15:20:20.326
ProcessGuid: {7df8f1a8-c834-6908-fd04-c48d09560000}
ProcessId: 5047
Image: /usr/bin/sudo
FileVersion: -
Description: -
Product: -
Company: -
OriginalFileName: -
CommandLine: sudo /opt/sysmon/sysmonLogView
CurrentDirectory: /home/linuxforensics
User: root
LogonGuid: {7df8f1a8-0000-0000-0000-000002000000}
LogonId: 0
TerminalSessionId: 6
IntegrityLevel: no level
Hashes: SHA256=7d3c2983ad2f278d9e799b5792f13f57bf890bd3b03d10b36e53bf0b6677895e
ParentProcessGuid: {7df8f1a8-c73a-6908-0def-0fa03e560000}
ParentProcessId: 5018
ParentImage: /usr/bin/bash
ParentCommandLine: bash
ParentUser: root
<SNIP>

您也可以将 SysmonForLinux 与 Auditd 结合使用,以获得更全面的覆盖范围。SysmonForLinux 在进程/网络事件方面表现优异,而 Auditd 负责处理系统调用。此外,使用 SysmonLogView 您可以将日志导出为 CSV 格式进行分析: sysmonLogView -csv output.csv < syslog

内存获取

使用 AVML 的内存转储

最简单的工具是 AVML,它不需要在目标系统上进行任何编译。要获取内存镜像,只需以 root 权限运行它并提供文件名即可。

1
2
3
4
5
clubs@htb[/htb]$ sudo ./avml memdump.mem

Acquiring memory...
Progress: 100% (4.0 GB / 4.0 GB)
Memory acquisition complete. File saved as memdump.mem

使用 LiME 进行内存转储

对于允许使用内核模块的环境,LiME 提供了通过 TCP 转储内存或转储到本地文件的多项灵活选项。首先,在类似系统(匹配内核版本)上使用 make 编译该模块,然后将 .ko 文件传输到目标系统。使用 insmod 加载它,并指定输出格式。

1
2
3
4
clubs@htb[/htb]$ sudo insmod lime.ko "path=tcp:4444 format=lime"

# On the collection host:
clubs@htb[/htb]$ nc -l -p 4444 > memory.lime

这种方法适用于远程获取数据而不写入目标磁盘,从而降低了覆盖证据的风险。

内存分析

vol3

1
2
linuxforensics@ubuntu:~$ git clone https://github.com/volatilityfoundation/volatility3.git
linuxforensics@ubuntu:~$ pip install -r requirements.txt
插件 描述 命令
linux.pslist 通过遍历内核的任务列表列出所有运行进程,显示 PID、PPID、命令名称和启动时间等详细信息。可用于识别隐藏或恶意的进程。 python3 vol.py -f memdump.mem linux.pslist
linux.bash 从 bash shell 中恢复命令历史,通过扫描进程内存中的历史结构,即使日志被清除也能揭示已执行的命令。 python3 vol.py -f memdump.mem linux.bash
linux.sockstat 列出所有进程的网络连接,包括套接字、协议(TCP/UDP)、本地/远程地址以及相关联的进程。适用于检测未经授权的网络活动或后门。 python3 vol.py -f memdump.mem linux.sockstat
linux.psaux 列出进程及其命令行参数。 python3 vol.py -f memdump.mem linux.psaux
linux.pstree 显示进程树,展示父子关系以可视化进程层次结构并发现异常,如孤立的进程。 python3 vol.py -f memdump.mem linux.pstree
linux.lsmod 列出加载的内核模块,有助于检测注入内核中的 rootkit 或恶意驱动程序。 python3 vol.py -f memdump.mem linux.lsmod
linux.lsof 显示每个进程的打开文件,包括文件描述符、类型(例如,普通文件、套接字)和路径,可用于在事件期间跟踪文件访问。 python3 vol.py -f memdump.mem linux.lsof
linux.envvars 从进程中提取环境变量,这可能揭示配置细节、路径或敏感数据,如 API 密钥。 python3 vol.py -f memdump.mem linux.envvars
linux.malfind 扫描进程内存,通过检测具有可执行权限但没有映射文件的区域,查找可疑代码注入或隐藏的恶意软件。 python3 vol.py -f memdump.mem linux.malfind
linux.check_syscall 验证系统调用表的完整性,以检测 rootkit 的钩子或修改。 python3 vol.py -f memdump.mem linux.check_syscall
linux.elfs 列出所有进程的内存映射的 ELF 文件。 python3 vol.py -f memdump.mem linux.elfs
linux.mountinfo 列出进程挂载命名空间中的挂载点。 python3 vol.py -f memdump.mem linux.mountinfo
linux.proc 列出所有进程的内存映射。 python3 vol.py -f memdump.mem linux.proc

额外的插件如 linux.ifconfig(网络接口)、linux.mount_cache(挂载的文件系统)和 linux.pidhashtable(进程 ID 哈希表枚举)可提供更深入的系统状态洞察。你可以串联插件或使用自动化工具进行综合分析,例如结合 linux.pslist 和 linux.malfind 来调查可疑进程。

使用 Volatility 进行内存分析

首先我们需要确定获取内存镜像的系统内核版本。我们可以使用 volatility 模块的 banners 功能。

1
2
3
4
5
6
7
8
9
linuxforensics@ubuntu:~$ cd /tools/volatility3
linuxforensics@ubuntu:~/tools/volatility3$ python3 vol.py -q -f ~/Desktop/cases/HacktiveLegion_15102023/memdump.mem banners.Banners

Volatility 3 Framework 2.5.2

Offset Banner

0x60dd97e0 Linux version 5.15.0-84-generic (buildd@lcy02-amd64-005) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #93~20.04.1-Ubuntu SMP Wed Sep 6 16:15:40 UTC 2023
<SNIP>