Apache Solr RCE漏洞 (CVE-2019-1240

2020-08-05  本文已影响0人  AxisX

1. 漏洞详情

Apache Solr的8.1.1和8.2.0版本的自带配置文件solr.in.sh中存在ENABLE_REMOTE_JMX_OPTS="true"选项。如果使用受影响版本中的默认solr.in.sh文件,那么将启用JMX监视并将其暴露在RMI_PORT上(默认值= 18983),并且无需进行任何身份验证。 如果防火墙中的入站流量打开了此端口,则具有Solr节点网络访问权限的任何人都将能够访问JMX,并且可以上传恶意代码在Solr服务器上执行。该漏洞不影响Windows系统的用户,仅影响部分版本的Linux用户。

2. 复现环境

solr8.2.0版本下载地址:https://archive.apache.org/dist/lucene/solr/8.2.0/

wget https://archive.apache.org/dist/lucene/solr/8.2.0/solr-8.2.0.zip
unzip solr-8.2.0.zip # 解压
切入到bin文件夹
./solr start -force
solr

查询kali的ip,连接8983端口


8983端口

然后用nmap对ip地址下的端口进行探测。


探测端口

msfconsole进入msf,使用msf中的exploit/multi/misc/java_jmx_server模块可以成功连接。


msf攻击

可以看到msf攻击时,首先去连接ip,发送RMI头部,发现了JMXRMI的尾端,在18983端口,发送握手。这个是连接JMX的过程,后面是发送payload

whireshark开启抓包,filter中输入tcp.port==18983对18983端口内容进行过滤。


follow tcp stream

对于此漏洞的检测,可以通过JMX流量特征来进行。


流量特征

具体脚本如下:

# coding: utf-8
from pocsuite.api.poc import POCBase, Output
from pocsuite.api.poc import register
import urlparse
import re
import socket
import time


class TestPOC(POCBase):
    vulID = '''pcmgr-'''
    version = '1'
    vulDate = '2019 00:00:00 GMT+0800 (China Standard Time)'
    author = 'pcmgr'
    createDate = '2020-7-30'
    updateDate = ' Jul 30 2020 15:37:23 GMT+0800 (China Standard Time)'
    references = ''''''
    name = '''Apache Solr RCE漏洞'''
    cve = 'CVE-2019-12409'
    appPowerLink = ''
    appName = 'Apache Solr'
    appVersion = '8.1.1&8.2.0'
    vulType = '命令执行'
    vulGrade = '高危'
    vulRepair = '''将solr.in.sh配置文件中的ENABLE_REMOTE_JMX_OPTS选项设置为false,然后重启Solr服务'''
    desc = '''Apache Solr 受影响版本中的默认solr.in.sh文件自动启用JMX监视并将其暴露在RMI_PORT上(默认值= 18983),并且无需进行任何身份验证。 如果防火墙中的入站流量打开了此端口,则具有Solr节点网络访问权限的任何人都将能够访问JMX,并且可以上传恶意代码在Solr服务器上执行。'''
    samples = ''''''''

    def _attack(self):
        return self._verify()

    def _verify(self):
        result = {}
        url_parsed=urlparse.urlparse(self.url)

        url_netloc=url_parsed.netloc
        url_element=url_netloc.split(":")
        dHOST = url_element[0]
        if len(url_element)>1:
            dport = int(url_element[1])
        else:
            dport=80 #默认端口为80
        timeout = 3
        delay = 1
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.settimeout(timeout)
        try:
            sock.connect((dHOST, dport))
        except socket.timeout:
            return False, {'msg': 'connection timeout.'}

        s1 = '4a524d4900024b000000000000'
        s1_bytes = str(s1.decode('hex'))
        sock.send(s1_bytes)
        time.sleep(delay)
        res = sock.recv(1024)
        if re.search(b'N\x00', res):
            print('[+] handshake successfully!')
        s2 = '50aced00057722000000000000000000000000000000000000000000000000000244154dc9d4e63bdf7400066a6d78726d69'
        s2_bytes = str(s2.decode('hex'))
        sock.send(s2_bytes)
        time.sleep(delay)
        res = sock.recv(1024)
        if re.search(b'Q\xac\xed', res):
            print('[!!] vulberable')
            result['VerifyInfo'] = {}
            result['VerifyInfo']['URL'] = dHOST
            result['VerifyInfo']['PORT'] = dport
        return self.parse_output(result)

    def parse_output(self, result):
        # parse output
        output = Output(self)
        if result:
            output.success(result)
        else:
            output.fail('Internet nothing returned')
        return output


register(TestPOC)

修复方案
该漏洞的修复方案是将solr.in.sh配置文件中的ENABLE_REMOTE_JMX_OPTS选项设置为false,然后重启Solr服务。

3. JMX

JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。WebLogic管理页面基于JMX开发,JBoss则基于JMX架构。

JMX结构
JMX的基础层主要是MBean,即被管理的资源。适配层为MBeanServer主要提供对资源的注册和管理。接入层提供远程访问的入口。
基于JMX的攻击可以看https://mogwailabs.de/blog/2019/04/attacking-rmi-based-jmx-services/,后续可以再深入研究一下JMX的攻击。

上面流量我写的是检测过程,包含攻击脚本的可以看如下的一些链接
1.https://github.com/shadowsock5/Poc/blob/0d1e80b7edf6f17a6f8dad37c406186dd2efca92/Solr/Solr_CVE_2019_12409.py#L64

2.https://github.com/jas502n/CVE-2019-12409

上一篇下一篇

猜你喜欢

热点阅读