简介
在 Linux 系统中,sudo 命令允许标准用户以其他用户(通常是 root 管理员)的安全权限执行程序。系统管理员经常配置 /etc/sudoers 文件,允许特定用户以 root 身份运行某些命令而无需输入密码。这通常是为了方便起见,例如允许开发人员重启 Web 服务器或在全系统范围内搜索文件。
这里的安全教训是:sudo 规则本质上是一种委托信任。如果被委托的二进制文件比管理员预想的更强大,那么该规则实际上可能授予用户一个 shell,而不仅仅是执行某项安全操作。
然而,这些本意良好的管理快捷方式可能会引入严重的安全漏洞。如果允许用户运行具有执行其他命令或生成 shell 能力的二进制文件(如 find、vim 或 awk),攻击者就可以滥用此权限跳出受限命令,并获得完整的 root shell。这种技术通常被称为「shell 转义」或「GTFOBins」利用。
在本实验中,你将扮演一名安全审计员。你将枚举当前用户的 sudo 权限,识别出一个配置错误的授权二进制文件,并利用它将你的权限提升至 root。
检查 Sudo 权限 (sudo -l)
在这一步中,你将学习如何枚举分配给当前用户账户的 sudo 权限。
在评估 Linux 系统的权限提升机会时,首要检查之一就是查看当前用户可以以 root 身份运行哪些命令。sudo 命令提供了一个内置标志 -l(list),用于显示调用用户被允许和禁止的命令。
这是一项高优先级的检查,因为 sudo 配置错误可以提供直接、低门槛的提权路径,几乎不需要猜测。
为了记录我们的发现,我们将把该命令的输出重定向到项目目录中的一个文本文件中。
运行以下命令以列出你的 sudo 权限并将输出保存到名为 sudo_privs.txt 的文件中:
sudo -l > /home/labex/project/sudo_privs.txt
现在,让我们查看刚才创建的文件内容以分析权限:
cat /home/labex/project/sudo_privs.txt
你应该会看到类似以下的输出:
Matching Defaults entries for labex on this host:
env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin\:/snap/bin
User labex may run the following commands on this host:
(root) NOPASSWD: /usr/bin/find
某些环境除了 find 规则外,可能还会显示额外的 sudo 条目。对于本实验,请关注明确允许 labex 以 root 身份运行 /usr/bin/find 且无需密码 (NOPASSWD) 的那一行。该特定配置正是我们在后续步骤中要利用的目标。
分析允许的二进制文件以进行 Shell 转义
在这一步中,你将分析 /usr/bin/find 二进制文件,以了解如何滥用它来执行任意命令。
find 命令是一个强大的工具,用于在目录层次结构中搜索文件和目录。然而,它包含一个非常灵活的参数,称为 -exec。-exec 标志允许用户对 find 找到的每个文件执行指定的命令。
问题不在于 find 本身是恶意的,而在于它功能过于强大。如果缺乏严格限制,任何具有 root 执行能力的强大二进制文件都可能成为 shell 转义的候选对象。
当 find 通过 sudo 执行时,关键的安全漏洞就会出现。如果 find 以 root 身份运行,那么传递给 -exec 参数的任何命令也将以 root 身份执行。
让我们通过使用 -exec 参数运行 whoami 命令来测试这一理论。whoami 命令仅打印当前用户的有效用户名。我们将把输出重定向到一个文件,以验证我们的执行上下文。
执行以下命令:
sudo find . -exec whoami \; -quit > /home/labex/project/whoami.txt
让我们拆解一下这个命令。sudo find . 部分以 root 身份运行 find 命令,从当前目录 (.) 开始搜索。-exec whoami \; 段告诉 find 执行 whoami 命令,其中 \; 是终止 -exec 语句所必需的。最后,-quit 标志指示 find 在处理完第一个匹配项后立即退出,这可以防止它为目录中的每个文件多次运行 whoami。
现在,检查输出文件的内容:
cat /home/labex/project/whoami.txt
你应该会看到以下输出:
root
这证实了传递给 -exec 的命令已成功以 root 权限执行。
使用 Sudo 执行二进制文件
在这一步中,你将利用 -exec 漏洞来访问通常仅限于 root 用户使用的敏感系统文件。
Linux 系统中最敏感的文件之一是 /etc/shadow。该文件包含系统中所有用户账户的加密密码哈希值。标准用户没有该文件的读取权限。如果攻击者能够读取此文件,他们就可以尝试离线破解密码哈希。
既然我们已经证明可以使用 sudo find 以 root 身份执行任意命令,我们就可以利用这种技术来读取 /etc/shadow 的内容。
我们将在 -exec 语句中使用 head 命令来仅读取 shadow 文件的第一行(通常包含 root 用户的哈希值),并将其保存到我们的项目目录中。
运行以下命令:
sudo find /etc/shadow -exec head -n 1 {} \; -quit > /home/labex/project/shadow_head.txt
在此命令中,{} 充当占位符,find 会将其替换为当前正在处理的文件名(在本例中为 /etc/shadow)。
通过读取输出文件,验证你是否成功提取了敏感信息:
cat /home/labex/project/shadow_head.txt
你应该会看到类似以下的输出,显示了 shadow 文件中 root 用户的条目:
root:*:19711:0:99999:7:::
你已经通过滥用配置错误的 sudo 条目成功绕过了文件系统权限。
生成 Root Shell
在这一步中,你将采取最终行动,通过生成一个 root shell 来实现对系统的完全控制。
虽然读取敏感文件很危险,但权限提升的最终目标是获得一个以 root 身份运行的交互式 shell。这赋予了攻击者对整个系统的无限制访问权限。
为了实现这一点,我们不需要向 -exec 参数传递像 whoami 或 head 这样的简单命令,而是可以传递 shell 可执行文件的路径,例如 /bin/bash。
在现实场景中,攻击者会运行 sudo find . -exec /bin/bash \; -quit 直接进入交互式 root 终端。然而,为了适应本自动化实验环境,进入交互式 shell 会暂停实验的执行。
相反,我们将使用 -c 标志以非交互模式生成一个 root bash shell。这允许我们将命令直接传递给新的 root shell,执行它,并保存我们完全控制系统的证据。我们将使用 id 命令,它提供了关于当前用户身份和组成员身份的详细信息。
执行以下命令以生成 root shell 并记录你的身份:
sudo find . -exec /bin/bash -c "id > /home/labex/project/pwned.txt" \; -quit
最后,读取 pwned.txt 文件以验证你的最终权限提升:
cat /home/labex/project/pwned.txt
输出应清楚地显示该 shell 是以 root 用户和组 ID 运行的:
uid=0(root) gid=0(root) groups=0(root)
恭喜!你已成功利用配置错误的 sudoers 文件,将权限从标准用户提升到了 root。
总结
在本实验中,你探索了 Linux 环境中配置错误的 sudoers 文件所带来的安全风险。你首先枚举了用户账户的 sudo 权限,并确定了 find 二进制文件可以在无需密码的情况下以 root 身份执行。通过理解 find 命令 -exec 参数的功能,你能够以 root 权限执行任意命令。你通过读取受限系统文件并最终生成 root shell 以实现系统完全控制,展示了该漏洞的影响。本次练习强调了遵循最小权限原则以及仔细审计 sudo 配置以防止未经授权的权限提升的重要性。



