8.3.1 不必要的Web服务器扩展

历史上最严重的一些Web平台攻击源于扩展基本Web服务器HTTP功能的附加程序中的软件缺陷。Web平台入侵的典范包括IISHack、.printer和.ida(红色代码蠕虫的基础)等IIS漏洞利用攻击。Apache也遇到类似的问题,比如mod_ssl催生了Slapper蠕虫,我们在第3章说明了对这些类型漏洞的利用。

你可能会说:“真可怕!但是这些难道不都是与软件缺陷相关的吗?和错误的配置有什么关系?”我们在讨论中包含这些问题的原因是为了强调我们所认为的Web平台部署中最关键也是最常见的漏洞之一:启用不恰当和没有必要的Web服务器扩展。Web服务器上这些扩展的可用性直接受Web服务器管理员的控制(即使软件提供商在默认情况下安装这些扩展!),因此在这里介绍。

Apache Tomcat Mod_JK.SO任意代码执行漏洞

我们将深入地研究历史,提供一个好的例子,阐述安装这样的扩展而没有合适维护时所可能发生的情况:Apache Tomcat Mod_JK.SO任意代码执行漏洞。

在2007年3月,Tipping Point的零日漏洞防御计划(Zero Day Initiative,ZDI)公布,在Apache Tomcat JK Web Server Connector中发现了基于栈的缓冲区溢出。这个连接器是用于连接Apache Tomcat servlet容器和Apache之类的Web服务器的一个Apache模块(mod_jk)。这个模块本质上是将Apache Web服务器接收到的HTTP请求转发给Tomcat servlet容器。

这个漏洞的出现是因为该连接器没有对入站URL进行正确的边界检查,使攻击者能够通过一个带有长URL的HTTP请求造成缓冲区溢出。和许多这类漏洞一样,互联网上很快充斥着公开的漏洞利用代码。大部分利用代码包括发送一个特别制作的缓冲区,利用漏洞并且执行代码在预先定义的端口上启动一个监听程序,在攻击者连接时发回一个外壳程序。攻击者所要做的就是运行这个利用程序,然后连接到于定义的端口。在下面的例子中,我们说明包含在Metasploit中的这种漏洞利用程序的用法:


auser@ubuntu$./msfcli windows/http/apache_modjk_overflow
payload=windows/shell_bind_tcp rhost=192.168.1.109 E
[*] Please wait while we load the module tree...
[*] Started bind handler
[*] Trying target mod_jk 1.2.20 (Apache 1.3.x/2.0.x/2.2.x) (any win32
OS/language)...

执行利用程序之后,攻击者所需要做的是连接到目标需同的TCP 8888端口,获得对命令提示符的访问:


auser@ubuntu$telnet 192.168.1.109 8888
Trying 192.168.1.109...
Connected to 192.168.1.109.
Escape character is '^]'.
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
c:\program files\apache group\apache>

Web服务器扩展对策

我们希望这个小小的场景能够说明,对你的Web平台所能做的最关键的配置之一是禁用所有不是绝对必要的附加程序/扩展模块,保证必要的扩展打上了最新的安全补丁。管理员很少忘记更新Web服务器,但是常常忘记了扩展和模块的更新。IIS 6是最好的示范,曾经遭受附加扩展的各种问题的困扰,现在默认关闭所有扩展。如果Microsoft对禁用扩展的重要性表示同意,并且找到了一种禁用方式,能够不伤害他们销售额达到数十亿美元的绝妙软件特性,那么你也可以做到。下面是在最流行的Web服务器(本书编写的时候)——IIS和Apache上删除不必要的扩展映射的方法。

禁用IIS上的扩展: 为了在IIS 5上禁用不需要的扩展:

1.打开IIS管理工具(从Windows菜单上运行iis.msc)。

2.右键单击希望管理的计算机,选择Properties(属性)|Master Properties(主属性)|WWW Service;然后点击Edit(编辑),选择Properties of the Default Web Site(默认网站属性)|Home Directory(主目录)|Application Settings(应用程序设置)|Configuration(配置)|App Mappings(应用程序映射)。

3.在最终的屏幕上,删除想要禁用的扩展的映射。图8-2显示选中了.printer到msw3prt.dll的映射。

图8-2 在IIS管理工具(iis.msc)中删除.printer扩展的映射

在IIS 6上,也使用IIS管理工具,但是要注意在这个版本中,Microsoft将扩展整理到“Web Service Extensions(Web服务扩展)”节点下。从这个屏幕,直接选择希望禁用的扩展,点击Prohibit(禁止)按钮。

在Apache中禁用模块: 为了禁用Apache中的模块,在编译之前使用配置脚本,传入所有应该禁用的模块。特定版本的Apache中配置脚本的正确语法如下:


Apache 1.x: ./configure --disable-module=userdir
Apache 2.x: ./configure --disable-userdir

注意:这种方法用于删除Apache中的内建模块,不适用于动态模块。