sudo 控制权限原理

核心在于euid的控制,euid决定于可执行文件创建者的s标志位。如果文件拥有s标志位,那么运行次可执行文件时,此进程的euid将会是创建者的id。如果没有s标志位,那么运行的可执行文件euid将是运行者的id。

所以sudo 命令在其他用户登录的时候,就可以利用euid来执行root权限。

所以,如果我们伪造一个不用密码的sudo, 是不是就可以直接提权了呢。答案是不可以。

  1. 伪造的sudo命令必须由root用户创建,所以我们根本没有权限创建。
  2. 我们需要利用chmod u+s增加文件的属性。还是需要root权限。

所以说,如果要利用: 需要利用提权漏洞创建带s标志的可执行文件,之后再次登录就可以以任意用户执行root权限。

#include 
#include 

int main(int argc, char* argv[])
{
    printf("ruid: %d\n",getuid());
    printf("euid: %d\n",geteuid());
    setuid(0);
    if(execvp(argv[1], argv+1) == -1){
        perror("execvp error");
    };
    return 0;
}

如上述程序,利用root用户编译或者改变拥有者为root后,增加s标志,之后任何用户执行euid都会是0.

lier@linux-k24r:/root/code> ./main /bin/bash
ruid: 1001
euid: 0
ruid: 0
euid: 0
linux-k24r:/root/code # id
uid=0(root) gid=100(users) groups=0(root),16(dialout),33(video),100(users)
linux-k24r:/root/code # whoami
root
linux-k24r:/root/code # exit
exit
lier@linux-k24r:/root/code> exit
exit
linux-k24r:~/code # chmod u-s main
linux-k24r:~/code # su lier 
lier@linux-k24r:/root/code> ./main /bin/bash
ruid: 1001
euid: 1001
ruid: 1001
euid: 1001
lier@linux-k24r:/root/code> cat main.c

直接用上述程序启动bash,bash变为root用户。去掉s标志再次执行,ruid不在变化。

忽然想起以前avd模拟器root过程,是什么替换su文件。原理大概是原始的su文件会对进程判断,如果是adb shell则允许,如果是其他就一律不允许root执行。替换一个可以允许任意进程执行root权限的su。当时因为换这个文件,走了很多弯路。现在发现直接用几行代码就可以自己写一个,虽然会有漏洞吧,一路走来颇有感触。

你可能感兴趣的:(linux)