【发布时间】:2015-04-08 08:55:04
【问题描述】:
我需要编写一些代码来获得 root 权限并执行系统级操作。这是我写的(这不是实际代码,只是为了测试我是否正确地做事):
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void)
{
int current_uid = getuid();
printf("My UID is: %d. My GID is: %d\n", current_uid, getgid());
system("/usr/bin/id");
if (setuid(0))
{
perror("setuid");
return 1;
}
//I am now root!
printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
system("/usr/bin/id");
//Time to drop back to regular user privileges
setuid(current_uid);
printf("My UID is: %d. My GID is: %d\n", getuid(), getgid());
system("/usr/bin/id");
return 0;
}
在完成gcc -o setuid setuid.c 之后,我对此运行 ls -al 以获得以下结果:
tarun@staging:~$ ls -al setuid
-rwxr-xr-x 1 tarun tarun 9792 2009-10-03 18:09 setuid
adam@staging:~$
尝试运行应用程序会导致:
tarun@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted
我将所有者更改为 root 并相应地设置粘性位:
tarun@staging:~$ su - root
Password:
staging:~# cd /home/tarun
staging:/home/tarun# chown root.root setuid
staging:/home/tarun# chmod +s setuid
staging:/home/tarun# ls -al setuid
-rwsr-sr-x 1 root root 9792 2009-10-03 18:09 setuid
staging:/home/tarun# exit
logout
tarun@staging:~$
现在执行程序给出:
adam@staging:~$ ./setuid
My UID is: 1000. My GID is: 1000
uid=1000(tarun) gid=1000(tarun) groups=1000(tarun),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),109(lpadmin),125(sambashare),999(bumblebee)
setuid: Operation not permitted
虽然理想情况下它应该完全执行并将我的 uid 更改为 0。我做错了什么?
【问题讨论】:
-
我觉得奇怪的是你的文件是 2009 年的,无论如何,你遵循的步骤应该可以工作,事实上,它们已经在我的机器上工作了。
-
@Rafael 我想这一定是我的系统有问题。看看我能不能弄清楚这是怎么回事。
-
检查 mount 的输出,看是否启用了 suid。也许分区是用 nosuid 挂载的。
-
谢谢,原来我使用的文件系统是
ecryptfs,它强制执行 nosuid 和 nodev 以避免特权升级攻击。我不认为我可以关闭它。有什么办法吗? -
添加了可以帮助你驯服 eCryptFS 的链接。