搭建Tomcat调试环境并分析CVE-2017-12615
准备
下载存在漏洞版本tomcat,这里下的是8.0.45
https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.45/
可执行文件和源码都需要下载
用idea打开源码文件,然后将java目录设置为源码目录
配置一下jdk
转成maven项目
添加一些依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ant/ant -->
<dependency>
<groupId>ant</groupId>
<artifactId>ant</artifactId>
<version>1.6.5</version>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
<version>1.6.2</version>
</dependency>
<dependency>
<groupId>javax.xml</groupId>
<artifactId>jaxrpc</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.jdt.core.compiler</groupId>
<artifactId>ecj</artifactId>
<version>4.5.1</version>
</dependency>
</dependencies>
配置调试环境:
指定主类
给jvm添加个参数:
-Dcatalina.home="C:\Users\yokan\Desktop\code\java\apache-tomcat-8.0.45"
现在就配置好所有环境了,运行一下看看:
复现
poc
PUT /1.jsp/ HTTP/1.1
Host: 192.167.30.37:8080
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Cookie: JSESSIONID=DE7C57127EF339EAF83C0EBCF3C45A54
Connection: close
<%out.print("TEST");%>
要触发漏洞,需要修改一下配置:
在web.xml下增加
然后就可以利用成功了
调试
Tomcat 在处理请求时有两个默认的 Servlet,一个是 DefaultServelt,另一个是 JspServlet。两个 Servlet 被配置在 Tomcat 的 web.xml 中。JspServlet 只处理后缀为.jsp 和.jspx 的请求。其他请求都由 DefaultServlet 进行处理。从这一点可以理解为何 PUT 请求时 URI 为“/1.jsp/”而不直接使用“/1.jsp”, 因为直接 PUT 请求“/1.jsp”会由 JspServlet 进行处理,而不是由 DefaultServlet 处理, 所以无法触发漏洞。
DefaultServlet程序针对每一种http请求方式都有对应的方法,漏洞复现中使用的payload中请求头为put方式,因此会被DefaultServlet程序的doPut方法拦截到,因此doPut方法是我们分析的入口。
搜索DefaultServlet:
然后找到它的doPut方法
然后下一个断点
然后重放一下请求包:
doPut方法中首先会判断readOnly,如果readOnly值为true会发送SC_FORBIDDEN错误并直接返回(SC_FORBIDDEN定义在HttpServletResponse接口中,表示403错误代码)。只有当readOnly值为false才会继续往下执行,那么readOnly值是从哪来的?其实readOnly的值就是从web.xml文件中读取的
在下面位置打个断点
步入该方法
继续步入main.write方法
进入到file方法
这里可以看到在new File这里把/3.jsp/
的后面的斜杠给去掉了
单步执行到Files.copy方法
这里可以看下dest.toPath的执行结果:
然后步入,继续运行到newOutputStream方法,
继续步入
可以看到这这里完成了文件的创建,但是内容还是为空
通过copy方法,写入了内容
总结:
tomcat任意文件写入漏洞通过一些错误配置,然后再构造特定的uri请求来绕过JspServlet,利用DefaultServlet程序的漏洞上传文件
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!