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的基础层主要是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
网友评论