本文共 2177 字,大约阅读时间需要 7 分钟。
相关背景: 老师上课讲了setuid程序;但是在调用system()函数时setuid不起作用
相关文章:
对调用system()函数的程序catall.c 如下;当设置根用户setuid权限后,理想情况下这个程序应该运行 /bin/cat 程序,可以查看所有的文件,但不能写入任何文件
/* catall.c */#includeppt 上的运行示例:可以成功拿到root权限,查看/etc/shadow 文件#include #include int main(int argc, char const *argv[]){ char *cat = "/bin/cat"; if(argc<2) { printf("please type a file name.\n"); return 1; } char *command = malloc(strlen(cat) + strlen(argv[1] + 2)); sprintf(command,"%s %s",cat,argv[1]); system(command); return 0;}
实际运行结果:还是显示permission denied。。。明明前面 ls -l 显示属主是 root 且运行位是 s。。。说明这里的 setuid不起作用了。
最离谱的是,同一程序的系统调用,使用不同的函数,结果不一样,函数 execve() 的系统调用可以照常拿到 root 权限
DESCRIPTION The system() library function uses fork(2) to create a child process that executes the shell command specified in command using execl(3) as follows: execl("/bin/sh", "sh", "-c", command, (char *) NULL); system() returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored, in the process that calls system(). (These signals will be handled according to their defaults inside the child process that executes command.) If command is NULL, then system() returns a status indicating whether a shell is available on the system.
应该就是fork一个子进程,然后调用execl("/bin/sh", “sh”, “-c”, command, (char *) NULL); 去执行命令。
直接用 execl() 函数试一下
下面显示有euid=0,说明execve() 拿到 root 执行权限,而上面 execl() 跟system() 一样没有执行位权限
这里再试一下 execl() 函数直接用 /bin/id 不通过 /bin/shell;老师PPT中有解释
在Ubuntu 16.04中,/bin/sh指向/bin/dash,这有一个对策:当它在set-uid进程中执行时,它将删除特权。因此,在以上的攻击中,我们只会得到一个普通shell
A Note
• In Ubuntu 16.04, /bin/sh points to /bin/dash, which has a countermeasure • It drops privilege when it is executed inside a set-uid process • Therefore, we will only get a normal shell in the attack on the previous slide
Do the following to remove the countermeasure
转载地址:http://hfhc.baihongyu.com/