绕过 /etc/passwd 中指定的命令/脚本

信息安全 验证 linux 重击
2021-08-28 20:58:11

考虑以下行/etc/passwd

sadeq:x:1000:1000:Mohammad Sadeq Dousti,,,:/home/sadeq:/bin/custom-script.sh

最后一部分,/bin/custom-script.sh显示用户登录系统时要运行的命令/脚本。目前,它是一个简单的 Bash 脚本,它为用户提供菜单,有效地限制了他可以执行的可能命令。

或者,我希望如此!也许有一种方法可以让用户绕过custom-script.sh,直接访问 Bash。然后,他们可以在其用户上下文中执行任何命令。

有没有办法绕过上面的 Bash 脚本,执行其他命令?

编辑:考虑以下简单情况custom-script.sh

#!/bin/bash
echo What is your name?
read name
echo Hi $name
4个回答

假设有一个(可能是无意的)后门。

1990 年代早期 Sun 工作站的默认设置/etc/passwd包括一个类似这样的条目:

games::0:0:games:/nopath:/bin/false

换句话说,一个名为“游戏”的帐户,没有密码。显然,提出这个想法的天才没有想象力,并为它分配了一个为零的uid和gid(即root和wheel)。一般来说,这没关系,因为主目录没有意义,而且 shell 被设置为一个总是以失败退出的程序。此外,任何网络访问的默认设置——telnet、rlogin、rcp、ftp——被设置为防止任何 uid 为零的访问。root 有一个单独的 passwd 条目,具有正确设置的密码、主目录和 shell。

这意味着如果您尝试以游戏身份登录,则会发生以下情况:

  • 在控制台上作为游戏登录首先会成功,但随后会生成/bin/falseshell,shell 会立即退出。
  • 使用 telnet 或 rlogin 将彻底拒绝登录。即使成功了,/bin/falseshell 也会立即退出。
  • FTP 和 scp 不使用 shell,但它们被配置为拒绝访问 uid 零,因此您无法以这种方式登录。
  • GUI 登录会启动默认的 GUI 服务,包括窗口管理器、时钟客户端和终端。后者会立即退出,因为它的子 shell 会立即退出。所以你会得到一个除了时钟之外的空白屏幕。(更多关于这下面...)
  • 如果您真的必须以 root 身份登录,您要么必须从控制台执行此操作,要么首先以该计算机上的另一个用户身份 rlogin/telnet,然后su root. 无论哪种方式都使用根passwd条目而不是游戏passwd条目,因此它们的工作方式应该是根应该工作的。

所以游戏帐户似乎总是失败,除非您进行 GUI 登录。在那种情况下,唯一出现的就是时钟。但是,您可以右键单击背景以获取根菜单,其中包含用户通常为自己定制的工厂提供的程序列表。(自定义菜单不适用于游戏帐户;我不记得确切原因。)您可以尝试打开更多终端窗口,但都会失败。有一个益智游戏(这可能首先是该帐户的推动力)。另一种选择是退出。然后是图形调试工具,dbxtool.

dbxtooldbx符号调试器的图形前端,类似于今天的gdb. 由于 uid 为零,您可以附加并控制系统上的任何进程,尽管这没有用,因为 Sun 提供的程序是在没有符号的情况下编译的。您可以启动一个 shell,但这将使用您的SHELL环境变量,即/bin/false. 但是,您也可以更改环境变量!这意味着您可以通过以下方式获得 root shell:

  1. 通过 GUI 作为游戏登录,无需密码。
  2. 右键单击以调出根菜单。
  3. 启动一个dbxtool.
  4. setenv SHELL /bin/sh
  5. (选修的) setenv HOME /
  6. 启动一个shell !
  7. 因为没有设置终端,所以做 stty sane

瞧,没有密码的root shell!

因此,不要假设用户无法从无效的 shell 中逃脱。

您无法绕过脚本执行。这是您的登录 shell,每次登录时都会启动。作为登录外壳,每次结束时都会将您注销。但是您可以使用登录外壳上的怪癖、错误和不一致来逃避。

您可以做的一件事是使用菜单上的任何选项逃到 shell。如果菜单允许您启动vim、或其他一些命令lessmore理论上您可以挣脱。如果系统管理员有经验,那么这些命令将使用其受限版本并且不起作用。

我记得有一个类似情况的兵棋推演挑战——shell 指向的东西只是使用more命令打印了一些输出,然后终止了会话。但是,由于more具有内置文本编辑器(在本例中是 vi),因此调整您要连接的终端窗口的大小以便激活更多功能,然后使用它来转义 shell 就足够了。

所以,答案取决于你的脚本做什么。检查您正在运行的每个命令的手册页以避免漏洞。

使用您发布的示例脚本,受限用户可以了解很多关于系统的信息,例如其他用户的名称和已安装的程序。例如

What is your name?
> /home/* 
Hi /home/foo /home/bar /home/sadeq

您拥有的实际脚本可能会以类似的方式被利用,也许到了用户可以获得真正的 shell 访问权限的程度。

您可以通过在沙盒环境中启动登录菜单来改善这种情况:它不一定是 100% 防弹的,但至少沙盒会堵住脚本作者可能留下的一大堆安全漏洞。