Osx Apache Code To Disclose CVE-2013-0966 漏洞分析

01 Jun 2016 - Tr3jer_CongRong

0x00 写在开头

      这个漏洞从cve编号可以看出是三年前的了,当时关注的人并不多,也没有对外放出漏洞分析的Paper,可能是使用Osx Server做web服务器没有普及吧。不过这个漏洞的确很暴力,让我想起了和十几年前CVE-1999-0278 IIS 3.0/4.0 ::$DATA请求返回ASP源代码漏洞很像。。。

0x01 漏洞分析

      最开始是在本地发现的,在请求文件名中插入BOM头字符会直接返回后端的代码:

      当时此漏洞的描述是:

      The Apple mod_hfs_apple module for the Apache HTTP Server in Apple Mac OS X before 10.8.3 does not properly handle ignorable Unicode characters, which allows remote attackers to bypass intended directory authentication requirements via a crafted pathname in a URI.

      意思就是运行Apache的Osx服务器上,数据取自HFS+文件系统,HFS+用unicode来命名文件或文件夹。根据HFS+特性,当视图向HFS+请求文件时,接收到的这个文件名中含有可被HFS+忽略掉的unicode序列的话,照常返回这个正常文件名的文件。而作为apache for mac在处理这种请求时,导致请求的文件没有在服务器上执行,也就是将所请求的文件当做普通文件来响应请求。

      比如这些空的unicode字符序列都会被HFS+忽略:

      再来看看Apple的公告

      Apple对这个漏洞的定义只是绕过了HTTP基本认证,过于模棱两可。所以我把这个漏洞的标题定义为”Code To Disclose Vulnerability”。

      这个漏洞的描述是说mod_hfs_apple模块没有正确处理掉这些unicode序列,这个模块的最初意义是用来处理URI请求信息的,比如文件名大小写等等事情,并且是用户自愿启不启用的。所以补丁就打在了mod_hfs_apple模块:

static int contains_ignorable_sequence(char* s) {

size_t len = strlen(s);

if (len <= 2) return 0;

for (size_t i = 0; i <= len - 2; i++) {

	// 2-char sequences

	if (s[i] == '\xFC' && '\x80' <= s[i+1] && s[i+1] <= '\x83') return 1;

	if (s[i] == '\xF8' && '\x80' <= s[i+1] && s[i+1] <= '\x87') return 1;

	if (s[i] == '\xF0' && '\x80' <= s[i+1] && s[i+1] <= '\x8F') return 1;

	if (i <= len - 3) {

		// 3-char sequences

		if (s[i] == '\xEF' && s[i+1] =='\xBB' && s[i+2] =='\xBF') return 1;

		if (s[i] == '\xE2' && s[i+1] =='\x81' && '\xAA' <= s[i+2] && s[i+2] <= '\xAF') return 1;

		if (s[i] == '\xE2' && s[i+1] =='\x80' && (('\x8C' <= s[i+2] && s[i+2] <= '\x8F') || ('\xAA' <= s[i+2] && s[i+2] <= '\xAE'))) return 1;

	}

}

return 0;

}

      contains_ignorable_sequence函数将这些可被HFS+忽略的unicode序列集中了起来:

\xFC[\x80-\x83]
\xF8[\x80-\x87]
\xF0[\x80-\x8F]
\xEF\xBB\xBF
\xE2\x81[\xAA-\xAF]
\xE2\x80[\x8C-\x8F\xAA-\xAE]

      在hfs_apple_module_fixups函数中调用了contains_ignorable_sequence:

if (contains_ignorable_sequence(r->filename)) {

	ap_log_rerror(APLOG_MARK, APLOG_NOERRNO|APLOG_ERR, 0, r,

			  "mod_hfs_apple: URI %s has ignorable character sequence. Denying access.",

			  r->filename);

	return HTTP_FORBIDDEN;

}

      当URI中的filename存在这些字符序列时,则返回为这个请求是禁止的。更有意思的事情是,补丁虽然打了,但Apple还是没有将mod_hfs_apple模块设为默认加载,在虚拟机上安装了OS X Yosemite 10.10来看看。

      直到去年有安全研究员提出了”osx apache没有默认加载mod_hfs_apple模块那么打补丁有什么意义?” CVE-2015-3675就这么诞生了2333。

      The default configuration of the Apache HTTP Server on Apple OS X before 10.10.4 does not enable the mod_hfs_apple module, which allows remote attackers to bypass HTTP authentication via a crafted URL.

https://support.apple.com/zh-cn/HT204942

      修补的方式就是默认加载了。我本机是OSX EI Caption 10.11.6,自带的Apache默认加载了这个模块:

0x02 漏洞蔓延

      根据服务+操作系统+第三方包指纹搜索,发现在公网架设Apache服务的Osx系统中,用集成包的要比用系统原生的多,MAMP这几个就犹如win下的php study等等第三方包一样流行,MAMP在Bitnami上也很流行,这就很尴尬了。

MAMP & MAMP Pro(2015-12-14):

XAMPP(2016-04-21):

AMPPS(2015-01-03):

Payload:

%EF%BB%BF
%E2%81%AA
%E2%81%AB
%E2%81%AC
%E2%81%AD
%E2%81%AE
%E2%81%AF
%E2%80%AE
%E2%80%8C

MAMP & MAMP Pro:

AMPPS:

XAMPP:

0x03 写在最后

      虽然第三方包居多,但是想找得更全很难,毕竟是中间件的第三方包,很多站建起来就不好找是不是用这个第三方包搭建的。此漏洞完整的生命线就到这儿了,感兴趣的可以继续研究下补丁。