当前版本

当前版本

我一直在尝试进行一些缓冲区溢出攻击,并且我认为我可以使用它system("/bin/bash")来获得root shell。

然后我读了的文档system()

它说:

system()事实上,在/bin/shbash 版本 2 的系统上,具有 set-user-ID 或 set-group-ID 权限的程序将无法正常工作,因为 bash 2 在启动时会删除权限。

我攻击的系统有一个bash版本4.3,当我使用a时system("/bin/bash"),我没有获得root权限(当然我攻击的初始程序以root权限启动)。我的问题是:系统只会删除 bash 版本 2 上的权限,还是会删除版本 > 2 的任何 bash 的权限?

编辑:/bin/bash只是删除特权,同时/bin/dash/bin/sh不删除。

阅读@StéphaneChazelas 的评论后,EDIT2:

  • 查看这个链接有关 bash 删除权限的更多解释和准确性。
  • -p选项可用于确保在 bash 生成时保留特权。

答案1

当前版本

bash 的最新版本将放弃特权,除非它是使用-p.从以下部分重击(1)描述特权模式:

如果 shell 启动时的有效用户(组)id 不等于真实用户(组)id,并且-p未提供选项,[...]有效用户 ID 设置为真实用户 ID。如果-p选项在启动时提供,有效用户 ID 不会重置。关闭此选项会导致有效用户和组 ID 设置为真实用户和组 ID。

历史版本

你问“从哪个版本......?”。自活动 git 存储库中可用的最早修订版以来,您引用的部分system()一直没有变化(1.70版)。该文件于 2004 年签入,评论表明最后一次修改是在 2001 年。

Bash 版本 3 于 2004 年发布。这意味着 bash 2 将是当时的当前/最新版本。因此,它实际上是在说“...bash 版本 2 或更高/更新”,即。情况就是这样自从版本 2。

为了自己确认,您可以尝试构建一些中间版本并测试它们,或者查阅 bashgit 存储库。负责的线路是:

  if (running_setuid && privileged_mode == 0)
    disable_priv_mode ();

那些从那时起就一直存在2.0版本。回顾过去版本1.14.7,只有当使用以下命令显式禁用特权模式时,bash 才会删除特权+p

    case 'p':
      if (on_or_off == '+')
      {
        setuid (current_user.uid);
        setgid (current_user.gid);
        current_user.euid = current_user.uid;
        current_user.egid = current_user.gid;
      }

相关内容