精华内容
下载资源
问答
  • 2020年4月weblogic最新补丁合集,涉及版本Oracle Weblogic 10.3.6.0.0、Oracle Weblogic 12.2.1.3.0、Oracle Weblogic 12.2.1.4.0
  • 2020年4月weblogic最新补丁合集,涉及版本Oracle Weblogic 10.3.6.0.0、Oracle Weblogic 12.2.1.3.0、Oracle Weblogic 12.2.1.4.0
  • 声明:请应用在进行补丁升级安装前做好相关备份操作。 适用范围:本文档示例为Windows操作系统下,weblogic版本为10.3.6的环境。...最新补丁信息: 补丁包:p31162736_10360200414_Generic.zip 发布时间:2020年7月

    声明:请应用在进行补丁升级安装前做好相关备份操作。

    适用范围:本文档示例为Windows操作系统下,weblogic版本为10.3.6的环境。

    Oracle linux、centos等其他Linux系统,以及其他版本weblogic软件的补丁安装步骤基本相同,请自行“获取其他版本补丁”,以及将文档中“.cmd后缀更换为.sh”、“更换为实际weblogic安装目录”或查阅官方文档。

    最新补丁信息:

    补丁包:p31162736_10360200414_Generic.zip

    发布时间:2020年7月3日

    补丁下载:https://download.csdn.net/download/qq_20712595/12629505

    漏洞信息:Oracle官方2020年7月补丁集(PSU),解决最新发现的weblogic的T3 和 IIOP 协议缺陷导致的“远程代码执行漏洞”。

    CVE-2020-14625、CVE-2020-14644、CVE-2020-14687 影响 版本:

    WebLogic 12.2.1.3.0

    WebLogic 12.2.1.4.0

    WebLogic 14.1.1.0.0

    CVE-2020-14645 影响版本:

    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

     

    具体操作步骤如下

    一、停止weblogic服务

    补丁安装前需停止weblogic服务进程。

    不停止服务,补丁安装过程中将无法自动备份文件,导致安装失败。

    二、补丁程序安装

    安装准备。
    ①将补丁包p31162736_10360200414_Generic.zip上传至%\Oracle\Middleware\utils\bsu\cache_dir\%目录并解压,如从未安装过补丁需创建cache_dir目录。

    ②如从未安装过补丁需调整内存,进入%\Oracle\Middleware\utils\bsu\%目录,调整bsu.cmd中的内存参数,避免安装过程中提示内存溢出。

    一般设置set MEM_ARGS=-Xms2048m –Xmx4096m ,可根据系统内存情况自行调整。

     

    2、补丁安装

    ①进入%\Oracle\Middleware\utils\bsu\%目录,运行CMD窗口

    使用如下命令,安装补丁

    bsu.cmd -install -patch_download_dir=E:\Oracle\Middleware\utils\bsu\cache_dir -patchlist=1VUU -prod_dir=E:\Oracle\Middleware\wlserver_10.3

    ②未检测到冲突忽略本条。如有冲突,卸载冲突补丁。

    ③补丁安装完成后,使用如下命令,确认补丁状态。

    bsu.cmd -prod_dir=E:\Oracle\Middleware\wlserver_10.3 -status=applied -verbose -view

    三、启动weblogic服务

    启动服务并检查应用是否正常。
     

    展开全文
  • 声明:请应用在进行补丁升级安装前制定应用回退方案并做好相关备份操作。 适用范围:本文档示例为Windows操作系统下,weblogic版本为10.3.6的环境。...最新补丁信息: 补丁包:p30857748_1036_Ge...

    声明:请应用在进行补丁升级安装前做好相关备份操作。

    适用范围:本文档示例为Windows操作系统下,weblogic版本为10.3.6的环境。

    Oracle linux、centos等其他Linux系统,以及其他版本weblogic软件的补丁安装步骤基本相同,请自行“获取其他版本补丁”,以及将文档中“.cmd后缀更换为.sh”、“更换为实际weblogic安装目录”或查阅官方文档。

    最新补丁信息:

    补丁包:p30857748_1036_Generic.zip

    发布时间:2020年4月15日

    补丁下载:https://download.csdn.net/download/qq_20712595/12354084

    漏洞信息:Oracle官方发布了2020年4月关键补丁更新公告CPU(Critical Patch Update),修复了397个不同程度的漏洞。其中包括三个针对Weblogic的严重漏洞(CVE-2020-2801、CVE-2020-2883、CVE-2020-2884)和一个Oracle Coherence远程代码执行漏洞(CVE-2020-2915)。本次四个漏洞均为T3协议存在缺陷、未经身份验证的攻击者可通过此类漏洞实现远程代码执行,CVSS评分均为9.8,利用复杂度低。建议用户尽快采取措施,对上述漏洞进行防护。

    受影响的版本包括:

    Oracle Weblogic 10.3.6.0.0

    Oracle Weblogic 12.1.3.0.0

    Oracle Weblogic 12.2.1.3.0

    Oracle Weblogic 12.2.1.4.0

     

    具体操作步骤如下

    一、停止weblogic服务

    补丁安装前需停止weblogic服务进程。

    不停止服务,补丁安装过程中将无法自动备份文件,导致安装失败。

    二、补丁程序安装

    1. 安装准备。

    ①将补丁包p30857748_1036_Generic.zip上传至%\Oracle\Middleware\utils\bsu\cache_dir\%目录并解压,如从未安装过补丁需创建cache_dir目录。

     

    ②如从未安装过补丁需调整内存,进入%\Oracle\Middleware\utils\bsu\%目录,调整bsu.cmd中的内存参数,避免安装过程中提示内存溢出。

    一般设置set MEM_ARGS=-Xms2048m –Xmx4096m ,可根据系统内存情况自行调整。

     

    2、补丁安装

    ①进入%\Oracle\Middleware\utils\bsu\%目录,运行CMD窗口

    使用如下命令,安装补丁

    bsu.cmd -install -patch_download_dir=E:\Oracle\Middleware\utils\bsu\cache_dir -patchlist=Q3ZB -prod_dir=E:\Oracle\Middleware\wlserver_10.3

     

    未检测到冲突忽略本条。如有冲突(例:补丁程序 Q3ZB 与以下补丁程序互相排斥且不能共存: U5I2),则使用如下命令,卸载旧补丁U5I2。

    bsu.cmd -prod_dir=E:\Oracle\Middleware\wlserver_10.3 -patchlist= U5I2 -verbose -remove

    ③补丁安装完成后,使用如下命令,确认补丁状态。

    bsu.cmd -prod_dir=E:\Oracle\Middleware\wlserver_10.3 -status=applied -verbose -view

    三、启动weblogic服务

    启动服务并检查应用是否正常。

    展开全文
  • 今年早些时候,作者在博客中公开了一个Oracle WebLogic Server中的反序列化漏洞。...在此博客文章中,我们将详细介绍此最新补丁中的漏洞。 https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020.

    今年早些时候,作者在博客中公开了一个Oracle WebLogic Server中的反序列化漏洞。此漏洞是由Oracle补丁的,并分配了CVE-2020-2555。但是,VNPT ISC的研究员Quynh Le向ZDI提交了一个漏洞,该漏洞表明了可以绕过补丁利用此漏洞。Oracle 已通报此标记为CVE-2020-2883的漏洞可用于攻击。在此博客文章中,我们将详细介绍此最新补丁中的漏洞。

     https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server
     https://www.us-cert.gov/ncas/current-activity/2020/05/01/unpatched-oracle-weblogic-servers-vulnerable-cve-2020-2883
     https://www.zerodayinitiative.com/advisories/ZDI-20-570/

    0x01  补丁绕过

    CVE-2020-2555的原始补丁程序未修补以下gdaget利用链的部分:

     BadAttributeValueExpException.readObject()
       com.tangosol.util.filter.LimitFilter.toString() // <--- CVE-2020-2555在此处补丁
         com.tangosol.util.extractor.ChainedExtractor.extract()
             com.tangosol.util.extractor.ReflectionExtractor().extract()
                 Method.invoke()
                 //...
                 com.tangosol.util.extractor.ReflectionExtractor().extract()
                 Method.invoke()
                     Runtime.exec()

    调用ChainedExtractor.extract()仍将导致远程执行代码,Quynh Le的报告显示,ChainedExtractor.extract()仍然可以通过ExtractorComparator和AbstractExtractor类进行访问。我们从查看compare()方法ExtractorComparator:开始分析

     public int compare(T o1, T o2) {
         Comparable a1 = (o1 instanceof InvocableMap.Entry) ? (Comparable)((InvocableMap.Entry)o1).extract(this.m_extractor) 
                                                                                     : (Comparable)this.m_extractor.extract(o1);
               Comparable a2 = (o2 instanceof InvocableMap.Entry) ? (Comparable)((InvocableMap.Entry)o2).extract(this.m_extractor)
                                                                                      : (Comparable)this.m_extractor.extract(o2);
              if (a1 == null)
         {
           return (a2 == null) ? 0 : -1;
         }
              if (a2 == null)
         {
           return 1;
         }
              return a1.compareTo(a2);
       }

    如上所示,仍然可以通过设置ChainedExtractor.extract()为this.m_extractor的实例来调用ChainedExtractor。

    同样,compare()也可以使用AbstractExtractor抽象类的方法。

     public  int compare(Object o1,Object o2){ return  SafeComparator 。compareSafe(null,extract(o1),extract(o2)); }

    MultiExtractor类扩展AbstractExtractor可以到达ChainedExtractor.extract():

     public abstract class AbstractCompositeExtractor   extends AbstractExtractor   [...Truncated...]
       public class MultiExtractor
       extends AbstractCompositeExtractor
       [...Truncated...]
          public Object extract(Object oTarget) {
         if (oTarget == null)
         {
           return null;
         }
              ValueExtractor[] aExtractor = getExtractors();
         int cExtractors = aExtractor.length;
         Object[] aValue = new Object[cExtractors];
              for (int i = 0; i < cExtractors; i++)
         {
           aValue[i] = aExtractor[i].extract(oTarget);<-----------------------
         }
              return new ImmutableArrayList(aValue);
       }

    0x02  完整利用链

    为了开发一个完整的gadget利用链,我们需要有调用compare()的能力,从方法Comparator到达readObject()。使用的公开记录的方法有PriorityQueue,有如下gadget类:BeanShell1,Jython1,CommonsCollections2,CommonsBeanutils1,CommonsCollections4和Groovy1:

     java.util 。PriorityQueue 。readObject()
       java.util 。PriorityQueue 。heapify()
       java.util 。PriorityQueue 。siftDown()
       java.util 。PriorityQueue 。siftDownUsingComparator()

    SiftUpUsingComparator()可以调用compare()任意方法Comparator:

     private void siftUpUsingComparator(int paramInt, E paramE) {
         while (paramInt > 0) {
           int i = paramInt - 1 >>> 1;
           Object object = this.queue[i];
           if (this.comparator.compare(paramE, object) >= 0)<----------------
             break; 
           this.queue[paramInt] = object;
           paramInt = i;
         } 
         this.queue[paramInt] = paramE;
       }

    还有其他实现此目的的方法。例如,使用以下方法:

     javax.management 。BadAttributeValueExpException 。readObject()  
       com.tangosol.internal.sleepycat.persist.evolve 。变异。toString()
         java.util.concurrent 。ConcurrentSkipListMap $ SubMap 。尺寸()
         java.util.concurrent 。ConcurrentSkipListMap $ SubMap 。isBeforeEnd()
           java.util.concurrent 。ConcurrentSkipListMap 。cpr()

    总而言之,toString()Mutations类的方法可能导致调用ConcurrentSkipListMap.size():

     ConcurrentSkipListMap$SubMap.class
         public int size() {
             Comparator cmp = m.comparator;
             long count = 0;
             for (ConcurrentSkipListMap.Node n = loNode(cmp);
                 isBeforeEnd(n, cmp); = Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)count;
             }
       [...Truncated...]
            boolean isBeforeEnd(ConcurrentSkipListMap.Node n, Comparator cmp) {
             ....
             int c = cpr(cmp, k, hi); 0 || (c == 0 && !hiInclusive))
                     return false;
                 return true;
             } 
       [...Truncated...]
          static final int cpr(Comparator c, Object x, Object y) {
             return (c != null) ? c.compare(x, y) : ((Comparable)x).compareTo(y); <--------
         }

    从ConcurrentSkipListMap.size()中可以调用compare()任意方法Comparator。

    0x03  演示漏洞利用

    通过使用上述方法,针对ExtractorComparator编译了以下完整的gadget链:

     javax.management.BadAttributeValueExpException.readObject()  
       com.tangosol.internal.sleepycat.persist.evolve.Mutations.toString()
         java.util.concurrent.ConcurrentSkipListMap$SubMap.size()
         java.util.concurrent.ConcurrentSkipListMap$SubMap.isBeforeEnd()
           java.util.concurrent.ConcurrentSkipListMap.cpr()
             com.tangosol.util.comparator.ExtractorComparator.compare()

    以下视频演示了此gadget链用于通过T3协议获得RCE。

     https://www.youtube.com/watch?v=HM3Z-I998b4

    对于该AbstractExtractor示例,使用了以下链:

     java.util.PriorityQueue.readObject()
       java.util.PriorityQueue.heapify()
       java.util.PriorityQueue.siftDown()
       java.util.PriorityQueue.siftDownUsingComparator()
       com.tangosol.util.extractor.AbstractExtractor.compare()
         com.tangosol.util.extractor.MultiExtractor.extract()
           com.tangosol.util.extractor.ChainedExtractor.extract()
             //...
             Method.invoke()
                 //...
               Runtime.exec()

    以下视频演示了此gadget链用于通过T3协议获得RCE:

     https://youtu.be/juIucTRZUL8

    0x04  通过HTTP利用漏洞

    应当注意,此漏洞位于Coherence 库中。 在其代码路径中具有反序列化路径的任何具有Coherence 库的应用程序也容易受到攻击。一个产品示例是Oracle Business Intelligence,它部署在Oracle WebLogic上。

    可以将这些gadget链与CVE-2020-2950 / ZDI-20-505结合使用,该工具由GreenDog的研究人员报告给ZDI,以通过HTTP实现远程代码执行。

    此漏洞位于BIRemotingServlet中,会侦听TCP端口7780,并且不需要任何身份验证:

          BIRemotingServlet     oracle.bi.nanserver.fwk.servlet.as.BIRemotingServlet     1        BIRemotingServelet     /messagebroker/as/*        BIRemotingServlet     /messagebroker/cs/*

    BIRemotingServlet 使用AMF(操作消息格式)与客户端进行通信。

     protected void handleRequest(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) 
      throws ServletException, IOException {
      
       [...Truncated...]
                  RemotingSvs remotingSvs = BISvsManagerBase.getRemotingSvs(); <----------------------------------------------------
           remotingSvs.processCall(); <--------------------------------------------------------------------------------------------
           setContentType(paramHttpServletResponse, OutputForm.AMF3);
           paramHttpServletResponse.setContentLength(byteArrayOutputStream.size());
           byteArrayOutputStream.writeTo(paramHttpServletResponse.getOutputStream());
           paramHttpServletResponse.flushBuffer();
         }
       public int processCall() throws BISvsException {
        [...Truncated...]
            AMF3Packet aMF3Packet1 = deserializePacket(dataInputStream); <------------------------------------------------------------
           if (logger.isLoggable(Level.FINE)) {
             logger.fine("De-serialized request packet: " + aMF3Packet1.toString());
           }
       [...Truncated...]
       }
       oracle.bi.nanserver.fwk.util.remoting.RemotingSvsImpl.class
        public AMF3Packet deserializePacket(DataInputStream paramDataInputStream) throws BISvsException {
         try {
           AMFObjectInput aMFObjectInput = getAMF3DeSerializer(paramDataInputStream); <------------------------------------------------
           LegacyObjectInput legacyObjectInput = new LegacyObjectInput(paramDataInputStream, aMFObjectInput);
           AMF3Packet aMF3Packet = new AMF3Packet();
           aMF3Packet.deserialize(legacyObjectInput); <----------------------------------------------------------------------------------
           return aMF3Packet;
         }
         catch (Exception exception) {
           handleException(exception);
                  return null;
         } 
       }
       public AMFObjectInput getAMF3DeSerializer(DataInputStream paramDataInputStream) throws BISvsException {
         try {
           Class clazz = (Class)amf3DeSerializerClass.get();
           if (clazz == null) {
             String str = (String)BISvsManagerBase.getContextSvs().getValue("amf3DeSerializer");
                      if (str == null || str.trim().length() == 0) {
               clazz = oracle.bi.nanserver.fwk.util.amf.AMF3ObjectInput.class; <--------------------------------------------------------
               amf3DeSerializerClass.compareAndSet(null, clazz);
               logger.info("Using default AMF3 De-Serializer");
       [...Truncated...]
       }

    如图所示,当对AMF数据包进行反序列化时,可以通过调用AMF3ObjectInput来重建任意对象readComplexObject()。

     protected Object readComplexObject(GenericTypeInfo paramGenericTypeInfo) 
       throws ClassNotFoundException, IOException {
         try {
           int i = readAMF3IntegerVal();
           if ((i & true) == 0) {
             return getVisitedObject(i >> 1);
           }
           ClassMetadata classMetadata = readClassMetadata(i);
                   String str = this.proxySvs.getConcreteClassName(classMetadata.name);
           if (str == null) {
             str = classMetadata.name;
           }
            //  CVE-2020-2950 patch
           //if (isBlacklisted(str))
           //{
           //  throw new SecurityException("Unsupport class type:" + str);
           //}
                  Class clazz = Class.forName(str);
           ClassProxy classProxy = this.proxySvs.getProxy(clazz);
                   Object object1 = classProxy.newInstance(clazz);
                   int j = this.objectRefList.size();
           markObjectVisited(object1);
                   if (classMetadata.externalizable) {
                      if (paramGenericTypeInfo != null) {
               classProxy.readExternal(new GenericResult(object1, paramGenericTypeInfo), this);
             } else {
               classProxy.readExternal(object1, this);
             }
                  }
           else if (clazz == oracle.bi.nanserver.fwk.util.remoting.messages.RemotingMessage.class) {
             populateRemotingMessage(object1, classMetadata, classProxy);
           } else {
                      String[] arrayOfString = classMetadata.getFieldNames();
             Object[] arrayOfObject = new Object[arrayOfString.length];
             for (byte b = 0; b < arrayOfString.length; b++) {
               arrayOfObject[b] = readObject();
             }
             this.proxySvs.setFieldValues(object1, arrayOfString, arrayOfObject, classProxy);
                      if (classMetadata.dynamic) {
               while (true) {
                 String str1 = readAMF3String();
                 if (str1 == null || str1.length() == 0) {
                   break;
                 }
                 Object object = readObject();
                 this.proxySvs.setFieldValue(object1, str1, object, classProxy);
               } 
             }
           }

    在此示例中,UnicastRef重构了一个对象,从而导致对远程对象的服务器端分布式垃圾回收器的调用,从而使我们能够响应任意的序列化对象。如上所述响应gadget链之一会产生RCE。

    有关在Java AMF实现中利用Java反序列化的更多详细信息,请参阅Code White的这篇文章。gadget链已添加到ysoserial中,并且使用JRMP侦听器来利用此漏洞。

     https://codewhitesec.blogspot.com/2017/04/amf.html
     https://github.com/frohoff/ysoserial

    以下视频演示了这一操作:

     https://www.youtube.com/embed/h1c0sfVZNO8

    0x05  分析总结

    有关Java反序列化漏洞的更多详细信息,请参阅Moritz Bechler的白皮书。Oracle的博客没有说明攻击的广泛性,但是其指导很明确:需要立即打补丁。他们还提供有关如何限制Oracle WebLogic Server的T3 / T3S协议流量的指南。Oracle补丁程序的下一个版本计划于2020年7月14日发布,我们将持续关注在该更新之后还剩下多少反序列化漏洞。

     https://github.com/mbechler/marshalsec/blob/master/marshalsec.pdf
     https://blogs.oracle.com/security/apply-april-2020-cpu

     

     

    展开全文
  • 今年早些时候,作者在博客中公开了一个Oracle WebLogic Server中的反序列化漏洞。...在此博客文章中,我们将详细介绍此最新补丁中的漏洞。 https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020.

    今年早些时候,作者在博客中公开了一个Oracle WebLogic Server中的反序列化漏洞。此漏洞是由Oracle补丁的,并分配了CVE-2020-2555。但是,VNPT ISC的研究员Quynh Le向ZDI提交了一个漏洞,该漏洞表明了可以绕过补丁利用此漏洞。Oracle 已通报此标记为CVE-2020-2883的漏洞可用于攻击。在此博客文章中,我们将详细介绍此最新补丁中的漏洞。

     https://www.zerodayinitiative.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server
     https://www.us-cert.gov/ncas/current-activity/2020/05/01/unpatched-oracle-weblogic-servers-vulnerable-cve-2020-2883
     https://www.zerodayinitiative.com/advisories/ZDI-20-570/

    0x01  补丁绕过

    CVE-2020-2555的原始补丁程序未修补以下gdaget利用链的部分:

     BadAttributeValueExpException.readObject()
       com.tangosol.util.filter.LimitFilter.toString() // <--- CVE-2020-2555在此处补丁
         com.tangosol.util.extractor.ChainedExtractor.extract()
             com.tangosol.util.extractor.ReflectionExtractor().extract()
                 Method.invoke()
                 //...
                 com.tangosol.util.extractor.ReflectionExtractor().extract()
                 Method.invoke()
                     Runtime.exec()

    调用ChainedExtractor.extract()仍将导致远程执行代码,Quynh Le的报告显示,ChainedExtractor.extract()仍然可以通过ExtractorComparator和AbstractExtractor类进行访问。奇热我们从查看compare()方法ExtractorComparator:开始分析

     public int compare(T o1, T o2) {
         Comparable a1 = (o1 instanceof InvocableMap.Entry) ? (Comparable)((InvocableMap.Entry)o1).extract(this.m_extractor) 
                                                                                     : (Comparable)this.m_extractor.extract(o1);
               Comparable a2 = (o2 instanceof InvocableMap.Entry) ? (Comparable)((InvocableMap.Entry)o2).extract(this.m_extractor)
                                                                                      : (Comparable)this.m_extractor.extract(o2);
              if (a1 == null)
         {
           return (a2 == null) ? 0 : -1;
         }
              if (a2 == null)
         {
           return 1;
         }
              return a1.compareTo(a2);
       }

    如上所示,仍然可以通过设置ChainedExtractor.extract()为this.m_extractor的实例来调用ChainedExtractor。

    同样,compare()也可以使用AbstractExtractor抽象类的方法。

     public  int compare(Object o1,Object o2){ return  SafeComparator 。compareSafe(null,extract(o1),extract(o2)); }

    MultiExtractor类扩展AbstractExtractor可以到达ChainedExtractor.extract():

     public abstract class AbstractCompositeExtractor   extends AbstractExtractor   [...Truncated...]
       public class MultiExtractor
       extends AbstractCompositeExtractor
       [...Truncated...]
          public Object extract(Object oTarget) {
         if (oTarget == null)
         {
           return null;
         }
              ValueExtractor[] aExtractor = getExtractors();
         int cExtractors = aExtractor.length;
         Object[] aValue = new Object[cExtractors];
              for (int i = 0; i < cExtractors; i++)
         {
           aValue[i] = aExtractor[i].extract(oTarget);<-----------------------
         }
              return new ImmutableArrayList(aValue);
       }

    0x02  完整利用链

    为了开发一个完整的gadget利用链,我们需要有调用compare()的能力,从方法Comparator到达readObject()。使用的公开记录的方法有PriorityQueue,有如下gadget类:BeanShell1,Jython1,CommonsCollections2,CommonsBeanutils1,CommonsCollections4和Groovy1:

     java.util 。PriorityQueue 。readObject()
       java.util 。PriorityQueue 。heapify()
       java.util 。PriorityQueue 。siftDown()
       java.util 。PriorityQueue 。siftDownUsingComparator()

    SiftUpUsingComparator()可以调用compare()任意方法Comparator

     private void siftUpUsingComparator(int paramInt, E paramE) {
         while (paramInt > 0) {
           int i = paramInt - 1 >>> 1;
           Object object = this.queue[i];
           if (this.comparator.compare(paramE, object) >= 0)<----------------
             break; 
           this.queue[paramInt] = object;
           paramInt = i;
         } 
         this.queue[paramInt] = paramE;
       }

    还有其他实现此目的的方法。例如,使用以下方法

     javax.management 。BadAttributeValueExpException 。readObject()  
       com.tangosol.internal.sleepycat.persist.evolve 。变异。toString()
         java.util.concurrent 。ConcurrentSkipListMap $ SubMap 。尺寸()
         java.util.concurrent 。ConcurrentSkipListMap $ SubMap 。isBeforeEnd()
           java.util.concurrent 。ConcurrentSkipListMap 。cpr()

    总而言之,toString()Mutations类的方法可能导致调用ConcurrentSkipListMap.size()

     ConcurrentSkipListMap$SubMap.class
         public int size() {
             Comparator cmp = m.comparator;
             long count = 0;
             for (ConcurrentSkipListMap.Node n = loNode(cmp);
                 isBeforeEnd(n, cmp); = Integer.MAX_VALUE ? Integer.MAX_VALUE : (int)count;
             }
       [...Truncated...]
            boolean isBeforeEnd(ConcurrentSkipListMap.Node n, Comparator cmp) {
             ....
             int c = cpr(cmp, k, hi); 0 || (c == 0 && !hiInclusive))
                     return false;
                 return true;
             } 
       [...Truncated...]
          static final int cpr(Comparator c, Object x, Object y) {
             return (c != null) ? c.compare(x, y) : ((Comparable)x).compareTo(y); <--------
         }

    从ConcurrentSkipListMap.size()中可以调用compare()任意方法Comparator。

    0x03  演示漏洞利用

    通过使用上述方法,针对ExtractorComparator编译了以下完整的gadget链

     javax.management.BadAttributeValueExpException.readObject()  
       com.tangosol.internal.sleepycat.persist.evolve.Mutations.toString()
         java.util.concurrent.ConcurrentSkipListMap$SubMap.size()
         java.util.concurrent.ConcurrentSkipListMap$SubMap.isBeforeEnd()
           java.util.concurrent.ConcurrentSkipListMap.cpr()
             com.tangosol.util.comparator.ExtractorComparator.compare()

    以下视频演示了此gadget链用于通过T3协议获得RCE。

     https://www.youtube.com/watch?v=HM3Z-I998b4

    对于该AbstractExtractor示例,使用了以下链:

     java.util.PriorityQueue.readObject()
       java.util.PriorityQueue.heapify()
       java.util.PriorityQueue.siftDown()
       java.util.PriorityQueue.siftDownUsingComparator()
       com.tangosol.util.extractor.AbstractExtractor.compare()
         com.tangosol.util.extractor.MultiExtractor.extract()
           com.tangosol.util.extractor.ChainedExtractor.extract()
             //...
             Method.invoke()
                 //...
               Runtime.exec()

    以下视频演示了此gadget链用于通过T3协议获得RCE:

     https://youtu.be/juIucTRZUL8

    0x04  通过HTTP利用漏洞

    应当注意,此漏洞位于Coherence 库中。 在其代码路径中具有反序列化路径的任何具有Coherence 库的应用程序也容易受到攻击。一个产品示例是Oracle Business Intelligence,它部署在Oracle WebLogic上。

    可以将这些gadget链与CVE-2020-2950 / ZDI-20-505结合使用,该工具由GreenDog的研究人员报告给ZDI,以通过HTTP实现远程代码执行。

    此漏洞位于BIRemotingServlet中,会侦听TCP端口7780,并且不需要任何身份验证:

          BIRemotingServlet     oracle.bi.nanserver.fwk.servlet.as.BIRemotingServlet     1        BIRemotingServelet     /messagebroker/as/*        BIRemotingServlet     /messagebroker/cs/*

    BIRemotingServlet 使用AMF(操作消息格式)与客户端进行通信。

     protected void handleRequest(HttpServletRequest paramHttpServletRequest, HttpServletResponse paramHttpServletResponse) 
      throws ServletException, IOException {
      
       [...Truncated...]
                  RemotingSvs remotingSvs = BISvsManagerBase.getRemotingSvs(); <----------------------------------------------------
           remotingSvs.processCall(); <--------------------------------------------------------------------------------------------
           setContentType(paramHttpServletResponse, OutputForm.AMF3);
           paramHttpServletResponse.setContentLength(byteArrayOutputStream.size());
           byteArrayOutputStream.writeTo(paramHttpServletResponse.getOutputStream());
           paramHttpServletResponse.flushBuffer();
         }
       public int processCall() throws BISvsException {
        [...Truncated...]
            AMF3Packet aMF3Packet1 = deserializePacket(dataInputStream); <------------------------------------------------------------
           if (logger.isLoggable(Level.FINE)) {
             logger.fine("De-serialized request packet: " + aMF3Packet1.toString());
           }
       [...Truncated...]
       }
       oracle.bi.nanserver.fwk.util.remoting.RemotingSvsImpl.class
        public AMF3Packet deserializePacket(DataInputStream paramDataInputStream) throws BISvsException {
         try {
           AMFObjectInput aMFObjectInput = getAMF3DeSerializer(paramDataInputStream); <------------------------------------------------
           LegacyObjectInput legacyObjectInput = new LegacyObjectInput(paramDataInputStream, aMFObjectInput);
           AMF3Packet aMF3Packet = new AMF3Packet();
           aMF3Packet.deserialize(legacyObjectInput); <----------------------------------------------------------------------------------
           return aMF3Packet;
         }
         catch (Exception exception) {
           handleException(exception);
                  return null;
         } 
       }
       public AMFObjectInput getAMF3DeSerializer(DataInputStream paramDataInputStream) throws BISvsException {
         try {
           Class clazz = (Class)amf3DeSerializerClass.get();
           if (clazz == null) {
             String str = (String)BISvsManagerBase.getContextSvs().getValue("amf3DeSerializer");
                      if (str == null || str.trim().length() == 0) {
               clazz = oracle.bi.nanserver.fwk.util.amf.AMF3ObjectInput.class; <--------------------------------------------------------
               amf3DeSerializerClass.compareAndSet(null, clazz);
               logger.info("Using default AMF3 De-Serializer");
       [...Truncated...]
       }

    如图所示,当对AMF数据包进行反序列化时,可以通过调用AMF3ObjectInput来重建任意对象readComplexObject()。

     protected Object readComplexObject(GenericTypeInfo paramGenericTypeInfo) 
       throws ClassNotFoundException, IOException {
         try {
           int i = readAMF3IntegerVal();
           if ((i & true) == 0) {
             return getVisitedObject(i >> 1);
           }
           ClassMetadata classMetadata = readClassMetadata(i);
                   String str = this.proxySvs.getConcreteClassName(classMetadata.name);
           if (str == null) {
             str = classMetadata.name;
           }
            //  CVE-2020-2950 patch
           //if (isBlacklisted(str))
           //{
           //  throw new SecurityException("Unsupport class type:" + str);
           //}
                  Class clazz = Class.forName(str);
           ClassProxy classProxy = this.proxySvs.getProxy(clazz);
                   Object object1 = classProxy.newInstance(clazz);
                   int j = this.objectRefList.size();
           markObjectVisited(object1);
                   if (classMetadata.externalizable) {
                      if (paramGenericTypeInfo != null) {
               classProxy.readExternal(new GenericResult(object1, paramGenericTypeInfo), this);
             } else {
               classProxy.readExternal(object1, this);
             }
                  }
           else if (clazz == oracle.bi.nanserver.fwk.util.remoting.messages.RemotingMessage.class) {
             populateRemotingMessage(object1, classMetadata, classProxy);
           } else {
                      String[] arrayOfString = classMetadata.getFieldNames();
             Object[] arrayOfObject = new Object[arrayOfString.length];
             for (byte b = 0; b < arrayOfString.length; b++) {
               arrayOfObject[b] = readObject();
             }
             this.proxySvs.setFieldValues(object1, arrayOfString, arrayOfObject, classProxy);
                      if (classMetadata.dynamic) {
               while (true) {
                 String str1 = readAMF3String();
                 if (str1 == null || str1.length() == 0) {
                   break;
                 }
                 Object object = readObject();
                 this.proxySvs.setFieldValue(object1, str1, object, classProxy);
               } 
             }
           }

    在此示例中,UnicastRef重构了一个对象,从而导致对远程对象的服务器端分布式垃圾回收器的调用,从而使我们能够响应任意的序列化对象。如上所述响应gadget链之一会产生RCE。

    有关在Java AMF实现中利用Java反序列化的更多详细信息,请参阅Code White的这篇文章。gadget链已添加到ysoserial中,并且使用JRMP侦听器来利用此漏洞。

     https://codewhitesec.blogspot.com/2017/04/amf.html
     https://github.com/frohoff/ysoserial

    以下视频演示了这一操作:

     https://www.youtube.com/embed/h1c0sfVZNO8

    0x05  分析总结

    有关Java反序列化漏洞的更多详细信息,请参阅Moritz Bechler的白皮书。Oracle的博客没有说明攻击的广泛性,但是其指导很明确:需要立即打补丁。他们还提供有关如何限制Oracle WebLogic Server的T3 / T3S协议流量的指南。Oracle补丁程序的下一个版本计划于2020年7月14日发布,我们将持续关注在该更新之后还剩下多少反序列化漏洞。

     https://github.com/mbechler/marshalsec/blob/master/marshalsec.pdf
     https://blogs.oracle.com/security/apply-april-2020-cpu
    展开全文
  • weblogic10.3.6最新补丁下载,weblogic11,weblogic12最新补丁下载
  • weblogic 10.3.6最新补丁

    2018-05-01 17:09:35
    2018年4月18日爆出的漏洞,漏洞名称死:CVE-2018-2628,可以执行系统命令,补丁是使用正版用户登录下载,目前oracle官网还没有对外公布
  • Oracle WebLogic Server 10.3.6 2020年4月发布的累积更新补丁包 p30857748_1036_Generic 主要修复各种Bug和安全漏洞等问题 安装之前须先卸载老的补丁 遭到过攻击的服务器、域 建议删除域并重建
  • Weblogic补丁记录

    2020-09-22 14:40:01
    使用oracle suport账户登陆后下载最新补丁合集 --路径 WSL路径 /home/mw/weblogic/wls1036/wlserver_10.3 补丁解压后存放路径 /home/mw/weblogic/wls1036/utils/bsu/cache_dir BSU路径 /home/mw/weblogic/wls1036/...
  • Weblogic12C 2021年4月20日发布的最新补丁 p32698246_122140_Generic.zip

空空如也

空空如也

1 2 3 4 5 6
收藏数 107
精华内容 42
关键字:

weblogic最新补丁