Apache Solr Velocity template RCE

  • 背景

2019年10月31日,国外的安全研究员S00pY在GitHub发布了Apache Solr Velocity模版注入远程命令执行的poc,经过测试该poc真实有效,漏洞等级严重,影响面广。目前Apache Solr官方未发布该漏洞的补丁,至少影响8.2.0及以下所有版本。

  • 前置知识

Apache solrSolr 是一个基于 Apache Lucene 之上的搜索服务器,它是一个开源的、基于 Java 的信息检索库。它旨在驱动功能强大的文档检索应用程序 - 无论您需要根据用户的查询将数据服务到何处,Solr 都可以为您服务。

VelocityResponseWriter(Velocity响应编写器):是 contrib/velocity 目录中可用的可选插件。当使用诸如 “_default”、“techproducts” 和 “example / files” 等配置时,它为浏览用户界面提供动力,目前solr默认会加载该插件。

SolrConfig.xmlsolrConfig.xml是solr中的主要配置文件,通过该文件的配置可以配置请求处理程序、web界面以及插件加载。

Config APIconfig api是以一种类似REST的API调用来远程设置solrConfig.xml,通过get或者Post方式访问/config路径,可以检索或编辑solrConfig.xml。

  • 漏洞复现

  •  环境搭建

         笔者是在windows下通过solr 8.2.0 + IDEA搭建的调试环境,具体步骤如下:

  1. 在官方网站https://lucene.apache.org/solr/downloads.html上下载源码包,下载后解压
  2. 安装Ant,由于solr源码是通过Ant管理,所以我们要先安装和配置Ant。在https://ant.apache.org/下载最新的Ant后,解压,然后配置环境变量ANT_HOME=ant安装路径,Path=;%ANT_HOME%/bin;CLASSPATH=%ANT_HOME%/lib。
  3. 如果此时直接编译solr,可能会出现找不到/.ant/lib的错误,此时需要先安装Ivy,执行命令ant ivy-bootstrap,此命令可能耗时较长,需要耐心等待
  4. 安装完成后,cd到D:\solr-8.2.0\目录下,执行ant idea,将solr编译为idea项目,编译完成后,直接导入idea即可
  5. cd到D:\solr-8.2.0\solr目录下,执行ant server,此时会生成一个默认core,目录位于solr\server\solr下
  6. 为了开启远程调试,我们需要在IDE中进行配置:

在IDE中点击Run/Debug Configurations,然后新建一个Remote:

Apache Solr Velocity template RCE

 

然后进入D:\solr-8.2.0\solr\bin目录,执行solr start -p 8988 -f -a "-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8988",同时在eclipse中点击Debug即可开始远程调试:

Apache Solr Velocity template RCE

 

  1. 由于需要远程配置config,我们需要建一个新的cores,以solr example为例,我们在D:\solr-8.2.0\solr\bin目录下执行solr create -c files -d ../example/files/conf即可建立一个名为files的cores,此时在浏览器中可以通过访问http://127.0.0.1:8988/solr/#/~cores/files确认cores是否正常开启:

Apache Solr Velocity template RCE

 

3.2           漏洞复现

         首先通过Config API修改velocity模板的默认参数:

         Apache Solr Velocity template RCE

header需要设置Content-Type为application/json格式

配置修改成功后,我们可以发现在D:\solr-8.2.0\solr\server\solr\files\conf目录下增加了一个configoverlay.json的文件,这里会存储我们的配置修改。然后我们发送payload:

Apache Solr Velocity template RCE

 

即可执行命令

  • 漏洞分析

查看solr velocity响应编写器文档,我们可以发现当params.resource.loader.enabled=true时,“params”资源加载程序允许在solr的请求参数中指定要加载的模板,例如:

http://localhost:8988/solr/files/select?q=1&&wt=velocity&v.template=custom&v.template.custom=core_name

v.template=custom表示要呈现一个名为“自定义”的模板,其值v.template.custom是自定义模板。自定义模板语法可以参考http://codingdict.com/article/23731,#开头的是Velocity的关键字,包括变量定义$set、if语句#if、循环语句#foreach,#foreach语句需要用#end结束。因此只需要将java语法转换成Velocity语法即可执行相应的操作,payload可以拆分为:

#set($x='')       

#set($rt=$x.class.forName('java.lang.Runtime'))  

#set($chr=$x.class.forName('java.lang.Character'))

#set($str=$x.class.forName('java.lang.String'))

#set($ex=$rt.getRuntime().exec('id'))

$ex.waitFor()

#set($out=$ex.getInputStream())

#foreach($i+in+[1..$out.available()])

$str.valueOf($chr.toChars($out.read()))

#end

在veclocity中,会把$x.class当作一个属性来处理,此时会去寻找$x.getClass(),而java中每个对象恰好都有getClass()方法,因此$rt=$x.class.forName('java.lang.Runtime')将等价于$x.getClass().forName(‘java.lang.Runtime’)。

         将断点打到Runtime.exec函数中,可以获取到函数调用栈:

         Apache Solr Velocity template RCE

         在SimpleNode.Class的Render函数中,会根据不同标签生成不同节点,#set会生成ASTSetDirective,变量表达式会生成ASTExpression,变量引用则会生成ASTReference,方法调用则会生成ASTMethod,然后根据生成的节点类型,调用不同类型的不同方法。最终会在ASTmethod的execute方法中调用UberspectImpl的invoke方法,而在方法内会调用doInvoke方法,最终调用method.invoke方法:

         Apache Solr Velocity template RCE

可以看到此时就会执行Runtime.exec(“calc.exe”),从而导致命令执行

  • 漏洞影响范围及修复

由于Velocity插件默认安装,因此可以影响绝大多数apache solr应用,但漏洞的成功利用需要apache solr后台对外开发且能未授权访问,因此保持后台不对外开放可降低被利用风险。

六、参考文献

https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

https://www.w3cschool.cn/solr_doc/solr_doc-umxd2h9z.html

https://leveryd.github.io/2019/03/03/Solr%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%BC%88%E4%B8%80%EF%BC%89-md/

http://codingdict.com/article/23731  https://www.securityinfo.cn/2019/10/31/%E3%80%90%E6%BC%8F%E6%B4%9E%E5%A4%8D%E7%8E%B0%E3%80%91Apache%20Solr%20Velocity%E6%A8%A1%E7%89%88%E6%B3%A8%E5%85%A5%E8%BF%9C%E7%A8%8B%E5%91%BD%E4%BB%A4%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E%E9%A2%84%E8%AD%A6/#more