Bash 函数操作说明

信息安全 linux 特权升级 重击 二进制代码
2021-08-17 11:38:21

我最近正在阅读有关捕获标志 Linux VulnHub 机器的文章对于权限提升,作者引用了“bash 函数操作”。谷歌搜索很少发现它是如何工作的。简而言之,他们在根 SUID 二进制文件上运行字符串,如下所示:

字符串在根 SUID ELF 二进制文件上运行

然后作者继续创建/导出与程序调用的程序之一(即“/usr/bin/sl”)匹配的bash函数,如下所示;

在此处输入图像描述

我的主要问题是,这是如何工作的?

对我来说,很明显最终结果是让二进制文件运行 bash 函数/代码,从而运行 root shell,但这似乎很神奇。我想知道繁殖的条件是什么。例如,在这种情况下;

  1. 你可以使用“/dev/tty”吗?
  2. “看跌”呢?
  3. /usr/bin/aafire 怎么样?为什么或者为什么不?
  4. 如果“噩梦”程序只是在没有 FQ 路径的情况下调用“sl -al”,它还能工作吗?
  5. 根 SUID 文件是哪种二进制/ELF 是否重要?

如果这种攻击以另一个名字为人所知,那将有助于像谷歌一样了解这个攻击。


编辑:

我刚刚遇到了这个相关的演练,它分解并分析了(根 SUID)“噩梦”二进制文件的一些代码。然而,它给我留下了更多的问题,然后是答案,例如为什么“train()”方法在调用“/usr/bin/sl -al”之前将 UID 和 GID 设置为 0(root),当“噩梦”时二进制已经是根SUID了?

训练方法噩梦二进制

如果它不这样做,这是否意味着“/usr/bin/sl”将无法以 root 身份运行?如果是这样,那么可以说这是一种人为的特权升级场景,在现实世界中不太可能发生吗?

2个回答

做什么setresuid()setresgid()做什么?

为了更好地理解这个例子,我们需要看一下这两个函数以及它们所取的三个参数。

这个答案(和凭据(7)手册页):

在 Linux 上,每个进程都有以下用户和组标识符:

  • 真实用户 ID 和真实组 ID。这些 ID 确定谁拥有该进程。总而言之,这就是

  • 有效用户 ID 和有效组 ID。内核使用这些 ID 来确定进程在访问消息队列、共享内存和信号量等共享资源时将拥有的权限。在大多数 UNIX 系统上,这些 ID 还确定访问文件时的权限。但是,Linux 使用文件系统 ID 来执行此任务。总而言之,这是您可以做的

  • 保存的 set-user-ID 和保存的 set-group-ID。这些 ID 在 set-user-ID 和 set-group-ID 程序中使用,以保存程序执行时设置的相应有效 ID 的副本。set-user-ID 程序可以通过在其真实用户 ID 和保存的 set-user-ID 中的值之间来回切换其有效用户 ID 来承担和放弃特权。总而言之,这就是你以前的样子

此外,了解 SetUID-Bit 也很重要。它的作用是运行一个具有所有者权限的可执行程序,而不是调用它的人。

一个安全 nightmare

您的问题特别提到nightmarerootSetUID-Bit 拥有并设置。这意味着任何被允许执行的用户nightmare基本上都将其执行为root. 这意味着所有的子进程nightmare——比如它们在调用时产生的system()——也被执行为root.

但现在真的,setresuid()做什么?

在这种情况下?没有什么。由于用户已经在执行事情root,它不会以任何方式影响进一步的利用。

你能用/dev/tty吗?

在这种情况下,这个问题没有多大意义。您必须查看相关的代码片段以了解字符串/dev/tty的来源。

if (open("/dev/tty", O_RDWR) != -1) {
        fire();
        rax = sub_4008d0();
}

这意味着程序正在尝试打开/dev/tty以进行读写,如果成功,则调用fire().

通过命名一个 bash 函数/dev/tty(),你不会得到想要的结果,因为它open()需要一个文件的路径作为它的第一个参数。它完全独立于bash并且没有 bash 函数的概念。

怎么样puts()

同样,这没有多大意义。strings不是魔术,也不了解上下文。它所做的只是寻找一系列可打印的 ASCII 字符的字节。

puts() 只是一个输出字符串的 C 函数。

怎么样/usr/bin/aafire

虽然我没有亲自尝试,但似乎实际上/usr/bin/aafire可以用来代替/usr/bin/sl -al. 如果这不正确,请发表评论,我将编辑这部分。

如果使用相对路径,它仍然有效吗?

是的,实际上甚至更好!system()内部调用sh -c,它必须解析$PATH要查找的变量sl如果路径变量被修改为包含.或任何其他优先级高于的用户可写目录/usr/bin,那么我可以符号链接./sl/bin/bash.

根 SUID 文件是哪种二进制/ELF 是否重要?

的,因为 SetUID-Bit 在 shell scripts 中被忽略它必须是本机可执行文件。

该程序nightmare设置了stickybits,这意味着任何有效执行此命令的用户都将其UID设置为0,用于此命令。

strings 命令显示在可执行文件中编译的二进制文件。其中之一是/usr/bin/sl

现在,诀窍是nightmare每次都可靠地运行 sl 程序(可能与错误有关)。

在当前 shell 中,函数命令实际上是sl命令的别名。因此,当nightmare尝试运行时/usr/bin/sl,内部函数将代替sl磁盘上的命令运行。
例如:
alias /usr/bin/sl /bin/sh
现在,因为nightmare正在以 0 的 UID 运行,并nightmare尝试运行/usr/bin/ls(以 root 身份),它是/bin/sh,您最终会以 root 身份运行 Born Shell 会话,即使初始用户没有 root 访问权限。