> 文章列表 > CVE-2019-0192 Apache Solr远程反序列化代码执行漏洞

CVE-2019-0192 Apache Solr远程反序列化代码执行漏洞

CVE-2019-0192 Apache Solr远程反序列化代码执行漏洞

预备知识
Apache Solr

      Apache Solr是一个开源的搜索服务器。具有高度可靠、可伸缩和容错的,提供分布式索引、复制和负载平衡查询、自动故障转移和恢复、集中配置等功能。

      Solr为世界上许多最大的互联网站点提供搜索和导航功能。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。

      Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:<uniqueKey>id</uniqueKey>进行描述。

实验目的
通过该实验了解cve-2019-0192产生的原因及利用方法,再最后给出了修复意见。

实验环境
Windows 7, IP地址:10.1.1.100
Kali,IP随机

实验步骤一
1.   漏洞分析:

      首先需要了解一下configAPI,主要功能是检索或修改配置。 GET负责检索,POST负责执行命令。通过传入set-property属性,构造恶意的数据,传入指向恶意的rmi服务器的链接,覆盖之前服务器的原设置,使得目标服务器与攻击者的恶意rmi服务器相连,攻击者可以使用ysoserial工具,通过rmi服务器向远端目标服务器发送命令,并在目标服务器上执行,实现远程命令执行。

2.   根据描述先看看ConfigAPI

      根据set-property的描述http://(https://lucene.apache.org/solr/guide/6_6/config-api.html#ConfigAPI-CommandsforCommonProperties
   
      可以看到,如果已经设置了属性,此命令将覆盖前面的设置

    
3.   漏洞触发点在JmxMonitoredMap.class中的newJMXConnectorServer函数中
    
      在文档(https://docs.oracle.com/javase/7/docs/api/javax/management/remote/JMXConnectorServerFactory.html)中可以看到

      参数部分:serviceurl用于指定新连接服务器的地址,environment是一组用于控制新连接器服务器行为的属性

      返回部分:表示新连接器服务器的JMXConnectorServer。每次成功调用此方法都会生成不同的对象。

      此函数可以让服务器与新的rmi服务器相连接,并且每次调用此函数都会产生一个不同的对象。所以当攻击者通过覆盖传入自己的rmi服务器地址,目标服务器就会与之相连,执行内部的命令。

4.   指向了恶意rmi服务器之后,还需要solr的反序列化操作

      在solrconfig的构造函数中可以看到

     
      创建了JmxConfiguration 对象赋值给jmxConfig

      跟踪 jmxConfig 参数如下

    
      跟入红框所示位置
    
      JmxMonitoredMap 的构造函数中就进行了 JMX 监控操作,可以触发 rmi 序列化

实验步骤二
复现:

      分别解压apache和solr

     
      将solr解压后的文件夹拷贝到Apache的webapps目录下

    
      然后打开cmd切换到solr的bin路径下


     
      输入solr -e techproducts -Dcom.sun.management.jmxremote

      启动solr

     
      会提示我们开放的端口

     
      Web端访问solr的主界面

     
实验步骤三
      切换到ysoserial的路径下并用命令启动它

      java -cp ysoserial.jar ysoserial.exploit.JRMPListener

      根据提示可知需要输入端口,类型,参数

      端口我这里设置为1234,payload_type其实指的就是jdk的版本,实验室已经提前配好环境,所以直接照输为Jdk7u21,payload_args指我们希望执行的命令,我们设置为弹计算器,所以是calc.exe

      完整的命令如下

      java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1234 Jdk7u21 calc.exe
     
      接下来切换到kali机器,使用下载包里提供的脚本poc.py进行攻击

     
      将10,12,13中的ip和port改为实际操作时的参数即可,我在上图中已经设置好了

      注意,需要使用python3来运行
     
      直接回车即可

     

      报错无关紧要,切回到win可以看到已经弹出计算器了

     

修复建议:

      升级到Apache Solr7.0或更高版本。

      通过使用系统属性disable.configEdit= true运行Solr,禁用ConfigAPI(如果未使用)

      如果升级或禁用ConfigAPI不可行,请应用SOLR-13301.patch并重新编译Solr。

      确保配置了网络设置,以便只允许受信任的流量进入/退出运行Solr的主机。
 

截图: