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

然后创建/导出一个bash函数,该函数与程序调用的一个程序(即"/usr/bin/sl")相匹配,类似于这样;

在我看来,最终的结果是获得二进制来运行bash函数/代码,从而运行根shell,但这似乎是神奇的。我想知道繁殖的条件是什么。例如,在这种情况下;
如果这次以另一个名字知道的攻击,这将有助于更好地了解,以及谷歌,是短缺的这一次。
我刚刚遇到了与此相关的穿行,它分解并分析了(根SUID)“噩梦”二进制文件的一些代码。然而,它给我留下了更多的问题,然后回答了问题,比如为什么在调用"/usr/bin/sl -al“之前,"train()”方法将UID和GID设置为0 ( root ),而“噩梦”二进制文件已经是根SUID?

如果它不这样做,这是否意味着"/usr/bin/sl“将不能作为root运行?如果是这样的话,那么公平地说,这是一种在现实世界中不太可能的人为的特权升级场景吗?
发布于 2019-04-10 11:35:35
setresuid()和setresgid()做什么?为了更好地理解这个例子,我们需要了解这两个函数以及它们所采用的三个参数。
来自这个答案 (和凭据(7)手册页):
在Linux上,每个进程都有以下用户和组标识符:
此外,理解SetUID位很重要。它所做的是运行一个具有所有者权限的可执行程序,而不是调用它的那个人。
nightmare您的问题特别提到nightmare为root所有,并设置了SetUID位。这意味着,任何被允许执行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。
是的,因为在shell脚本中,SetUID位被忽略。。它必须是一个本机可执行文件。
发布于 2019-04-09 17:17:26
程序nightmare具有stickybits集,这意味着任何有效执行此命令的用户都将其UID设置为0,用于此命令。
字符串命令显示在可执行文件中编译的二进制文件。其中之一是/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 (作为根),这是/bin/sh的别名,所以您最终会以根用户的身份运行生成的Shell会话,即使初始用户没有根访问权限。
https://security.stackexchange.com/questions/206305
复制相似问题