1. 威客安全首页
  2. 默认分类

Apache Dubbo反序列化漏洞(CVE-2019-17564)

No.1

声明

由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,雷神众测以及文章作者不为此承担任何责任。

雷神众测拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经雷神众测允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

No.2

漏洞描述

Unsafe deserialization occurs within a Dubbo application which has HTTP
remoting enabled. An attacker may submit a POST request with a Java object in
it to completely compromise a Provider instance of Apache Dubbo, if this
instance enables HTTP.

上面这部分是官方描述,也就是说当HTTP remoting 开启的时候,存在反序列化漏洞。有一点在描述中值得注意的,也就是说它影响不只是dubbo,还有spring-web(5.1.9.RELEASE)之前。

This vulnerability can affect users using Dubbo-Rpc-Http (2.7.3 or lower) and
Spring-Web (5.1.9.RELEASE or lower).

影响版本:

  • Dubbo 2.7.0 to 2.7.4

  • Dubbo 2.6.0 to 2.6.7

  • Dubbo all 2.5.x versions

No.3

环境搭建

下载地址:https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-http


把 dubbo-samples-http 这个demo下载下来,然后修改部分内容,首先将 pom.xml 文件中的 dubbo.version 修改为 2.7.3 版本。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

其次在 pom.xml 文件中加入反序列化的 gadget ,为了方便,我选择了 CC2 的利用链中的 commons-collections4

<!– https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 –>
<dependency>
   <groupId>org.apache.commons</groupId>
   <artifactId>commons-collections4</artifactId>
   <version>4.0</version>
</dependency>

由于 dubbo 和 zookeeper 还有关系,所以搭建环境的时候需要安装这个,并且启动。当这些一切就绪之后启动demo中的org/apache/dubbo/samples/http/HttpProvider。

No.4

漏洞利用

$ java -jar ysoserial-master-55f1e7c35c-1.jar CommonsCollections2 “open /System/Applications/Calculator.app” > payload.ser

Apache Dubbo反序列化漏洞(CVE-2019-17564)

No.5

漏洞分析

从右图中的报错调用栈其实很明显定位到了最开始入口是javax.servlet.http.HttpServlet.service。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

在javax.servlet.http.HttpServlet.service处下个断点,可以看到这个地方处理HTTP请求进来的 request 和 response 。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

然后进入到org.apache.dubbo.remoting.http.servlet.DispatcherServlet中,这里会有个判断,如果handler对象等于null,就返回404告诉对方,服务没有找到,否则继续调用相关对象的handle方法进行处理。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

事实上这里dubbo支持这几种方式或者用协议来说更为合适,来进行数据的传输交互,而本次的处理HTTP协议的进入到自然是org.apache.dubbo.rpc.protocol.http.HttpProtocol这个类里面。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

而在org.apache.dubbo.rpc.protocol.http.HttpProtocol这个类中,首先会判断请求方式是否是POST,不是的话会抛出500错误,其次就是从request对象中获取远程remoteAddr和remotePort,这个不多赘述,接着就进入skeleton.handleRequest进行处理。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

跟进之后skeleton.handleRequest之后会发现调用的是 spring 的 httpinvoker ,其中 readRemoteInvocation 会处理我们传入的 request 对象。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

继续跟进 readRemoteInvocation 会发现,它返回的是RemoteInvocation.readRemoteInvocation的处理结果。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

继续跟进RemoteInvocation.readRemoteInvocation

调用 RemoteInvocationSerializingExporter#doReadRemoteInvocation 来针对数据流进行处理。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

跟进 RemoteInvocationSerializingExporter#doReadRemoteInvocation ,反序列化入口就在这里了。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

实际上可以看到的一点就是,dubbo在进行HTTP协议做数据传输的时候,走的是Java序列化,我通过wireshark抓了一个包,相信这个大家一定不陌生,从 ContentType: application/x-java-serialized-object 和报文 Body 部分的 ASCII 码可以看出,使用的是 Java Serialize 序列化,而这部分功能的实现使用的自然是 spring 的httpinvoker 功能。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

细看 spring 的docs,也做了下图可能存在反序列化的风险提示。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

No.6

漏洞修复

前面说过dubbo的http处理是通过org.apache.dubbo.rpc.protocol.http.HttpProtocol,然后是实例化一个JsonRpcServer对象skeleton来处理uri,紧接着调用 skeleton.handle
也就是com.googlecode.jsonrpc4j.JsonRpcBasicServer#handle

Apache Dubbo反序列化漏洞(CVE-2019-17564)

在com.googlecode.jsonrpc4j.JsonRpcBasicServer#handle当中没办法处理我们传输Java序列化字节流,因此就会抛出异常,也就是说这里的org.apache.dubbo.rpc.protocol.http.HttpProtocol后续处理不是通过spring httpinvoker 了,而是通过 jsonrpc 。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

wireshark再抓个包确认一下,嗯,确实是这样。

Apache Dubbo反序列化漏洞(CVE-2019-17564)

No.7

安服广州大区招聘

安全服务部广州大区致力于广东、广西、贵州、海南四省的安全检测和等级保护咨询服务业务的支撑。团队拥有非常完善的渗透测试、应急响应、安全护网的能力和经验。同时,主要负责区域内公安、金融、电力等行业的护网行动与攻防演练,拥有非常丰富的攻防演练、红蓝对抗、应急响应经验,致力于打造一个专业、团结、高效、友爱的安全服务团队。

安全服务项目经理

————————

工作地点:广州

【岗位职责】

1.协助完成渗透测试、信息安全等级保护测评、信息安全咨询、信息安全风险评估等项目的技术支持工作
2.信息安全等级保护、信息安全风险评估、报告撰写、应急响应、信息安全培训。
3.负责项目实施团队的管理,指导项目成员进行现场实施工作
4.负责项目资料、验收交付文档的收集、整理、撰写,完成项目交付工作


【任职要求】

1.熟悉信息安全相关理论知识,具有相关安全行业项目实施经验
2.至少3年以上安全服务项目管理经验,精通安全服务内容
3.工作严谨、认真负责,具有较强的沟通协调能力
4.具有PMP、CISSP、CISA等证书优先
5.本科及以上文化程度


简历投递至:jesse.min@dbappsecurity.com.cn

安全服务工程师

————————

工作地点:广州、贵阳、海口

【岗位职责】

1.为客户提供安全评估、等保测评、风险评估、安全加固、应急响应等网络安全服务,完成项目的交付工作;
2.负责对客户/合作伙伴/内部员工进行网络安全服务相关的培训
3.提供安全服务项目的售前交流、方案(标书)撰写和PPT讲解等工作


【任职要求】

1.两年以上信息安全服务相关工作经验;
2.熟悉基线扫描、安全加固、等级保护、风险评估等相关行业标准;
3.文档编写能力强,能高质量的完成项目方案、项目计划、各类项目交付物、项目报告等文档;
4.有较强的沟通能力,能够高水平完成相关人员访谈、项目汇报、日常工作沟通等工作;
5.具有信息安全相关认证证书,如CISP、CISAW证书优先,熟悉体系建设、风险评估并有相关经验者优先


简历投递至:jesse.min@dbappsecurity.com.cn

Apache Dubbo反序列化漏洞(CVE-2019-17564)

专注渗透测试技术

全球最新网络攻击技术

END

Apache Dubbo反序列化漏洞(CVE-2019-17564)

原文始发于微信公众号(雷神众测):Apache Dubbo反序列化漏洞(CVE-2019-17564)

本文转为转载文章,本文观点不代表威客安全立场。

发表评论

登录后才能评论