我一直在尝试进行一些缓冲区溢出攻击,并且我认为我可以使用它system("/bin/bash")
来获得root shell。
然后我读了的文档system()
。
它说:
system()
事实上,在/bin/sh
bash 版本 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;
}