【问题标题】:Run program as root using SUID使用 SUID 以 root 身份运行程序
【发布时间】:2020-11-13 12:21:53
【问题描述】:

不要告诉我这是重复的,因为我已经阅读了诸如 how to execute a command as root 之类的问题,但我无法让它对我有用。

这是我的 C 程序whoami.c:

#include <stdio.h>
#include <stdlib.h>

int main() {
    system("whoami");
}

这正是我所做的:

user@ubuntu:~/Desktop/test$ ls
whoami.c
user@ubuntu:~/Desktop/test$ gcc whoami.c 
user@ubuntu:~/Desktop/test$ sudo chown root:root a.out 
[sudo] password for user: 
user@ubuntu:~/Desktop/test$ sudo chmod 4711 a.out 
user@ubuntu:~/Desktop/test$ ls -l
total 24
-rws--x--x 1 root    root    16816 Nov 13 13:03 a.out
-rw-rw-r-- 1 user    user    75    Nov 13 13:03 whoami.c
user@ubuntu:~/Desktop/test$ ./a.out 
user
user@ubuntu:~/Desktop/test$ sudo ./a.out 
root
user@ubuntu:~/Desktop/test$

我认为执行位中的s 意味着无论谁启动这个程序,它都会以root 身份运行,所以我的问题是为什么这不起作用?

如果无法做到这一点,我如何让任何用户以 root 身份运行特定程序?

【问题讨论】:

  • 同时检查你的卷是否没有被-nosuid挂载。
  • 只是为了清楚whoami 只是一个例子我不能使用同样的方法来获取根受保护的文件,但我可以添加sudo 当然这是正常行为, SUID 接缝完全没用。
  • @Tommimon SUID 接缝完全没用。 你认为sudo 是如何工作的?
  • 不,相反。你正在改变真实,你需要有效。要更改有效的 uid,请致电 setuid()(请参阅 man 2 setuid)。只有当真正的 uid 是 root 时,你才能这样做。

标签: c suid


【解决方案1】:

这对我有用:在运行 de 命令之前添加 setuid(geteuid());

要使用setuid()geteuid(),您需要导入unistd.h

工作计划:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    setuid(geteuid());
    system("whoami");
}

如果您使用与问题相同的命令设置 SUID,则无论哪个用户运行此程序,您总是得到 root 作为输出。

您可以使用任何其他命令代替whoami,如果它需要root 权限。

我在YouTube video 中看到了这个设置

【讨论】:

    猜你喜欢
    • 2011-03-26
    • 2017-07-30
    • 1970-01-01
    • 2011-04-20
    • 2016-04-11
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    相关资源
    最近更新 更多