首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解释Bash函数操作

解释Bash函数操作
EN

Security用户
提问于 2019-03-28 13:52:41
回答 2查看 688关注 0票数 7

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

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

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

在我看来,最终的结果是获得二进制来运行bash函数/代码,从而运行根shell,但这似乎是神奇的。我想知道繁殖的条件是什么。例如,在这种情况下;

  1. 你能用"/dev/tty“吗?
  2. 那“放”呢?
  3. /usr/bin/aafire怎么样?为什么或者为什么不?
  4. 如果没有FQ路径的“噩梦”程序叫做"sl -al“,它还能工作吗?
  5. 根SUID文件是什么类型的二进制/ELF有关系吗?

如果这次以另一个名字知道的攻击,这将有助于更好地了解,以及谷歌,是短缺的这一次。

编辑:

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

如果它不这样做,这是否意味着"/usr/bin/sl“将不能作为root运行?如果是这样的话,那么公平地说,这是一种在现实世界中不太可能的人为的特权升级场景吗?

EN

回答 2

Security用户

回答已采纳

发布于 2019-04-10 11:35:35

setresuid()setresgid()做什么?

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

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

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

  • 真实用户ID和真实组ID。这些ID决定谁拥有进程。总之,你就是这样的人。
  • 有效用户ID和有效组ID。内核使用这些ID来确定进程在访问共享资源(如消息队列、共享内存和信号量)时所具有的权限。在大多数UNIX系统上,这些ID还决定访问文件时的权限。但是,Linux将文件系统ID用于此任务。总之,这就是你能做的。
  • 保存的设置-用户ID和保存的集-组-ID。这些ID用于set-user-ID和set-group-ID程序,以保存在执行程序时设置的相应有效ID的副本。set用户ID程序可以通过在其实际用户ID和保存的set用户ID中的值之间来回切换其有效用户ID来获得和删除权限。总之,这就是你以前的样子。

此外,理解SetUID位很重要。它所做的是运行一个具有所有者权限的可执行程序,而不是调用它的那个人。

A安全nightmare

您的问题特别提到nightmareroot所有,并设置了SetUID位。这意味着,任何被允许执行nightmare的用户实际上都以root的形式执行它。这意味着nightmare的所有子进程--比如调用system()时生成的进程--也以root的形式执行。

,但实际上,setresuid()是做什么的?

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

你能用/dev/tty吗?

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

代码语言:javascript
复制
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有关系吗?

是的,因为在shell脚本中,SetUID位被忽略。。它必须是一个本机可执行文件。

票数 3
EN

Security用户

发布于 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会话,即使初始用户没有根访问权限。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/206305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档