介绍如何进行Linux进程分析,涵盖的内容包括进程分析、启动项检查、计划任务分析、服务管理和应用工件分析。通过使用一系列命令和工具,系统管理员可以有效地检测和分析系统中的各类活动,确保系统的稳定性和安全性。以下是对TryHackMe Linux Process Analysis房间的学习记录以及具体的分析内容和使用的命令。
1. 进程排查
在Linux中,进程是程序的运行实例。当在Linux中执行程序或命令时,操作系统会创建一个进程来运行该程序。每个进程都有其唯一标识符,称为进程 ID ( PID )
进程可以具有父子关系,形成层次结构。当一个进程生成另一个进程时(例如,当一个 shell 会话在子 shell 中生成另一个进程时),新进程将成为创建它的进程的子进程,称为其父进程。
1.1 查看系统进程(ps)
ps
:列出当前终端会话相关的进程信息。默认情况下,它显示与当前(活动运行)控制台会话相关的进程的信息,但它也可用于收集系统范围和其他用户的进程信息。该实用程序通过读取/proc
虚拟文件系统中的文件来检索此信息,虚拟文件系统是与正在运行的系统上的每个进程相对应的分层目录结构。
PID: | 每个进程的唯一标识符(进程 ID)。 |
---|---|
TTY: | 与该进程关联的终端。 |
TIME: | 该进程消耗的累计CPU时间。 |
CMD: | 与该过程关联的命令。 |
- ps相关命令
ps -aux
:显示所有用户的所有进程。ps -u [user]
:显示指定用户的进程。ps -eFH
:以分层格式显示所有进程,选择所有进程-e
,以 extra full 格式返回结果-F
,并显示进程层次结构(树)-H
。
1.2 列出打开文件(lsof)
lsof
列出系统中所有打开的文件及其关联进程。
- lsof相关命令
lsof
:显示所有打开的文件。lsof -u [user]
:显示指定用户的打开文件。
1.3 查看进程树(pstree)
pstree
:以树的形式直观地显示进程,显示进程之间的父子关系。
- pstree相关命令
pstree -p
:显示每个进程及其PID。pstree -s [PID]
:显示指定进程的父进程树。
1.4 实时监控进程(top)
top
:动态显示系统进程信息,按CPU或内存使用率排序。
top -d 5 -c -u janice
参数 -u 指定用户;-d动态更新时间,单位秒/s;-c显示完整的命令路径。
- top相关命令
top
:top -u [user]
:显示指定用户的进程。top -d [seconds]
:设置刷新间隔时间。
2. 计划任务
2.1 枚举计划任务
Cronjobs 是计划任务守护进程按照预定义的时间间隔自动执行的计划任务。
计划任务守护进程是一个后台进程,负责根据配置文件(称为 crontabs)管理 cronjobs。
用户可以将自己的 crontab 文件存储在目录中/var/spool/cron/crontabs
。
主 crontab 文件/etc/crontab
管理整个系统的 cronjobs。
这个注释说明了每个字段的含义:
- 第一个字段是分钟(0-59)。
- 第二个字段是小时(0-23)。
- 第三个字段是月份中的日期(1-31)。
- 第四个字段是月份(1-12 或 jan,feb,mar,apr ...)。
- 第五个字段是星期几(0-6,其中 0 和 7 表示星期日)。
- 第六个字段是用户名,表示以哪个用户的身份执行命令。
- 第七个字段是要执行的命令。
17 * * * * root cd / && run-parts --report /etc/cron.hourly
- 时间:每小时的第 17 分钟。
- 用户:root
- 命令:
cd / && run-parts --report /etc/cron.hourly
。该命令首先切换到根目录,然后运行/etc/cron.hourly
目录中的所有脚本,并生成报告。
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
- 时间:每天早上 6:25。
- 用户:root
- 命令:
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
。该命令首先检查/usr/sbin/anacron
是否存在并且可执行,如果不存在,则切换到根目录并运行/etc/cron.daily
目录中的所有脚本,并生成报告。
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
- 时间:每周日早上 6:47。
- 用户:root
- 命令:
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
。该命令首先检查/usr/sbin/anacron
是否存在并且可执行,如果不存在,则切换到根目录并运行/etc/cron.weekly
目录中的所有脚本,并生成报告。
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
- 时间:每月的第 1 天早上 6:52。
- 用户:root
- 命令:
test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
。该命令首先检查/usr/sbin/anacron
是否存在并且可执行,如果不存在,则切换到根目录并运行/etc/cron.monthly
目录中的所有脚本,并生成报告。
*/5 * * * * root /var/tmp/backup
- 时间:每 5 分钟执行一次。
- 用户:root
- 命令:
/var/tmp/backup
。该命令运行/var/tmp/backup
脚本或命令。
2.2 查看系统级计划任务
/etc/crontab:系统 cronjobs 的主要存储库。管理员可以在此文件中配置需要提升权限的任务,通常以 root 用户身份执行命令。
上面的内容/etc/crontab
显示了用于执行命令的默认 shell 和路径变量。在下面,我们可以看到一个 cronjob 条目:
*/5 * * * * root /var/tmp/backup
通过阅读上面的语法,我们可以确定该/var/tmp/backup
文件将以 root 身份每五分钟执行一次。这*/5
是 cron 语法中指定每五分钟执行一次的方法。
这一发现立即引起了人们的怀疑,因为系统级 cronjob 在目录中以 root 权限执行命令/var/tmp
。这是一个全球可写的目录,这意味着任何用户都可以修改或替换backup
正在执行的文件。这可能是攻击者滥用的错误配置来提升权限,或者是攻击者在获得系统 root 访问权限后创建的持久性方法。
额外的系统 cronjob 目录。这些目录位于/etc/
具有以下命名约定的目录下:
- /etc/cron.hourly/ — 每小时运行一次的系统 cronjobs。
- /etc/cron.daily/ — 每天运行一次的系统 cronjobs。
- /etc/cron.weekly/ — 每周运行一次的系统 cronjobs。
- /etc/cron.monthly/ — 每月运行一次的系统 cronjobs。
- /etc/cron.d/ — 额外的自定义系统 cronjobs。
2.3查看用户级计划任务
/var/spool/cron/crontabs/:用户在系统上配置的各种用户级 cronjobs。用户级 cronjobs 特定于单个用户配置文件,并且独立于系统范围的 cronjobs 进行管理。每个有权使用 cron 的用户都会在这个目录中拥有自己的文件,并以他们的用户名命名。
有几种方法可以枚举这些信息。最简单的方法是使用 sudo-privileges 列出目录的内容:
如上面的输出所示,系统上的多个用户已经配置了用户级 cronjobs。
单独查看这些文件的内容(使用cat
)或者可以使用 命令crontab
。此命令可以管理、创建或查看用户级 cronjobs。
-u
参数可用于指定特定用户的 cron 配置,
-l
参数可用于显示 cronjobs 的内容。
如上面的输出所示,我们发现了执行绑定 shell 的特定 cronjob abzkd83o4jakxld.sh
。
- /etc/crontab:查看系统的计划任务。
cat /etc/crontab
:查看系统范围的计划任务配置。ls /etc/cron.*
:列出系统级计划任务目录。
- /var/spool/cron/crontabs/:查看用户级计划任务
sudo ls -al /var/spool/cron/crontabs
/:枚举用户及计划任务
- crontab:管理和查看用户级计划任务。
crontab -l
:列出当前用户的计划任务。crontab -u [user] -l
:列出指定用户的计划任务。
此外,系统级/etc/crontab
crontab 与用户级 crontab 不同。系统级 crontab 将包含一个附加字段,指定运行命令的用户(即root或www-data)。
2.3 检查计划任务日志(Cron)
Cron 日志记录由 cron 守护程序管理的计划任务的执行情况,并提供按时间顺序排列的 cron 作业执行时间记录,以及任何相关输出或错误消息。从取证的角度来看,这些日志对于发现 cron 作业的执行痕迹非常有用,并有助于发现可疑活动或系统入侵。例如,假设恶意行为者滥用现有 cron 作业或创建恶意 cron 作业并试图掩盖其踪迹。在这种情况下,日志可能会揭示不寻常的执行模式或正在运行的意外命令。
在基于 Debian 的系统上,cron 执行日志通常存储在 中/var/log/syslog
。此文件汇总系统日志,包括来自 cron 守护程序的消息。在某些Linux发行版中,例如 Red Hat Enterprise Linux (RHEL) 和 CentOS,这些日志可以在恰当命名的 中找到/var/log/cron
。
我们可以查看grep
内容并过滤与 cron 相关的任何日志:
- syslog:查看计划任务执行的日志。
grep cron /var/log/syslog
:过滤出与计划任务相关的日志信息。
3. 服务管理
在 Linux 中,服务是指持续运行的各种后台进程或守护进程,执行管理系统资源、提供网络服务或处理用户请求等任务。其他常见服务包括用于SSH (sshd) 或 Apache HTTP Server (httpd)。通常,服务是使用系统的服务管理实用程序(systemd或init)进行配置的。
3.1 列出系统服务(systemctl)
systemctl
是Linux中用于控制systemd以及管理和查看systemd服务。systemd 是基于 Unix 的系统中的服务管理实用程序。因此,systemd 负责管理Linux系统上的启动进程、服务和守护进程,并systemctl
让我们直接管理这些服务。
我们可以使用 执行许多操作systemctl
,包括:
systemctl start <service> |
启动指定的服务。 |
---|---|
systemctl stop <service> |
停止指定的服务。 |
systemctl restart <service> |
重新启动指定的服务。 |
systemctl enable <service> |
使指定的服务在启动时自动启动。 |
systemctl disable <service> |
禁止指定服务在启动时自动启动。 |
systemctl status <service> |
显示指定服务的状态(例如,活动、非活动、失败)。 |
我们还可以使用systemctl
以下语法来迭代和查询系统上的所有服务:
- systemctl
systemctl list-units --all --type=service
:列出所有服务。systemctl list-units --type=service --state=running
:列出正在运行的服务。
在大多数情况下,返回的服务看似无害。但是,我们无法确定,输出显示了一个名为b4ckd00rftw.service`的服务,进入查看。
3.2 查看服务状态
现在我们已经确定了一个可疑的服务,我们可以使用它systemctl
来查询服务的状态、元数据和其他配置,以更好地了解该服务正在做什么。
要查询服务的状态,我们可以使用以下命令:
sudo systemctl status b4ckd00rftw.service
在上面的输出中,我们获得了有关b4ckd00rftw服务的大量详细信息。我们可以看到它处于活动和正在运行状态,以及服务上次启动时的时间戳。
该命令还返回了主PID值,该值标识了此服务的主进程及其关联的可执行文件 ( b4ckd00rftw.sh )。进一步,我们通过CGroup(控制组)字段获得了有价值的信息,该字段返回了从此服务生成的两个进程。
第一个过程显示服务可执行脚本的绝对路径(/usr/local/bin/b4ckd00rftw.sh
),第二个过程显示它每 60 秒持续运行一次(sleep 60
)。
现在我们知道了此服务启动时执行的二进制文件,我们可以进一步调查脚本的内容:查看与后门服务关联的可执行文件
cat /usr/local/bin/b4ckd00rftw.sh
通过剖析该脚本中的命令,我们可以确定它会创建一个名为b4ckd00rftw的具有 sudo 权限的新用户,然后休眠 60 秒,然后无限期地重复该过程。
从该脚本的内容来看,很明显这是另一种持久性机制,入侵该系统的攻击者配置该机制,即使执行了初始响应操作(例如删除后门用户),也能保持对系统的未经授权的访问。
- systemctl status
systemctl status [service]
:查看指定服务的状态。
3.3查看服务配置文件
服务配置文件(在基于 systemd 的Linux发行版中通常称为单元文件)对于管理和定义服务非常重要。这些文件为 systemd 提供了控制服务行为所需的信息,包括其启动行为、依赖项、环境变量等。在上一节中,我们使用命令systemctl status
列出了后门服务的配置数据。通过查询服务的状态,系统从单元文件中读取以收集此信息。
如果我们知道单元文件的位置(通常在目录中),我们可以直接读取它/etc/systemd/system/
。但是,当我们直接查询服务状态时,我们得到的是单元文件的绝对路径:/etc/systemd/system/b4ckd00rftw.service
。我们可以使用以下命令读取文件:
查看后门服务单元文件
cat /etc/systemd/system/b4ckd00rftw.service
如上所示,我们收到的信息与查询服务状态时收到的信息类似。值得注意的是,该ExecStart
值为我们提供了服务启动时执行的脚本或二进制文件的绝对路径。
3.4检查服务日志
- journalctl:查看systemd日志。
journalctl -u [service]
:查看指定服务的日志。journalctl -f -u [service]
:实时查看指定服务的日志。
服务日志文件包含有关系统上服务所生成的活动、状态和错误的宝贵信息。这些日志对于分析师在事件期间调查服务时非常有用。从 systemd 日志(systemd 日志服务)查询和查看服务日志的最简单方法是通过命令journalctl
。
为了实时查看特定服务(即后门服务)的日志,我们可以运行以下命令:
查看后门服务日志
sudo journalctl -f -u b4ckd00rftw.service
要退出此输出,可以按Ctrl
+ C
。
在上面的输出中,显示与b4ckd00rftw.service单元相关的新日志条目。如输出所示,我们收到了有关服务执行的各种操作的一些详细信息,例如**useradd**命令(它是我们之前调查的服务二进制文件的一部分),以及相关的时间戳。
请注意,如果您不想实时跟踪日志,可以省略该-f
参数。
4. 启动项检查
自动启动脚本,是系统启动或用户登录时自动执行的脚本或命令。
这些脚本通常用于自动启动某些程序或命令,而无需在登录时进行手动干预。
用户特定的自动启动脚本与 cronjobs 和服务不同,因为它们是专门为在系统启动或用户登录时运行任务而定制的,而不是像 cronjobs 那样按预定间隔运行或像服务那样连续运行。
它们对于自动执行各种应用程序或实用程序的初始化过程至关重要,可确保基本组件无需手动干预即可启动和运行。Linux系统中一般有两种类型的自启动脚本:
4.1 系统自动启动脚本
系统自动启动脚本这些脚本在操作系统启动时、用户登录前执行。它们通常位于/etc/init.d/
、/etc/rc.d/
或等目录中/etc/systemd/system/
。系统范围的自动启动脚本通常用于启动系统服务或守护进程,类似于上一个任务中介绍的单元文件。
4.2 识别系统自动启动脚本
/etc/init.d/:查看SysV init脚本。此目录通常包含传统 SysV init 系统中的系统服务管理脚本,主要负责启动、停止、重新启动和管理系统服务。
每个脚本对应一个特定服务,并遵循标准化的命名约定。例如,您可能会找到诸如 、 或 之类的脚本apache2
,mysql
它们ssh
分别控制Apache Web 服务器、MySQL 数据库服务器和 OpenSSH 服务器。这些脚本通常用 Bash 或其他 shell 脚本语言编写。
/etc/systemd/system/:查看systemd单元文件。此目录与 systemd init 系统相关,该系统已成为许多现代Linux发行版中的默认 init 系统。它们指定与服务相关的各种参数和操作,例如其依赖项、启动行为、环境变量等。
例如,我们可以识别b4ckd00rftw.service
中的单元文件/etc/systemd/system/b4ckd00rftw.service
,这是调查潜在恶意或更改的服务的另一种方法。
- /etc/init.d/
ls /etc/init.d/
:列出所有SysV init脚本。
- /etc/systemd/system/
ls /etc/systemd/system/
:列出所有systemd单元文件。
4.3 用户自动启动脚本
用户特定的自动启动脚本这些脚本在用户登录其帐户时执行。它们通常位于~/.config/autostart/
或等目录中~/.config/
(在各个子目录下)。用户特定的自动启动脚本通常用于在登录时启动用户特定的程序或应用程序。
- ~/.config/autostart/:查看用户级自动启动脚本。
ls -a /home/*/.config/autostart
:列出所有用户的自动启动脚本。
4.4 识别用户自动启动脚本
许多桌面环境将自动启动脚本放在用户的主目录中。因此,它们可能是针对用户的恶意软件的藏身之处。访问其他用户的主目录通常需要提升权限,例如使用sudo
或su
命令。
〜/ .config /autostart/:自动启动脚本的语法通常采用文件形式.desktop
,即具有特定格式的纯文本文件。例如,假设用户想要在登录 Linux 桌面时自动启动一个自定义脚本来设置他们的开发环境。他们编写了一个名为 的 shell 脚本setup_dev_env.sh
,位于他们的主目录中,该脚本更新必要的依赖项、设置环境变量并启动他们的 IDE 和代码编辑器应用程序。为了自动执行此过程,他们可以在其中创建一个包含以下内容的.desktop
文件:~/.config/autostart/
示例 .desktop 文件
[Desktop Entry]
Type=Application
Name=Setup Development Environment
Exec=/bin/bash -c "/home/eduardo/setup_dev_env.sh"
更详细地分解此文件的重要语法:
- [Desktop Entry]:这是指示桌面自动启动文件的标准文件头。
- Name=Setup Development Environment:自动启动项的名称。
- Exec=/bin/bash -c "/home/eduardo/setup_dev_env.sh":启动时执行的命令。这里使用Bash
/bin/bash -c
执行脚本。setup_dev_env.sh
在进行此类调查时,我们应该快速列出系统上所有用户的自动启动脚本。一旦我们识别出任何条目,我们就应该进一步分析它们,看看它们正在执行什么脚本或命令。为此,我们可以运行以下命令:
枚举用户自动启动脚本
ls -a /home/*/.config/autostart
从上面的输出中,我们识别出几个条目。具体来说,Janice的主目录keygrabber.desktop
下的内容很有趣。要查看自动启动条目的内容,我们可以访问以下文件:cat
查看 Janice 的自动启动脚本
cat /home/janice/.config/autostart/keygrabber.desktop
分析完配置脚本后,可以肯定这是另一种持久性方法。具体来说,该脚本使用curl
Exec 条目下的命令向外部 URL 发出 POST 请求。
然而,/home/janice/.ssh/id_rsa
正通过 POST 请求发送到服务器。该id_rsa
文件是 Janice 的私有SSH密钥,任何拥有该密钥的人都可以以 Janice 的身份连接到主机。
此配置表明,在启动时,它将执行 curl 命令,将 Janice 的SSH私钥(id_rsa 文件)的内容发送到攻击者控制的端点。
其他应该调查的用户相关配置文件包括:
- ~/.bash_history:此文件包含用户在 Bash shell 中执行的命令的历史记录,提供有关他们的活动和执行的命令的见解。
- ~/.ssh:此目录包含与 SSH 相关的文件,包括用户的SSH密钥(id_rsa、id_rsa.pub)、known_hosts 和 authorized_keys。
- ~/.profile:此文件通常包含用户特定的初始化命令和其 shell 环境的设置,与自动启动脚本类似,可能包含恶意命令。
- 每日消息 (MOTD)虽然每日消息不是直接由用户配置的文件,但它是用户通过 SSH 或串行连接连接到Linux服务器时显示给用户的消息。Linux系统在和目录中包含几个默认的 MOTD 文件。与自动启动脚本一样,攻击者可以创建恶意的 MOTD 文件,每次用户通过执行后门脚本或命令连接到系统时,这些文件都会被保留在目标上。
/etc/update-motd.d/
/usr/lib/update-notifier/
5. 应用工件分析
5.1 编辑器工件
应用程序工件分析的第一步是确定系统上安装了哪些应用程序或程序。这可以通过运行命令来实现dpkg -l
。此命令将列出所有已安装的软件包及其版本:
列出所有 dpkg 安装的软件包
sudo dpkg -l
Vim:是一款流行的文本编辑器,在.viminfo
文件它包含有关 Vim 会话内用户交互的重要信息。例如,可以检测到对存储在 Vim 中的脚本或配置文件的修改,从而揭示攻击者可能进行的未经授权的访问或篡改。
此外,存储的命令历史记录.viminfo
提供了用户执行的命令的按时间顺序的记录,可以作为重建用户活动的宝贵资源。
为了快速列出存储在主目录下的所有.viminfo
文件,我们可以运行以下命令查找 .viminfo 文件
find /home/ -type f -name ".viminfo" 2>/dev/null
总而言之,上述命令.viminfo
从主目录 ( /home
) 开始搜索名为的文件。2>/dev/null
是一种常用的方法来抑制搜索过程中可能出现的任何错误消息并为我们提供干净的输出。
如上所示,我们.viminfo
在系统上发现了两个文件。
查看 Janice 的 .viminfo 文件
sudo cat /home/janice/.viminfo
如上面的输出所示,该文件默认存储了几组信息,包括 Vim 版本、编码、最新搜索模式、命令行历史记录等。
其他文本编辑器工件.nano_history
包括Nano或Emacs.emacs
等。.emacs.d
- Vim
find /home/ -type f -name ".viminfo"
:查找所有.viminfo
文件。cat /home/[user]/.viminfo
:查看指定用户的.viminfo
文件。
5.2 浏览器工件
安装在系统上的 Web 浏览器(例如 Mozilla Firefox 和 Google Chrome)会生成一些可供用户行为和活动的痕迹。这些痕迹包括浏览器历史记录、下载日志和存储的 Cookie。分析浏览器历史记录和下载日志可以揭示用户访问过的网站、下载的文件以及访问过的潜在恶意 URL。
例如,Firefox将用户数据组织在配置文件目录中,通常位于 中~/.mozilla/firefox/
。
Chrome通常将用户配置文件(历史记录、网络数据、登录数据库等)存储在 中~/.config/google-chrome/
。
与我们使用的方法类似,我们可以使用此命令.viminfo
快速列出工作站文件夹中的浏览器目录:/home
查找浏览器工件目录
sudo find /home -type d \( -path "*/.mozilla/firefox" -o -path "*/.config/google-chrome" \) 2>/dev/null
如上面的输出所示,我们已经确定了浏览器伪影的两个潜在位置。
查看Eduardo的 Firefox 目录:/home/eduardo/.mozilla/firefox
列出 Firefox 配置文件
sudo ls -al /home/eduardo/.mozilla/firefox
如上所述,有两个配置文件:lwvdnf29.default和niijyovp.default-release.default文件与旧配置相关,因此我们可以将精力集中在.default-release文件上。
Dumpzilla 是一款非强大的工具。可以解析来自各种网络浏览器的数据,并允许我们以简化的方式分析浏览历史记录、书签、下载日志和其他相关工件。由于浏览器配置文件可能包含潜在的敏感数据(如 cookie 和密码),因此我们必须使用 sudo 以提升的权限读取配置文件。我们可以运行以下语法来提取可以从 Eduardo 的配置文件中提取的数据摘要:
使用 Dumpzilla.py
sudo python3 /home/investigator/dumpzilla.py /home/eduardo/.mozilla/firefox/niijyovp.default-release --Summary --Verbosity CRITICAL
在上面的输出中,该配置文件有几个我们可以提取的书签、cookie 和历史记录。通过运行该--Help
参数,我们可以列出可用的提取选项。其中一些最有用的包括:
Dumpzilla.py 示例选项
--Addons
--Search
--Bookmarks
--Cookies
--Downloads
--History
使用 Dumpzilla.py 提取书签
sudo python3 /home/investigator/dumpzilla.py /home/eduardo/.mozilla/firefox/niijyovp.default-release --Bookmarks
- Firefox
find /home -type d -path "*/.mozilla/firefox"
:查找Firefox配置文件目录。ls -al /home/[user]/.mozilla/firefox
:列出指定用户的Firefox配置文件。
- Chrome
find /home -type d -path "*/.config/google-chrome"
:查找Chrome配置文件目录。ls -al /home/[user]/.config/google-chrome
:列出指定用户的Chrome配置文件。
6. 实时监控工具
6.1 Pspy
Pspy是一款功能强大的开源工具,用于监控Linux进程,无需 root 权限。它旨在捕获和显示有关正在运行的进程的实时信息,包括其执行命令、用户 ID、进程 ID (PID)、父进程 ID (PPID)、时间戳和其他相关详细信息。它通过直接从/proc
虚拟文件系统读取数据来运行,无需修改系统文件或要求提升权限即可实时洞察进程活动。
只需运行 即可调用pspy64
。它将开始实时监控,可以按 停止它Ctrl + C
:
- Pspy:监控进程活动,不需要root权限。
./pspy64
:启动Pspy并实时监控进程活动。