apache mod_rewrite模块命令执行(CVE-2013-1862)漏洞研究

工作中扫描发现apache mod_rewrite模块命令执行(CVE-2013-1862)漏洞,对于该漏洞,我们做出如下验证与研究:

1. 漏洞信息
c1
该漏洞是利用modules/mappers/mod_rewrite.c文件中的Rewritelog()函数不正确的处理某些转义序列,导致恶意攻击者发送特制的HTTP请求可以注入到日志文件,如果HTTP请求包含终端模拟器的转义序列,可能允许攻击者无需管理员权限即可执行命令。Apache 2.2.25之前的2.2.X版本存在该漏洞。

问题是发现在apache的mod_rewrite模块,mod_rewrite模块通过RewriteLog函数记录rewrite操作的日志,但RewriteLog函数却没有过滤某些转义序列,将用户的数据直接写入了LogFile里。
CVE-2013-1862的漏洞的本质:
(1) RewriteLog函数没有对用户的输入数据进行终端转义字符过滤
(2) 实质上应该是Mod_Rewrite的日志文件漏洞,而不是Apache的日志文件

2.漏洞研究与验证:
(1)什么是转义字符(escape character)?
很久很久以前,电脑操作员只能通过键盘,在黑漆漆的终端中输入命令,跟那些隐藏在屏幕之后的计算机对话。
他们很快发现,有些字符不能打出来,比如换行,怎么在字符串表示一个换行呢?换行符打不了呀,毕竟键盘那么小,如果给换行符一个键,那么同样也得给回车符、制表符或者什么鬼符留一个键。这么下来键盘就只有章鱼能用啦。另外这些换行符在终端界面上怎么显示出来呢?当时的终端屏幕也就能支持ASCII字符,很难拿出一个稀奇古怪的符号来表示换行。
还好聪明的操作员们发明了一种机制,就是用\作为转义字符。这么一来,键盘上的键就可以跟\组合起来用了,比如\t,\n。妈妈再也不用担心我没字符用了!操作员们给这种字符起了个好听的名字,叫转义字符。
比如,我们在终端输入echo -e ‘\n’,看下效果:

c2
转义字符‘\n’就代表换行。

(2)什么是转义序列(escape sequence)?
转义序列(escape sequence)是一系列由ASCII转义字符(0x1B)开始的字符序列,并附带特殊的参数构成,转义序列一般原用于控制显示设备如终端,现在扩展在大多数操作系统中允许多种形式的交互。转义序列可以用于更改文本属性(颜色,宽度),移动鼠标位置,重配置键盘,更新窗口标题,或者操作打印机等。

(3)关于Apache mod_rewrite模块
Apache 官网描述“The mod_rewrite module uses a rule-based rewriting engine, based on a PCRE regular-expression parser, to rewrite requested URLs on the fly. By default, mod_rewrite maps a URL to a filesystem path. However, it can also be used to redirect one URL to another URL, or to invoke an internal proxy fetch.”,简单来说,Rewirte主要的功能就是基于一些规则实现URL的跳转或重写。
开启 mod_rewrite:
环境:Redhat6.5,apache 2.2.22

 cd ./httpd-2.2.22/modules/mappers/
/usr/local/apache/bin/apxs -c mod_rewrite.c 
/usr/local/apache/bin/apxs -i -a -n mod_rewrite mod_rewrite.la  

如果没有什么错误的话,应该在apache的modules目录中编译出一个mod_rewrite.so文件
c3
接着修改httpd.conf配置文件:
c4
确保已加载rewrite模块,接着在httpd.conf配置重写规则、开启rewritelog
c5
重写的规则大致是:如果页面不存在,跳转到404.html页。接着需要重新启动apache

(4)POC
网上的POC

;PS1="\[\e]0;Be Hacked\a\]hacker@\h:\w\$"su;  

我们在页面中跟上上面的POC
c6
这样就触发了rewrite规则,被记录到rewritelog中,
c7
可以看到,rewritelog对这个poc的一些转义字符(如\e)直接记录,没有过滤,我们对比一下apache的accesslog和errorlog的内容
c8
c9
可见,这两个log内容都对POC中的转义字符进行了处理。
如果管理员再用终端查看被注入POC的rewritelog,就会执行攻击者设定好的命令:
c10

3.总结:

Apache 2.2.25之前的2.2.X版本且开启mod_rewrite模块的服务器存在该漏洞,触发条件较难,需要由管理员通过终端查看rewrite日志,因此比较适合APT类的攻击。



blog comments powered by Disqus