更多全球网络安全资讯尽在邑安全

www.eansec.com

‍‍‍‍

0x01 漏洞描述

Solr 是Apache软件基金会开源的搜索引擎框架,其中定义的ConfigAPI允许设置任意的jmx.serviceUrl,它将创建一个新的JMXConnectorServerFactory工厂类实例对象,并通过对目标RMI / LDAP服务器的’bind’操作触发调用。 远程恶意RMI服务器可以响应任意的对象,Solr端使用java中ObjectInputStream类将接收到的对象进行不安全的反序列化过程。使用ysoserial工具可以利用此类漏洞,根据目标Classpath环境,攻击者可以使用其中特定的“gadget chains”在Solr端触发远程代码执行。

风险等级:High

影响版本:5.0.0 to 5.5.5      6.0.0 to 6.6.5

0x02 漏洞分析

Solr初始化及启动过程:研究solr启动过程,首先需要从War包中加载的配置文件web.xml入手,其中所有的访问请求统一路由到SolrDispatchFilter类中处理,其主要的作用包括加载solr配置文件、初始化各个core、初始化各个requestHandler和component:

查看了该类的继承结构:

BaseSolrFilter,是一个实现Filter接口的抽象类,功能很简单,就是判断当前程序是否开启正常的日志记录功能:

作为具体类的SolrDispatchFilter必须实现Filter接口中定义的如下三个抽象方法:

其中doFilter方法拦截所有的http请求,下面跟进下SolrDispatchFilter类中的doFilter具体方法:

首先定位到用于处理请求数据的接口SolrRequestHandler,其中定义的抽象方法handleRequest中分别传入了用于处理请求的接口SolrQueryRequest和处理响应的接口SolrQueryResponse,在IDEA中查看接口的实现类,发现只有抽象类RequestHandlerBase实现了上述接口:

跟进抽象类RequestHandlerBase,其重写了抽象方法handleRequest,并在其中调用了handleRequestBody抽象方法:

为进一步了解handleRequestBody方法的实现过程,根据继承关系图发现,SolrConfigHandler具体类继承了抽象类RequestHandlerBase:

进一步跟进SolrConfigHandler具体类,发现其重写了上述的handleRequestBody抽象方法,并在方法体中首先判断HTTP请求参数是否为POST,若一致则调用command.handlePOST()方法:

根据公开POC表明漏洞利用过程是通过POST方式触发,则进一步跟进command.handlePOST()方法:

跟进其调用的handleCommands(opsCopy, overlay)方法,其中使用switch函数对传入的方法名做了选择判断,SET_PROPERTY常量字符串对应于set-property方法:

由于公开POC显示在构造恶意Json数据时使用了set-property属性:

所以继续跟进上图case分支中的applySetProp(op, overlay)方法:

跟进setProperty方法,方法体中将POST参数转换后,调用有参类型的ConfigOverlay构方法生成新的ConfigOverlay对象,方法调用结束后通过return函数将其返回到上文调用方法handleCommands的overlay变量中:

上文handleCommands方法在接收到正常的overlay返回值后,调用break子句结束了for循环遍历操作符过程,继续向下执行:

Solr资源加载器通过当前请求对象的getCore().getResourceLoader()方法创建了新的加载器对象loader。通过if条件判断loader是否为zookeeper分布式集群ZkSolrResourceLoader类的实例对象。受本地环境限制,此时会执行else代码块中的单机模式。继续跟进persistConfLocally(loader, ConfigOverlay.RESOURCE_NAME, overlay.toByteArray())方法,其中传入的实参RESOURCE_NAME是如下常量字符串:

调用File类的构造函数创建confFile实例对象,并通过OutputStream输出流中的write方法将configoverlay.json文件内容在磁盘中做持久化存储:

反向追踪RESOURCE_NAME常量的调用过程,发现SolrConfig类加载了该配置文件:

为了清晰的了解Solr容器的启动过程,需要从org/apache/solr/core/CoreContainer类中定义的reload(String name)方法入手:

其中传递的参数String name是需要重新加载的SolrCore,当重新加载时,其所属的配置文件也将从新加载,继续跟进getConfig方法:

其中调用的createSolrConfig方法用于重新加载配置文件,跟进SolrConfig类结构,发现其定义了重载的构造方法:

当非初始化时,调用getOverlay()方法:

跟进getConfigOverlay方法,其资源加载器确实加载了上文中定义的配置文件,并和上述的方法调用过程相吻合:

继续执行构造函数,通过JmxConfiguration构造函数接收用户传递参数并赋值给jmxConfig对象:

逆向追踪jmxConfig调用过程:

发现SolrCore中通过if条件对是否开启JMX做了判断,若为false,则通过JmxMonitoredMap构造方法返回一个新的对象:

跟进JmxMonitoredMap有参构造函数,其中通过JMXConnectorServerFactory工厂类创建了JMXConnectorServer类的实例对象并调用start()方法向远程RMI服务器发送请求:

当获取远程RMI服务器恶意序列化对象后的反序列化调用链可以参考ysoserial的7u21的漏洞利用过程。

0x03 漏洞利用

  1. 靶机中开启Solr服务,并监听本地8983端口:

  1. 攻击机使用ysoserial攻击创建RMI服务并监听1099端口:

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

  1. 攻击机发送POC请求,Solr端返回了500状态码:

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

0x04 修复方案

* 升级到Apache Solr 7.0或更高版本。

* 通过设置系统属性值 “disable.configEdit=true”禁用未被使用的ConfigAPI。

* 若上述升级或禁用Config API不是可行的解决方案,请下载安全公告[1]中的补丁SOLR-13301.patch并重新编译Solr,在新发布的补丁中发现已经禁用了JMX中的serviceUrl属性:

* 确保配置了正确的网络访问控制策略设置,只允许受信任的流量进入或退出运行Solr服务的主机。

转自安全客

欢迎收藏并分享朋友圈,让五邑人网络更安全

欢迎扫描关注我们,及时了解最新安全动态、学习最潮流的安全姿势!

推荐文章

1

新永恒之蓝?微软SMBv3高危漏洞(CVE-2020-0796)分析复现

2

重大漏洞预警:ubuntu最新版本存在本地提权漏洞(已有EXP) 

rmi远程代码执行漏洞_Apache Solr反序列化远程代码执行漏洞分析(CVE20190192)相关推荐

  1. rmi远程反序列化rce漏洞_Oracle WebLogic 反序列化远程命令执行漏洞预警

    报告编号:B6-2019-041901 报告来源:360-CERT 报告作者:360-CERT 更新日期:2019-04-19 0x00 事件背景 2019年4月17日,国家信息安全漏洞共享平台(CN ...

  2. rmi远程反序列化rce漏洞_Apache Dubbo Provider默认反序列化远程代

    背景 近日,Apache Dubbo披露了Provider默认反序列化远程代码执行漏洞(CVE-2020-1948),攻击者可构造恶意请求,从而执行任意代码.具体信息如上图所示. 在官方邮件中,漏洞报 ...

  3. fastjson反序列化漏洞_【安全风险通告】fastjson反序列化远程代码执行漏洞安全风险通告...

    近日,奇安信CERT监测到fastjson官方发布新版本,修补了一个反序列化远程代码执行漏洞.远程攻击者可利用该漏洞绕过autoType限制,进而可在目标服务器上执行任意命令.鉴于该漏洞影响较大,建议 ...

  4. Oracle CoherenceWebLogic反序列化远程代码执行漏洞安全风险通告

    近日,奇安信CERT监测到包含在1月份Oracle关键补丁程序更新CPU(Critical Patch Update)的漏洞,Oracle Coherence反序列化远程代码执行漏洞(CVE-2020 ...

  5. Weblogic反序列化远程代码执行漏洞(CVE-2019-2725)

    漏洞简述 2019年4月17日,CNVD 发布<关于Oracle WebLogic wls9-async组件存在反序列化远程命令执行漏洞的安全公告>,公告指出部分版本WebLogic中默认 ...

  6. java list%3ca%3e排序_Apache Solr 远程命令+XXE执行漏洞(CVE-2017-12629)

    Apache Solr 最近有出了个漏洞预警,先复习一下之前的漏洞 #命令执行 ##先创建一个listener,其中设置exe的值为我们想执行的命令,args的值是命令参数 POST /solr/de ...

  7. android fastjson漏洞_【漏洞预警】Fastjson 远程代码执行漏洞(暂无PoC)

    Fastjson简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库.它采用一种"假定有序快速匹配"的算法,把JSON Parse的性能提升到极致,是目前Jav ...

  8. 详述WebLogic反序列化远程命令执行漏洞的处理过程,云和恩墨技术通讯精选

    各位亲爱的用户/读者朋友们: 为了及时共享行业案例,通告共性问题,达成知识共享和提前预防,我们整理和编辑了<云和恩墨技术通讯>(5月刊),通过对过去一段时间的知识回顾和故障归纳,以期提供有 ...

  9. thinkphp5+远程代码执行_ThinkPHP5 5.0.23 远程代码执行漏洞

     漏洞描述 ThinkPHP是一款运用极广的PHP开发框架.其5.0.23以前的版本中,获取method的方法中没有正确处理方法名,导致攻击者可以调用Request类任意方法并构造利用链,从而导致远程 ...

最新文章

  1. vue、cnpm不是内部文件_vue文件通过cnpm install后无法用npm run serve打开
  2. Spring配置问题——元素 quot;context:component-scanquot; 的前缀 quot;contextquot; 未绑定...
  3. python venv下安装mysql出错 解决方法
  4. Spring-AOP 通过配置文件实现 引介增强
  5. 互联网运营面试题_产品运营成长必修课:做好项目复盘
  6. Junit单元测试学习笔记一
  7. 第三天【DOM4J Xpath】
  8. 一份我们团队Java开发的开发规范,参考了阿里巴巴Java开发手册终极版v1.3.0
  9. 使用说明 思迅收银系统_使用自助收银系统让消费者自助结算更便捷高效?
  10. matlab s函数_matlab结构体 rmfield,arrayfun,structfun,struct2cell,cell2struct
  11. linux系统 mysql日志文件太大。造成数据库无法正常启动怎么解决
  12. 如何使用GoldWave软件将文字转换为语音
  13. 重拾C++之虚函数和虚基类以及抽象类
  14. jade安装及基本语法使用
  15. 成为一名二进制分析师需要用到的Linux二进制分析工具有哪些?
  16. 分布式 HTAP 数据库 ADB PG 架构解析
  17. 【游戏运营】【实战】首充分析——恋与制作人
  18. [CF1528F]AmShZ Farm
  19. 员工培训案例分析答案_?消防经典案例试题答案:安全管理案例分析
  20. python多久可以学c语言,会C语言 学C++到熟练要多久?

热门文章

  1. 数据有为 智在决策 | 观远数据2019智能决策峰会圆满落幕
  2. 来!把 5000 微信好友头像拼成一张图!
  3. 光凭 5G 根本无法解决宽带问题!
  4. 微信的 Bug 差点让我被老板炒鱿鱼!
  5. java 下载项目中的文件_java 下载web项目目录下的文件
  6. 真牛!打开mysql
  7. keepalived原理和安装
  8. Zookeeper的Leader选举-选举过程介绍比较清晰
  9. 21川大计算机学硕缩招,重大变动!21考研学硕缩招?别着急,还有个好消息
  10. java futuretask 源码解析_Java异步编程——深入源码分析FutureTask