利用 SUID 二进制文件

LinuxBeginner
立即练习

简介

在 Linux 和基于 Unix 的系统中,文件权限是安全性的一个基本方面。SUID(Set Owner User ID,设置所有者用户 ID)位是一种特殊的权限类型。当二进制文件设置了 SUID 位时,它将以文件所有者的权限运行,而不是以运行该文件的用户权限运行。

虽然这对于某些合法的系统功能是必要的(例如 passwd 命令,它需要 root 访问权限来更新你的密码),但如果配置错误,它会成为严重的安全风险。如果系统管理员不小心在 find、vim 或 bash 等标准工具上设置了 SUID 位,攻击者就可以利用这些工具以 root 用户身份执行命令,从而导致完全的系统入侵,即权限提升(Privilege Escalation)。

SUID 的危险之处在于它改变了程序执行本身的权限上下文。如果程序随后可以启动其他命令或 shell,那么该权限就会向外泄露。

在本实验中,你将扮演一名安全研究员。你将扫描 Linux 文件系统以定位设置了 SUID 位的二进制文件,识别出易受攻击的错误配置,并使用著名的 GTFOBins 项目中的技术将你的权限提升为 root。

搜索 SUID 二进制文件 (find)

在这一步中,你将学习如何搜索 Linux 文件系统以查找设置了 SUID 权限位的二进制文件。

为了找到这些文件,我们使用内置的 find 命令。find 命令功能极其强大,允许我们根据特定的权限搜索文件。我们将从根目录 / 开始查找设置了 SUID 位(由八进制值 4000 表示)的文件。

枚举 SUID 文件是权限提升的一种标准习惯,因为它可以快速揭示那些代表普通用户执行且具有提升权限的程序。

在终端中运行以下命令来搜索 SUID 二进制文件,并将结果保存到项目目录中名为 suid_results.txt 的文本文件中:

find / -perm -4000 -type f 2> /dev/null > ~/project/suid_results.txt

让我们拆解一下这个命令,以便你准确理解它的作用。/ 告诉命令从文件系统的最顶层开始搜索。-perm -4000 标志专门查找设置了 SUID 位的文件。-type f 标志确保我们只查找常规文件,而不是目录。最后,2>/dev/null 是一个巧妙的技巧,它会将任何「权限被拒绝」(Permission denied)的错误消息丢弃到黑洞(/dev/null)中,从而保持输出的整洁。> 符号将整洁的输出重定向到我们的文本文件中。

现在,让我们查看刚刚创建的文件内容,看看哪些二进制文件设置了 SUID 位:

cat ~/project/suid_results.txt

你将看到类似以下的输出:

/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/openssh/ssh-keysign
/usr/bin/chfn
/usr/bin/find
/usr/bin/chsh
/usr/bin/passwd
/usr/bin/newgrp
/usr/bin/gpasswd
/usr/bin/su
/usr/bin/mount
/usr/bin/umount

仔细查看这个列表。其中许多文件,如 passwd 和 su,被设置为 SUID 位是预料之中的。然而,其中一个二进制文件显得非常不寻常,且具有潜在的危险性。

识别可利用的二进制文件 (GTFOBins)

在这一步中,你将分析搜索结果并确定哪个二进制文件可以被利用。

查看上一步的输出,你可能会注意到列表中的 /usr/bin/find。find 命令是一个用于搜索文件的标准工具,它在正常运行时绝对不需要 root 权限。它设置了 SUID 位是一个重大的安全配置错误。

这种判断非常重要。并非每个 SUID 二进制文件都是可利用的,但那些不寻常的文件值得特别审查,因为它们可能提供了设计者从未打算在提升权限下暴露的功能。

为了理解我们如何利用这一点,安全专业人员使用了一个名为 GTFOBins 的资源。GTFOBins 是一个精选的 Unix 二进制文件列表,可用于绕过配置错误系统中的本地安全限制。如果你访问 GTFOBins 网站并搜索「find」,你会发现 find 具有允许它执行其他命令的功能。

由于我们的 find 二进制文件设置了 SUID 位,它执行的任何命令都将以该二进制文件所有者(即 root)的权限运行。

为了确认你的发现,创建一个名为 vulnerable_binary.txt 的文件,并将可利用的二进制文件名称写入其中。运行以下命令:

echo "find" > ~/project/vulnerable_binary.txt

你可以通过在终端中打印该文件来验证其内容:

cat ~/project/vulnerable_binary.txt

输出应该仅仅是:

find

通过识别出这个错误配置,你已经找到了权限提升攻击的切入点。

构建利用命令

在这一步中,你将准备利用 find 二进制文件上的 SUID 错误配置所需的特定命令载荷(payload)。

根据 GTFOBins,find 命令有一个 -exec 参数。此参数通常用于对 find 找到的每个文件执行特定操作。然而,攻击者可以滥用此参数来执行系统 shell (/bin/sh)。

标准的利用载荷如下所示:find . -exec /bin/sh -p \; -quit。

让我们拆解一下为什么这个载荷有效。. 告诉 find 从当前目录开始查找。-exec 标志告诉它运行后面的命令。我们提供 /bin/sh 来启动一个 shell。-p 标志至关重要;它告诉 shell 保留启动时的权限(在本例中,即由 SUID 位授予的 root 权限)。\; 表示我们要执行的命令结束。最后,-quit 告诉 find 在执行一次命令后立即停止搜索,而不是对目录中的每个文件重复执行。

为了准备最终执行,让我们将此利用载荷保存到一个名为 exploit.sh 的 shell 脚本文件中。运行以下命令:

echo 'find . -exec /bin/sh -p \; -quit' > ~/project/exploit.sh

你可以查看刚刚创建的脚本,以确保载荷正确:

cat ~/project/exploit.sh

输出将显示你构建的载荷:

find . -exec /bin/sh -p \; -quit

现在,你已经拥有了诱导 find 二进制文件为你提供 root shell 所需的精确命令。

执行权限提升

在最后一步中,你将执行该利用程序,并证明你已成功将权限提升为 root 用户。

为了避免直接进入交互式 shell(在自动化实验环境中验证这一点可能比较困难),我们将稍微修改载荷,以 root 身份执行单个命令并保存输出。我们将使用 whoami 命令,它会打印当前有效用户的用户名。

运行以下命令,通过易受攻击的 find 二进制文件执行 whoami,并将输出重定向到名为 root_proof.txt 的文件中:

/usr/bin/find . -exec whoami \; -quit > ~/project/root_proof.txt

请注意,我们使用了绝对路径 /usr/bin/find 以确保我们执行的是之前识别出的特定二进制文件。find 命令运行,触发 -exec 标志,以 root 权限(得益于 SUID 位)执行 whoami,并保存结果。

现在,让我们检查证明文件的内容,看看利用是否成功:

cat ~/project/root_proof.txt

如果利用成功,输出将是:

root

恭喜!你已成功利用配置错误的 SUID 二进制文件以 root 用户身份执行命令。

如果你想体验获得实际的交互式 root shell,可以直接在终端中运行你在上一步中构建的载荷:

/usr/bin/find . -exec /bin/sh -p \; -quit

你的命令提示符将变为 # 符号,表明你现在正以 root 用户身份操作。你可以输入 exit 来离开 root shell 并返回到普通用户提示符。

总结

在本实验中,你成功学习了如何识别和利用 Linux 系统上的 SUID 错误配置。你首先使用 find 命令搜索设置了 SUID 权限位的二进制文件。在确定 /usr/bin/find 存在异常后,你学习了如何使用像 GTFOBins 这样的资源来发现利用载荷。最后,你构建并执行了一个命令,滥用了 find 二进制文件的 -exec 参数,从而允许你以 root 权限执行命令。

此练习强调了 Linux 中正确权限管理的重要性。系统管理员必须定期审计 SUID 二进制文件,以确保标准工具不会无意中为权限提升提供途径。