作者:cybermind (Kevin Masterson)
[email protected]
WebMod 网站(存档):https://web.archive.org/web/20080517044559/http://djeyl.net/w.php
受影响版本:
0.48,包括 Win32 和 Linux。之前的版本也可能存在漏洞。该漏洞应适用于任何版本的 HLDS。
漏洞类型:
DoS、以 HLDS 运行所用用户的权限执行远程代码。
描述: 当收到 HTTP POST 请求时,它会在栈上分配 11 字节来存储 Content-Length 的值,但会向该缓冲区持续写入,直到收到换行符或空终止符。当你的 Content-Length 字符串达到 158308 字节后,它开始覆盖 EIP。由于填充(padding)原因,这个数值在 Linux 上可能略有不同。你的 shellcode 不能包含 0x00、0x0A 或 0x0D,否则它将停止从套接字读取数据。
以下内容可能有助于执行你的 shellcode:
概念验证代码:
w48crash.c
注意:PoC 中使用的“shellcode”是硬编码的,专门用于在 Win2K SP4/kernel32.dll/user32.dll v5.0.2195.6688 上运行的服务器。不过,实际的缓冲区溢出在任何 Windows 版本上都可以原样工作。要测试这一点,你可以将“our_eip”全局变量设为 0xFFFFFFFF,仅造成崩溃。
原因/修复: 问题代码位于 server.cpp 第 542-552 行:
542 char clbuf[11];
543
544 for(i=0;(size_t)i<strlen(input)-17;i++)
545 {
546 if(!strnicmp(input+i,"\nContent-Length: ",17))
547 {
548 LOG_DBG_SERVER(("Content-length spotted"));
549 i+=17;
550 for(j=0;input[i]!='\n'&&input;[i];i++,j++)
551 clbuf[j]=input[i];
552 clbuf[j]='\0';
在第 542 行分配的缓冲区 clbuf 会被第 550-551 行的循环写入,然后以空字符结尾。修复方法是将第 550 行替换为:
550 for(j=0;input[i]!='\n'&&input[i]&&j<10;i++,j++)