TyrHackMe的Linux File System Analysis房间主要是对被入侵的基于 Linux 的 Web 服务器进行文件系统和操作系统分析。发现 Web 服务器中存在潜在的文件上传漏洞,为远程攻击者创建了执行任意命令(远程代码执行)和获得未经授权访问的途径,主要在Blue Team视角下对Linux系统的入侵排查和应急响应的了解。
此次的目标如下:
-
为了练习使用该命令的技能,请找到用户bob
find
在过去 1 分钟内创建的所有文件。找到后,查看其内容。您收到的标志是什么? -
从文件中提取元数据
reverse.elf
。文件的 MIME 类型是什么? -
stat
针对/etc/hosts
受感染 Web 服务器的文件运行该命令。完整的修改时间戳 (mtime)值是什么? -
调查系统上的用户账户。攻击者创建的后门账户名称是什么?
-
组 ID 为46的组名称是什么?
-
查看
/etc/sudoers
受感染系统上的文件。Jane 可以以 sudo 身份运行的二进制文件的完整路径是什么? -
查看 Jane 的
.bash_history
文件。你在输出中看到什么标志? -
Bob 的主目录中隐藏的标志是什么?
-
stat
对 Jane 的文件运行该命令authorized_keys
。最近一次修改的完整时间戳是多少? -
在受感染的主机上运行该
debsums
实用程序以仅检查配置文件。哪个文件被修改了? -
md5sum
攻击者创建了什么二进制文件来将权限提升到 root? -
在受影响的系统上运行chkrootkit
.sh
。检测到的文件的完整路径是什么? -
在受影响的系统上运行rkhunter。检查结果是什么
(UID 0) accounts
?
文件、权限、时间戳
查看/var/www/html/uploads/文件下发现可疑文件 pthml
查看文件内容发现了php一句话木马, 说明攻击者可能已经通过远程执行命令建立了更隐蔽的连接。
目前确定的是此木马文件为www用户,查找属于www用户的其他文件,以确定攻击者可能利用其新获得的访问权限做了什么。
还有一种方法就是通过grep对结果进行过滤,当查看文件时发现为php的一句话木马。说明用户可能已经通过此木马执行了其他系统命令,建立了其他隐藏的后门。
攻击者经常会针对有写权限的目录来上传恶意文件,常见的可写目录包括:
- /tmp:临时目录所有用户都可写,因此它是一种常见的选择。
- /var/tmp:另一个临时目录,通常具有世界写权限。
- /dev/shm:共享内存文件系统,通常所有用户都可以写入。
通过find命令来查找其他www用户的文件
find / -user www-data -type f 2>/dev/null | less
此命令将从根/ 查找所有者为www用户的文件,其中 -type -f :参数为 只查找文件,不包括目录,链接等
dev/null
:- 这是重定向错误输出的部分。
2
表示标准错误输出,>/dev/null
表示将错误输出重定向到/dev/null
,即丢弃错误信息。 - 这样做的目的是避免在查找过程中因权限问题而产生的错误信息显示在终端中,保持输出的整洁。
- 这是重定向错误输出的部分。
| less
:- 管道符
|
用于将前一个命令的输出传递给后一个命令。 less
是一个分页查看器,允许你逐页查看输出内容。使用less
可以方便地滚动查看大量输出结果,按q
键退出查看模式。
- 管道符
通过find命令查看,发现了/var/www/html/assets/下存在可疑文件reverse.elf
其他find的使用方法。
find / -group GROUPNAME 2>/dev/null |
检索特定组拥有的文件和目录的列表。 |
---|---|
find / -perm -o+w 2>/dev/null |
检索所有可在全球范围内写入的文件和目录的列表。 |
find / -type f -cmin -5 2>/dev/null |
检索过去五分钟内创建或更改的文件列表。 |
请注意,每个命令后面都会跟着一条命令来2>/dev/null
清理输出,以抑制可能由于权限而出现的任何错误消息。
元数据
元数据是指描述文件的嵌入信息,它能洞悉文件的特征、来源和属性。元数据可以包括各种类型的信息,例如文件创建日期、作者详细信息、组成和文件类型。
在对系统执行实时分析时,元数据对于确定特定文件的来源和修改时间戳以及在某些情况下的作者详细信息非常有用。
Exiftool是一个基于 Perl 的命令行实用程序,具有通过解析文件头和嵌入的元数据结构来提取和更改文件元数据的广泛功能。
通过exiftool查看文件的元数据信息,可以详细的查看文件的类型、大小、权限、架构,甚至修改和访问时间戳等信息。
exiftool /var/www/html/assets/reverse.elf
分析校验和
校验和是使用加密哈希函数(例如MD5或SHA-256)从数据生成的唯一值。这些函数会生成表示数据的固定大小的字符串,因此即使数据发生微小变化也会导致校验和明显不同。
校验和通常用于数据完整性验证,确保数据未被更改或损坏。对于事件响应者来说,它们还可用于根据已知签名识别恶意文件和可执行文件。
我们可以利用两个有用的校验和实用程序来检查我们之前确定的文件的哈希值分别是md5sum和sha256sum。
分别执行md5sum /var/www/html/assets/reverse.elf 和 sha256sum /var/www/html/assets/reverse.elf 校验哈希值
一旦我们获得了哈希值,我们就可以将它们提交给VirusTotal等恶意软件检测服务进行进一步分析。这样做后,我们会发现各种供应商将此文件标记为Meterpreter反向 shell 有效负载的证据。这项分析表明,攻击者reverse.elf
使用其初始RCE放置并执行了该文件,以实现与 Web 服务器的交互式反向 shell 连接。
时间戳
时间戳是与文件或事件相关的附加元数据,用于指示特定操作发生的时间。时间戳是事件响应和取证活动中跟踪文件和目录的创建、修改和访问时间的最重要方面之一。这些时间戳在取证调查中非常有用,因为它们提供了有关事件顺序和在系统上执行的操作的重要线索,并有助于建立时间线。
在基于Unix的系统中,通常记录三种主要的时间戳:
- 修改时间戳 (mtime):此时间戳反映文件内容上次修改或更改的时间。每当文件被写入或更改时,其mtime都会更新。
- 更改时间戳 (ctime):此时间戳表示文件元数据上次更改的时间。元数据包括权限、所有权或文件名本身等属性。每当与文件相关的任何元数据发生更改时,其ctime都会更新。
- 访问时间戳 (atime):此时间戳表示上次访问或读取文件的时间。每当打开文件时,其atime都会更新。
可以使用 ls -al查看文件的修改时间戳(*mtime ):*
ls -l /var/www/html/assets/reverse.elf
要查看同一个文件的变化时间戳(*ctime ),我们可以运行:*
ls -lc /var/www/html/assets/reverse.elf
要查看文件的访问时间戳(*atime ),我们可以运行:*
ls -lu /var/www/html/assets/reverse.elf
如上所述,文件的访问时间戳 ( atime ) 很容易在我们执行调查操作时无意中更新。当我们使用*ExifTool查看元数据或使用*md5sum或sha256sum分析其校验和时,我们对 执行了读取操作reverse.elf
,从而改变了其访问时间。这是实时取证分析中需要考虑的重要概念,这就是为什么事先获得受影响系统的可靠备份和副本至关重要。因此, atime对我们来说不是一个可靠的指标。
我们也可以利用该stat
命令快速查看所有三个时间戳:
stat /var/www/html/assets/reverse.elf
用户和组
识别用户帐户
在类 UNIX 系统中,/etc/目录是存储配置文件和系统范围设置的中心位置。具体来说,在调查用户帐户时,它/etc/passwd
是一个以冒号分隔的纯文本文件,其中包含系统帐户及其属性的列表,例如用户 ID ( UID )、组 ID (GID)、主目录位置以及为用户定义的登录 shell。
让我们通过读取文件来查看受影响系统上的用户帐户:
cat /etc/passwd
攻击者可以通过创建具有 root 权限的后门用户来维持对系统的访问。我们可以利用cut
和grep
命令快速识别此类用户帐户后门。以下命令提取并显示所有用户 ID ( UID ) 为 0 的用户帐户。除合法的 root 用户帐户外,如果存在UID为0 的用户,则可以快速表明存在潜在的后门帐户。
cat /etc/passwd | cut -d: -f1,3 | grep ':0$'
在上面的命令中,首先显示/etc/passwd的内容。然后,我们获取内容并执行操作cut
以从每行中仅提取第一个(用户名)和第三个(用户 ID)字段,-d
以:
字符 分隔。然后,我们使用该grep
命令提取包含 的特定条目:0
,表示用户 ID 为 0。
然而,这并不是万无一失的方法,因为后门账户可能是用合法的用户和组 ID 创建的。为了进一步调查,我们可以看看组。
识别组
在Linux系统中,某些组会授予特定权限,攻击者可能会利用这些权限来提升权限。攻击者可能感兴趣的一些重要Linux组包括:
- sudo或wheel:sudo(或 wheel)组的成员有权使用 sudo 以提升的权限执行命令。
- adm:adm 组通常具有对系统日志文件的读取权限。
- shadow:shadow 组与管理用户身份验证和密码信息有关。拥有此成员资格的用户可以读取
/etc/shadow
包含系统上所有用户的密码哈希的文件。 - 磁盘:磁盘组的成员在系统内部具有几乎不受限制的读取和有限的写入访问权限。
我们可以通过读取文件来查看系统上的所有组(及其各自的组 ID)/etc/group
:
cat /etc/group
要确定特定用户是哪些组的成员,我们可以运行以下命令:
# 确定investigator是那些组的成员
groups investigator
要列出特定组的所有成员,我们可以运行以下命令:
# 列出adm组的所有成员 如果多个用户在一个组中,他们的用户名将以逗号分隔的格式列在条目中。
getent group adm
要列出sudo组中的所有用户,我们可以提供名称“sudo”或组 ID,通常为27。
getent group 27
用户登录和活动
检查用户登录和活动对于实时分析受感染系统非常有用。
最后登陆
last
命令用于检查用户登录和会话。它用于显示最后登录用户的历史记录。它通过读取文件来工作/var/log/wtmp
,该文件包含系统上的每个登录和注销活动。同样,lastb
通过读取的内容来专门跟踪失败的登录尝试/var/log/btmp
,这有助于识别登录和密码攻击。
last
lastlog
该lastlog
命令关注用户最近的登录活动并从/var/log/lastlog
文件中读取。
登录尝试失败
除了 之外lastb
,还有其他方法可以通过特定的日志文件查看Linux上的失败登录尝试。该/var/log/auth.log
文件(或/var/log/secure
在某些发行版(如 CentOS 或 Red Hat)上)包含与身份验证相关的事件记录,包括成功和失败的登录尝试。
WHO
该who
命令是一个非常简单的命令,可用于显示当前登录到系统的用户。此命令的输出可以提供详细信息,例如登录用户的名称、使用的终端设备、会话建立的时间、空闲活动、shell 的进程 ID 以及其他注释,其中可能包括用于启动会话的初始命令等详细信息。
sudo
/etc/sudoers
文件是类 Unix 系统中特别敏感的配置文件。它确定哪些用户拥有 sudo 权限,使他们能够以其他用户(通常是 root 用户)的身份执行命令。
因此,它可能成为持久性的攻击者的目标。例如,如果攻击者能够找到一种方法将其用户帐户(或他们控制的帐户)插入 sudoers 文件,他们就可以授予自己提升的权限而无需身份验证。或者,他们可能会修改现有条目以扩大其访问权限。
例如,sudoers 文件中的一行可能如下所示:
sudo cat /etc/sudoers
更具体地说,此行指定:
- richard是被授予 sudo 权限的用户名。
- ALL表示该权限适用于所有主机。
- (ALL)指定用户可以以任何用户身份运行该命令。
/sbin/ifconfig
是特定二进制文件的路径,在本例中为 ifconfig 实用程序。
通过此配置,Richard 可以ifconfig
根据需要以提升的 sudo 权限执行来管理网络接口。
用户目录和文件
用户主目录
Linux中的用户主目录包含个性化设置、配置和用户特定数据。这些目录通常位于目录下,/home
并以系统上相应的用户名命名。
我们可以用一个简单的命令列出主目录ls -l /home
:
隐藏文件
隐藏文件(文件名以点开头)通常存储用户主目录中的敏感配置和信息。默认情况下,无法通过ls查看隐藏文件,需要加上 -a参数
比如,要列出 Jane 主目录中的隐藏文件:
ls -a /home/jane
同时还需要一些常见文件:
- .bash_history:此文件包含用户的命令历史记录,可用于显示用户以前执行过的命令。
- .bashrc和.profile:这些是分别用于定制用户 Bash shell 会话和登录环境的配置文件。
此外,我们还可以查看其他比较敏感的文件和目录,如浏览器配置文件和.ssh
目录。
SSH和后门
authorized_keys
是一个易受攻击的区域,其中包含与SSH连接.ssh
相关的配置和密钥文件。目录中的文件至关重要,因为它列出了允许通过SSH 连接到用户帐户的公钥。如果恶意用户获得对系统的未经授权的访问权限,并希望通过将其公钥添加到文件来持续访问另一个用户的帐户(例如,Jane 的帐户)
我们可以运行一个ls -al
来列出所有/home目录下的文件并查看用户jane的.ssh目录ls -al /home/jane/.ssh,再对authorized_keys进行查看cat /home/jane/.ssh/authorized_keys
如上图所示,有两个条目。第一个条目属于 Jane,如结尾注释所示。但是,第二个条目似乎与注释为“backdoor”的完全不同的密钥对有关。攻击者很可能附加自己的公钥在此文件,从而以 Jane 的身份进行SSH访问。
我们可以通过stat
命令进行确认。可以看到它最后一次修改的时间与我们确认攻击者在系统上获得初始立足点的时间大致相同。
根据上面的ls -al
命令的输出,我们可以识别导致这种情况的权限配置错误。
根据第三个rw
权限,该文件是全球可写的,而敏感文件绝不应如此。因此,通过利用这种错误配置,攻击者可以像 Jane 一样获得对系统的未经授权的SSH访问权限。
文件 /home/jane/.ssh/authorized_keys
是一个普通文件,不是目录或链接。
文件的权限设置为 rw-rw-rw-
,意味着所有用户(包括文件所有者、所属组和其他用户)都有读取和写入权限。这种权限设置通常是不安全的,特别是对于 SSH 授权文件。
二进制文件和可执行文件
识别可疑二进制文件
我们可以find
在基于UNIX的系统上使用命令来快速发现文件系统内的所有可执行文件:
find / -type f -executable 2> /dev/null
从根目录开始递归遍历文件系统并列出它找到的任何可执行文件。请注意,这会提供大量输出。因此,通过附加参数限制搜索范围通常是一个好主意。
一旦我们确定了想要进一步调查的可执行文件或二进制文件,我们就可以像以前一样执行元数据分析,使用校验和对其执行完整性检查或检查其人类可读的字符串和原始内容。
字符串
该strings
命令对于从二进制文件中提取人类可读的字符串非常有用。这些字符串有时可能包括函数名称、变量名称,甚至是嵌入在二进制文件中的纯文本消息。分析这些信息可以帮助响应者确定二进制文件的用途以及是否涉及任何潜在的恶意活动。
strings example.elf
debsums
debsums
命令,用于验证已安装包文件的完整性。它会自动将从 Debian 包安装的文件的 MD5 校验和与存储在包元数据中的已知校验和进行比较。
如果任何文件已被修改或损坏,将指出软件包的完整性可能存在问题。这对于检测系统软件包中的恶意修改和完整性问题很有用。
使用 debsums 扫描软件包
# -e:参数仅执行配置文件检查 -s:抑制错误消息输出
sudo debsums -e -s
二进制权限
SetUID (SUID) 和 SetGID (SGID) 是 Unix 操作系统中的特殊权限位。这些权限位会改变可执行文件的行为,允许它们以文件所有者或组的权限运行,而不是以执行文件的用户的权限运行。
如果系统上的二进制文件或可执行文件被错误地配置了 SUID 或 SGID 权限集,攻击者可能会滥用该二进制文件,通过合法但无意地使用该二进制文件来突破受限(无特权)shell。例如,如果 PHP 二进制文件包含 SUID 位以作为 root 运行,攻击者很容易滥用它通过 PHP 的系统 exec 函数以 root 身份运行系统命令。
在Linux系统上识别 SetUID (SUID) 二进制文件涉及检查文件权限并明确查找设置了 SetUID 位的可执行文件。
可以通过find
命令来检索系统上的 SetUID 二进制文件的列表:
# 查找系统中具有 SUID(Set User ID)权限的所有文件,并将错误输出重定向到 /dev/null
find / -perm -u=s -type f 2>/dev/null
1.find /:
- 在根目录 /及其所有子目录中搜索文件。这意味着整个文件系统都将在搜索范围内。
2. -perm -u=s:
- -perm`是 `find` 命令的一个选项,用于指定文件权限。
- -u=s`指定查找具有 SUID 位的文件。SUID(Set User ID)权限允许用户以文件所有者的权限执行该文件。这个选项查找那些用户位设置了 SUID 位的文件。
3. `-type f`:
- 只查找文件,不包括目录、链接等。
4. 2>/dev/null:
- 这是重定向错误输出的部分。2 表示标准错误输出,>/dev/null 表示将错误输出重定向到 /dev/null,即丢弃错误信息。
上述命令查找用户权限设置了 SUID 位的文件(-u=s
)。
这里的大部分输出都是预期的,但是,其中两个结果存在问题。首先,永远不应授予 Python SUID 权限,因为将权限提升到所有者很容易。
此外,或目录中的任何 SUID 二进制文件都很/tmp
引人注目/var/tmp
,因为这些目录通常可由所有用户写入,并且未经授权在这些目录中创建 SUID 二进制文件会带来显著的风险。
我们可以通过查看 Jane 的 bash 历史记录来进一步调查任何与 Python 或 bash 相关的命令:
sudo cat /home/jane/.bash_history | grep -B 2 -A 2 "python"
从输出中,我们发现 Jane 的用户帐户使用该find
命令识别 SUID 二进制文件并滥用 Python 二进制文件上的 SUID 权限以 root 用户身份运行系统命令。
通过这种级别的命令执行,攻击者能够创建/bin/bash
二进制文件(Bas的副本并将其放入文件/var/tmp
夹中。此外,攻击者将此文件的所有者更改为 root 并为其添加了 SUID 权限(chmod +s
)。
在制作 的 SUID 副本后/bin/bash
,攻击者通过运行 提升为 root 权限/var/tmp/bash -p
。我们可以通过对bash的原始文件执行完整性检查来进一步验证
对可疑 SUID 二进制文件进行完整性检查,校验哈希值:
investigator@MACHINE_IP:~$ md5sum /var/tmp/bash
7063c393************d3b340f1ad2c /var/tmp/bash
investigator@MACHINE_IP:~$ md5sum /bin/bash
7063c393************d3b340f1ad2c /bin/bash
上面的输出表明两个二进制文件是相同的,进一步确认了我们对攻击者升级到 root 权限的行为。
rootkit检测
rootkit 是一种恶意工具或软件,旨在获取系统管理员级别的控制权,同时不被系统或用户发现。术语Rootkit源于root(Unix 系统中最高级别的用户)和 kit(通常指用于维持此访问权限的一组工具)。
Rootkit 尤其危险,因为它们可以隐藏在系统中,让攻击者可以长期访问而不被发现。攻击者还可以利用它们在目标上进行其他恶意活动、泄露敏感信息或远程命令和控制受感染的系统。
但是,我们可以使用基于UNIX的系统上的一些自动化工具来帮助检测和删除rootkit。
Chkrootkit
Chkrootkit(检查 Rootkit)用于检查文件系统中的 Rootkit。它以shell 脚本的形式运行,利用常见的Linux二进制文件(如grep
和)strings
扫描核心系统程序以识别签名。它可以使用文件、目录和进程的签名来比较数据并识别已知 Rootkit 的常见模式。由于它不进行深入分析,因此它是用于首次检查以识别潜在危害的绝佳工具,但它可能无法捕获所有类型的 Rootkit。
此外,现代 rootkit 可能会故意尝试识别和定位chkrootkit程序的副本或采用其他策略来逃避检测。
Chkrootkit 示例
investigator@MACHINE_IP:~$ sudo chkrootkit
如上图所示,运行chkrootkit后发现了存在/var/tmp/目录下的可疑文件
Rkhunter
RKHunter(Rootkit Hunter)是另一个有用的工具,旨在检测和删除类 Unix 操作系统上的 rootkit。与chkrootkit相比,它提供了更全面、功能更丰富的 rootkit 检测检查。RKHunter可以将核心系统文件的 SHA-1 哈希与其数据库中已知的良好文件进行比较,以搜索常见的 rootkit 位置、错误权限、隐藏文件和内核模块中的可疑字符串。它是对受影响系统进行更全面评估的绝佳选择。
由于 rkhunter 利用了已知 rootkit 签名的实时数据库,因此在现场运行之前检查数据库更新 ( rkhunter --update
) 至关重要。由于此系统是隔离的,我们无法在此处运行数据库更新,但在将我们的工具安装到系统之前已获取最新版本。
要使用rkhunter执行简单扫描,我们可以运行以下命令:
# -sk:绕过用户交互提示
investigator@MACHINE_IP:~$ sudo rkhunter -c -sk
以上是对Linux文件系统取证分析的基本探索。主要包括了检查系统日志、用户和文件结构以及rootkit的基本检查,这只是Linux下应急响应和入侵排查的基础。