本文共 1294 字,大约阅读时间需要 4 分钟。
核心在于euid的控制,euid决定于可执行文件创建者的s标志位。如果文件拥有s标志位,那么运行次可执行文件时,此进程的euid将会是创建者的id。如果没有s标志位,那么运行的可执行文件euid将是运行者的id。
所以sudo 命令在其他用户登录的时候,就可以利用euid来执行root权限。
所以,如果我们伪造一个不用密码的sudo, 是不是就可以直接提权了呢。答案是不可以。
所以说,如果要利用: 需要利用提权漏洞创建带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/bashruid: 1001euid: 0ruid: 0euid: 0linux-k24r:/root/code # iduid=0(root) gid=100(users) groups=0(root),16(dialout),33(video),100(users)linux-k24r:/root/code # whoamirootlinux-k24r:/root/code # exitexitlier@linux-k24r:/root/code> exitexitlinux-k24r:~/code # chmod u-s mainlinux-k24r:~/code # su lier lier@linux-k24r:/root/code> ./main /bin/bashruid: 1001euid: 1001ruid: 1001euid: 1001lier@linux-k24r:/root/code> cat main.c
直接用上述程序启动bash,bash变为root用户。去掉s标志再次执行,ruid不在变化。
忽然想起以前avd模拟器root过程,是什么替换su文件。原理大概是原始的su文件会对进程判断,如果是adb shell则允许,如果是其他就一律不允许root执行。替换一个可以允许任意进程执行root权限的su。当时因为换这个文件,走了很多弯路。现在发现直接用几行代码就可以自己写一个,虽然会有漏洞吧,一路走来颇有感触。
转载地址:http://xnjvb.baihongyu.com/