LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 748|回复: 6

suid 问题释疑

[复制链接]
发表于 2005-7-31 22:29:10 | 显示全部楼层 |阅读模式
以前在版上讨论过一个suid的问题,不知还有没有人记得,有这么一个测试程序:

  1. #include <unistd.h>

  2. int main()
  3. {
  4.         char *name[2];
  5.         name[0] = "/bin/sh";
  6.         name[1] = 0;

  7.         execve(name[0],name,0);
  8. }

  9. chmod u+s a.out
复制代码

但是以普通用户身份执行,无法得到root shell,一直不得其解,与 Tetris 兄探讨无果
怀疑是系统问题,今天用hiweed试了一下,确实能够得到root shell,原本使用的测试平台是fc3,

ps:fc在安全方面还做好多工作,exec-shield,selinux等.

pps: 我这不算灌水吧? ^_^
发表于 2005-8-1 10:18:08 | 显示全部楼层
但是具体是哪个环节出的问题呢?
execve or bash?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-1 16:13:36 | 显示全部楼层
Post by 弥敦路九号
但是具体是哪个环节出的问题呢?
execve or bash?

应该不是bash的问题,因为我试过直接用0x80中断,也不行。那就应该是内核的问题了
回复 支持 反对

使用道具 举报

发表于 2005-8-20 17:26:28 | 显示全部楼层
Post by rickxbx


  1. #include <unistd.h>

  2. int main()
  3. {
  4.         char *name[2];
  5.         name[0] = "/bin/sh";
  6.         name[1] = 0;

  7.         execve(name[0],name,0);
  8. }

  9. chmod u+s a.out
复制代码

但是以普通用户身份执行,无法得到root shell,一直不得其解,与 Tetris 兄探讨无果...

我试过了,这个程序运行后的euid和ruid都是普通用户。加上setuid(0)后用ps查看,euid和ruid都成为root了。
  1. #include <sys/types.h>
  2. #include <unistd.h>

  3. int main()
  4. {
  5.         char *name[2];
  6.         name[0] = "/bin/sh";
  7.         name[1] = 0;

  8.         setuid(0);
  9.         execve(name[0],name,0);
  10. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-20 18:46:47 | 显示全部楼层
Post by kj501
我试过了,这个程序运行后的euid和ruid都是普通用户。加上setuid(0)后用ps查看,euid和ruid都成为root了。

呵呵,这个我已经做过了,这样确实可以
现在已经确切地发现了问题所在,问题出在 bash 上,bash 在启动时会检测 euid 是否与 uid 相同,如果相同,则罢;若不同,就检查是否加上了 -p 选项,如果有,则将euid不变,否则,euid将变成当前用户的uid,可以试一下如下程序:

  1. int main()
  2. {
  3.     char* name[] = {"/bin/sh","-p",0};
  4.     execve(name[0],name,0);
  5.     return 0;
  6. }
复制代码

ps:我都有点忘了,斑竹还能记得这个问题,真是好感动……
回复 支持 反对

使用道具 举报

发表于 2005-8-20 19:54:02 | 显示全部楼层
从效果上讲,"/bin/sh -p"和setuid(0)还是有区别的,setuid(0)是euid和ruid都变成root了,而"/bin/sh -p"只是euid成为root,而ruid仍然是普通用户。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-8-20 21:40:06 | 显示全部楼层
Post by kj501
从效果上讲,"/bin/sh -p"和setuid(0)还是有区别的,setuid(0)是euid和ruid都变成root了,而"/bin/sh -p"只是euid成为root,而ruid仍然是普通用户。

嗯,是这个样子
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表