这是一个重新发布后被称为“从setuid根C程序调用脚本 - 脚本不以root身份运行”的解决方案
我的问题不同,因为我不想以root身份运行C程序(以及内部调用的c-shell脚本)。相反,我想作为c程序文件的所有者运行。
另外,我尝试使用“setuid(0)”,因为这是引用帖子中的解决方案。这反映在下面的编辑代码中。相同的结果。
此外,我这次使用“chmod 7775”打开了权限(以防万一是权限问题)
以下是带有编辑的原始注释,以反映对“setuid(0)”
的更改我在实现一个简单示例时遇到问题,该示例将演示如何使用setuid与二进制文件所有者的uid运行二进制文件。我最终想做的是使用这种技术运行c-shell脚本。 我读到这对shell脚本不起作用,但也听说过使用C程序来运行一个运行c-shell脚本的system()调用(例如system(“source my.csh”)) 。我写了一个尝试这个的C程序,还只是报告当前的uid。这就是我试过的......
从我目前的shell中,我做了一个“su katman”成为我想以用户katman身份运行的二进制文件的用户。
我创建了一个C程序try.c. ...
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
setuid(0);
printf("In try.c ... sourcing katwhoami.csh...\n");
system( "source /home/me/su_experiments/katwhoami.csh");
printf("In try.c ... using straight system call...\n");
system("whoami");
return 0;
}
我按照对不同音符的引用推荐的“setuid(0)”。但是之前,我尝试将其设置为使用“id -u”获得的C程序所有者的uid。
katwhoami.csh shell脚本只是......
date
echo "In katwhoami.csh, I am "`whoami`
echo "In katwhoami.csh, I am "$USER
exit
然后我编译了C程序并设置了位......
% gcc -o try try.c
% chmod 7775 try
% ls -l try
-rwsrwsr-x 1 katman design 6784 Mar 1 11:59 try
然后我测试它......
% try
In try.c ... sourcing katwhoami.csh...
Thu Mar 1 12:28:28 EST 2018
In katwhoami.csh, I am ktadmin
In katwhoami.csh, I am ktadmin
In try.c ... using straight system call...
ktadmin
......这就是我的预期。
我退出以回到我开始的shell,希望如果我在那里试试,它会告诉我我是“katman”....
% exit
% whoami
daveg
% try
In try.c ... sourcing katwhoami.csh...
Thu Mar 1 12:30:04 EST 2018
In katwhoami.csh, I am daveg
In katwhoami.csh, I am daveg
In try.c ... using straight system call...
daveg
......这不是我所希望的: - (
正如你可能会说的那样,我很擅长使用它 任何帮助将不胜感激!
...更新
我尝试了一个新的示例程序,a.c ......
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fh;
setuid(1234);
system("whoami");
fh=fopen("test.file","w");
fprintf(fh,"Here I am\n");
fclose(fh);
return 0;
}
我编译并设置了位
gcc -o a a.c
chmod 4775 a
然后我退出“su”并以不是二进制文件所有者的用户身份运行。报告的uid(当前的uid)与之前的结果相同,但是,C程序创建的文件的所有者是这个版本的C程序的拥有者!这很有用。
“whoami”命令有什么可疑之处吗? system()调用?
如果我执行“system(”source some.csh“),它会创建一个新的shell,它假设原始的uid(不是C二进制文件的所有者)吗?有类似的东西吗?
我真的需要新的uid来“坚持”到子进程。