搭建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程序的漏洞上传文件

相关推荐
数据知道3 分钟前
Windows 安全基线:组策略、UAC、Defender 深度配置
windows·安全·网络安全
用户409666013175115 分钟前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范
梅头脑20 分钟前
交易跨10个库、日均千万订单——选错一次分布式事务方案,加班三个月重写
java·分布式
久久学姐33 分钟前
基础转码学 AI:Java+Python 双语言入门,3 个月可落地实战项目
java·python·ai·转码·实战项目
花生了什么事o35 分钟前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言
长不胖的路人甲2 小时前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
明天…ling2 小时前
Upload-Labs (Pass1-Pass21) 完整通关思路与源码分析
android·网络安全·渗透测试·burpsuite·upload-labs·文件上传绕过·靶场复现
IT_Octopus2 小时前
Spring Boot 线程池关闭:destroyMethod 的作用与最佳实践
java·spring boot·后端
亦暖筑序3 小时前
AgentScope-Java 入门:完善 Vue 前端、发布 GitHub,并规划下一步
java·前端·vue.js
wddptwd283 小时前
android studio 报错怎么处理 java.lang.NullPointerException
android·java·android studio