假设有一个(可能是无意的)后门。
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/false
shell,shell 会立即退出。
- 使用 telnet 或 rlogin 将彻底拒绝登录。即使成功了,
/bin/false
shell 也会立即退出。
- FTP 和 scp 不使用 shell,但它们被配置为拒绝访问 uid 零,因此您无法以这种方式登录。
- GUI 登录会启动默认的 GUI 服务,包括窗口管理器、时钟客户端和终端。后者会立即退出,因为它的子 shell 会立即退出。所以你会得到一个除了时钟之外的空白屏幕。(更多关于这下面...)
- 如果您真的必须以 root 身份登录,您要么必须从控制台执行此操作,要么首先以该计算机上的另一个用户身份 rlogin/telnet,然后
su root
. 无论哪种方式都使用根passwd
条目而不是游戏passwd
条目,因此它们的工作方式应该是根应该工作的。
所以游戏帐户似乎总是失败,除非您进行 GUI 登录。在那种情况下,唯一出现的就是时钟。但是,您可以右键单击背景以获取根菜单,其中包含用户通常为自己定制的工厂提供的程序列表。(自定义菜单不适用于游戏帐户;我不记得确切原因。)您可以尝试打开更多终端窗口,但都会失败。有一个益智游戏(这可能首先是该帐户的推动力)。另一种选择是退出。然后是图形调试工具,dbxtool
.
dbxtool
是dbx
符号调试器的图形前端,类似于今天的gdb
. 由于 uid 为零,您可以附加并控制系统上的任何进程,尽管这没有用,因为 Sun 提供的程序是在没有符号的情况下编译的。您可以启动一个 shell,但这将使用您的SHELL
环境变量,即/bin/false
. 但是,您也可以更改环境变量!这意味着您可以通过以下方式获得 root shell:
- 通过 GUI 作为游戏登录,无需密码。
- 右键单击以调出根菜单。
- 启动一个
dbxtool
.
setenv SHELL /bin/sh
- (选修的)
setenv HOME /
- 启动一个shell
!
- 因为没有设置终端,所以做
stty sane
瞧,没有密码的root shell!
因此,不要假设用户无法从无效的 shell 中逃脱。