我有两个用户,第一个是ace
,第二个是ej
ace 在其主目录中有一个文件,它是一个 shell 脚本,具有以下权限集(我使用了 setuid )
-rwsr--r-x 1 ace ace 15 Jan 20 05:18 /home/ace/myshellscript
脚本的内容很简单,列出如下
echo "`whoami`"
cat ./testPrevEsc
但是如果我尝试读取 (testPrevEsc) 拥有的另一个文件,ace
我认为我可以通过传入cat filename
$1 来完成,我认为我应该能够做到这一点,无论为其他人设置的权限如何,只要楼主能看懂,但我看不懂,为什么?
我对 setuid 的理解是,程序或 shell 是由所有者执行的,而不是执行用户(在我的例子中是 ej ),那么为什么我不能读取文件并仍然获取 whoai 作为ej
而不是ace
?另一方面,做的sudo whoami
很好,它给你root权限,而不是你正在运行的用户,我想我在这里遗漏了一些东西。
答案1
发生这种情况是因为 bash 解释器没有,setuid
它仍然使用用户的 uid 运行ej
,并且为了执行类似的操作,您将必须更改解释器的 uid。
以下视频可能会有所帮助 -https://youtu.be/iv5gflNM7rc?si=o-Ren0ow-nmojgAk
上面的视频方法只有在我们同意获取 的权限时才有效root
,因为/usr/bin/bash
无论您使用什么 shell,它都将由 root 本身拥有,但在我们的例子中ace
不是 root,所以方法是通过 ac 程序,例如下列的。
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char const *argv[])
{
printf("euid is set to %u\n", geteuid());
FILE* f = fopen("/home/ace/testPrevEsc", "r");
if(!f){
perror("File open failed");
return 1;
}else{
int c;
while ((c =fgetc(f)) != EOF)
{
putchar(c);
}
fclose(f);
}
return 0;
}
因为调用system
会将有效用户 ID 设置回在我们的例子中没有权限的用户,这ej
就是为什么我们得到whoami
的返回值是 asej
和 not ace
。