Tomcat 远程代码执行漏洞分析(CVE-2017-12615)及补丁 Bypass

9 月 19 日,腾讯云安全中心监测到 Apache Tomcat 修复了2个严重级别的漏洞, 分别为: 信息泄露漏洞(CVE-2017-12616)、远程代码执行漏洞(CVE-2017-12615),在某些场景下,攻击者将分别能通过这两个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意 JSP 文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码。

云鼎实验室通过对于漏洞描述,搭建漏洞环境,并对其进行复现。此漏洞为高危漏洞,即使是非默认配置,但是一旦存在漏洞,那么攻击者可以成功上传 Webshell,并控制服务器。

复现

根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码。

通过阅读 conf/web.xml 文件,可以发现:

Tomcat 远程代码执行漏洞分析(CVE-2017-12615)及补丁 Bypass

默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控。

配置 readonly 为 false:

启动 Tomcat,利用 PUT 请求创建文件:

Tomcat 远程代码执行漏洞分析(CVE-2017-12615)及补丁 Bypass

提示 404。通过描述中的 Windows 受影响,可以结合 Windows 的特性。其一是 NTFS 文件流,其二是文件名的相关限制(如 Windows 中文件名不能以空格结尾)来绕过限制:

访问发现可以正常输出:

Tomcat 远程代码执行漏洞分析(CVE-2017-12615)及补丁 Bypass

分析

Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过JspServlet处理请求的:

而其他的静态文件是通过DefaultServlet处理的:

可以得知,“1.jsp ”(末尾有一个和空格)并不能匹配到 JspServlet,而是会交由DefaultServlet去处理。当处理 PUT 请求时:

会调用resources.bind:

dirContext 为FileDirContext:

调用 rebind创建文件:

又由于 Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。

Bypass 分析

然而,经过黑盒测试,当 PUT 地址为/1.jsp/时,仍然会创建 JSP,会影响 Linux 和 Windows 服务器,并且 Bypass 了之前的补丁,分析如下。

在进入 bind 函数时,会声明一个 File 变量:

进入 File 后,会对 name 进行 normalize

最后得到的 path 就是没有最后 / 的 path 了:

影响

由于存在去掉最后的 / 的特性,那么这个漏洞自然影响 Linux 以及 Windows 版本。而且经过测试,这个漏洞影响全部的 Tomcat 版本,从 5.x 到 9.x 无不中枪。目前来说,最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,才能防止漏洞。

本文作者:腾讯云安全团队,转载请注明来自FreeBuf.COM

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏安恒信息

安全漏洞公告

Apache Roller OGNL表达式注入远程代码执行漏洞发布时间:2013-11-27漏洞编号:BUGTRAQ ID: 63928 CVE(CAN...

3076
来自专栏友弟技术工作室

(效率人生)MAC必备工具Alfred入门使用前言如何获取Alfred如何打开AlfredGeneral(通用界面)Features(特性界面)Advanced(高级设置)

1. General:通用; 2. Features:特性; 3. Workflows:工作流; 4. Appearance:外观; 5...

651
来自专栏我的博客

DW支持jquery语法提示

第一种方法: 下载组建[点击下载jQuery_api_for_dwcs5] 1.把shared、Extensions、codehints三个文件夹复制到 ...

2553
来自专栏Crossin的编程教室

【Python 第20课】 命令行常用命令

【Python 第20课】 命令行常用命令 今天茬开话题,说一下命令行(Windows下叫“命令提示符”,Mac下叫“终端”)里的常用命令。已经熟悉同学可略过。...

3145
来自专栏Android群英传

如何让 Mac 版微信客户端防撤回

1413
来自专栏FreeBuf

解析针对知名密码存储软件LastPass的钓鱼攻击

最近作者发现了一个针对LastPass的钓鱼攻击,其允许攻击者窃取一个LastPass用户的邮箱、密码甚至二次验证的验证码,这就使得攻击者可以完全获取到用户存储...

1898
来自专栏分享达人秀

安装Android模拟器,准备开发

完成以上所有步骤(JDK、ADT Bundle、SDK),那么就可以开始进行Android开发了。 Android程序必须运行在Android系...

2706
来自专栏Web 开发

分层解耦,理想很美好,现实很残酷

自从实习以来,不是第一次有这种想法了。 今天弄一个简单的发邮件功能,使用PHP自带的mail()函数实现,基本就照着php.net上面的例子来写,结果… 情...

560
来自专栏菩提树下的杨过

silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法

环境:英文版vs2010 sp1 + vs2013 RC 90天体验版 原来可以正常做silverilght 4 项目开发,今天因为vs2013 RC过了90天...

1845
来自专栏小樱的经验随笔

CTF---安全杂项入门第三题 这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?

这是捕获的黑客攻击数据包,Administrator用户的密码在此次攻击中泄露了,你能找到吗?分值:30 来源: 2014sctf 难度:难 参与人数:3918...

3659

扫码关注云+社区