WebLogic远程代码执行漏洞CVE-2018-3191 技术分析与防护方案

北京时间10月17日,Oracle官方发布的10月关键补丁更新CPU(Critical Patch Update)中修复了一个高危的WebLogic远程代码执行漏洞(CVE-2018-3191)。该漏洞允许未经身份验证的攻击者通过T3协议网络访问并破坏易受攻击的WebLogic Server,成功的漏洞利用可导致WebLogic Server被攻击者接管,从而造成远程代码执行。

CVSS 3.0评分:9.8

CVSS Vector: (CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)

Oracle官方CPU链接:

https://www.oracle.com/technetwork/security-advisory/cpuoct2018-4428296.html

漏洞影响范围

  • Weblogic 10.3.6.0
  • Weblogic 12.1.3.0
  • Weblogic 12.2.1.3

影响排查

本地检测

使用如下命令对Weblogic版本和补丁安装的情况进行排查。

$ cd /Oracle/Middleware/wlserver_10.3/server/lib

$ java -cp weblogic.jar weblogic.version

远程检测在显示结果中,如果没有补丁安装的信息,则说明存在风险,如下图所示:

远程监测

Nmap服务探测

Nmap工具提供了Weblogic T3协议的扫描脚本,可探测开启T3服务的Weblogic主机。命令如下:

nmap -n -v -Pn –sV [主机或网段地址] -p7001,7002 --script=weblogic-t3-info.nse

如下图红框所示,目标开启了T3协议且Weblogic版本在受影响范围之内,如果相关人员没有安装过官方的安全补丁,则存在漏洞风险。

互联网资产排查

绿盟科技威胁情报中心(NTI)提供对互联网开放网络资产信息查看的功能,企业用户可通过在NTI上检索自有资产信息端口开放情况,查看企业资产是否受此漏洞影响。

技术防护方案

官方修复方案

Oracle官方已经在10月关键补丁更新CPU(Critical Patch Update)中修复了该漏洞,强烈建议受影响的用户尽快升级更新进行防护。

参考链接:

https://www.oracle.com/technetwork/security-advisory/cpuoct2018-4428296.html#AppendixFMW

注:Oracle官方补丁需要用户持有正版软件的许可账号,使用该账号登陆https://support.oracle.com后,可以下载最新补丁。

临时解决方案

jdk升级防护

由于WebLogic采用黑名单的方式阻止恶意反序列化,此次发布的补丁仍存在被绕过的可能,最新版本的jdk引入了JEP290增强安全机制,防护因java反序列化所造成的任意代码执行,使用WebLogic的用户可通过升级jdk至最新版本对此漏洞进行防护。

jdk版本升级建议:

  • 8版本升级至8u121以上
  • 7版本升级至7u131以上
  • 6版本升级至6u141以上

关于JEP290增强安全机制更多信息可参考:

https://blogs.oracle.com/java-platform-group/filter-incoming-serialization-data-a-little-of-jdk-9-goodness-available-now-in-current-release-families

攻击者可通过gadget绕过JEP290防护机制,对此次披露的漏洞进行利用,因此升级jdk的用户仍存在被攻击的风险,Oracle官方此次发布的补丁中增加了针对gadget利用的防护机制,建议用户及时安装补丁以保证长期有效的防护。

T3协议访问控制

漏洞编号为CVE-2018-3191、CVE-2018-3197、CVE-2018-3201、CVE-2018-3245的漏洞可通过T3协议访问控制的方法进行临时防护,漏洞CVE-2018-3252通过http协议进行远程攻击,T3协议访问控制无法对此漏洞进行防护。

用户可通过控制T3协议的访问来临时阻断针对这些漏洞的攻击。WebLogic Server 提供了名为 weblogic.security.net.ConnectionFilterImpl 的默认连接筛选器,此连接筛选器接受所有传入连接,可通过此连接筛选器配置规则,对t3及t3s协议进行访问控制,详细操作步骤如下:

1、进入WebLogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。

2、在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl,参考以下写法,在连接筛选器规则中配置符合企业实际情况的规则:

127.0.0.1 * * allow t3 t3s

本机IP * * allow t3 t3s

允许访问的IP  * * allow t3 t3s  

* * * deny t3 t3s

 

连接筛选器规则格式如下:target localAddress localPort action protocols,其中:

l  target 指定一个或多个要筛选的服务器。

l  localAddress 可定义服务器的主机地址。(如果指定为一个星号 (*),则返回的匹配结果将是所有本地 IP 地址。)

l  localPort 定义服务器正在监听的端口。(如果指定了星号,则匹配返回的结果将是服务器上所有可用的端口)。

l  action 指定要执行的操作。(值必须为“allow”或“deny”。)

l  protocols 是要进行匹配的协议名列表。(必须指定下列其中一个协议:http、https、t3、t3s、giop、giops、dcom 或 ftp。) 如果未定义协议,则所有协议都将与一个规则匹配。

 

3、保存后若规则未生效,建议重新启动WebLogic服务(重启WebLogic服务会导致业务中断,建议相关人员评估风险后,再进行操作)。以Windows环境为例,重启服务的步骤如下:

  • 进入域所在目录下的bin目录,在Windows系统中运行cmd文件终止WebLogic服务,Linux系统中则运行stopWebLogic.sh文件。
  • 待终止脚本执行完成后,再运行cmd或startWebLogic.sh文件启动WebLogic,即可完成WebLogic服务重启。

若参考上述操作配置了连接筛选器后,导致WebLogic无法启动,可参考“附录B WebLogic服务恢复”章节,及时进行业务恢复。

绿盟科技检测防护建议

绿盟科技检测类产品与服务

  • 公网资产可使用绿盟云 紧急漏洞在线检测,检测地址如下:

手机端访问地址:

https://cloud.nsfocus.com/megi/holes/hole_struts2_2018_8_23.html

PC端访问地址:

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?service_id=1026

2、内网资产可以使用绿盟科技的远程安全评估系统(RSAS V6)和Web应用漏洞扫描系统(WVSS)进行检测。

  • 远程安全评估系统(RSAS V6)系统插件

http://update.nsfocus.com/update/listRsasDetail/v/vulsys

  • 远程安全评估系统(RSAS V6)Web插件

http://update.nsfocus.com/update/listRsasDetail/v/vulweb

http://update.nsfocus.com/update/listBsaUtsDetail/v/rule2.0.0

通过上述链接,升级至最新版本即可进行检测!

使用绿盟科技防护类产品进行防护

  • 入侵防护系统(IPS)

http://update.nsfocus.com/update/listIps

  • 下一代防火墙系统(NF)

http://update.nsfocus.com/update/listNf

通过上述链接,升级至最新版本即可进行防护!

检测防护产品升级包/规则版本号

检测产品 升级包/规则版本号
RSAS V6 系统插件包 V6.0R02F01.1202
RSAS V6 web插件包 V6.0R02F00.1101
WVSS V6 web插件包 V6.0R03F00.117
UTS 5.6.10.23614

 

绿盟科技的防护产品已于4月份发布了规则升级包,对漏洞CVE-2018-3191、CVE-2018-3245形成了防护能力。

防护产品 升级包/规则版本号 规则编号
IPS 5.6.9.17650、5.6.10.17650 23614
NF 6.0.1.710、6.0.0.710 23614

技术分析

补丁分析

如下图所示:

本次的补丁主要增加了两个大类黑名单,分别是java.rmi.server.RemoteObject和com.bea.core.repackaged.springframework.transaction.support.AbstractPlatformTransactionManager,RemoteObject是用于修补编号为CVE-2018-3245的漏洞,绿盟科技安全研究员廖新喜在上报该漏洞的过程中就已将所有涉及到RemoteObject相关的poc都提交至Oracle官方。AbstractPlatformTransactionManager这个黑名单是用于防止Spring JNDI注入,从官方以前的黑名单上就能看到org.springframework.transaction.support.AbstractPlatformTransactionManager,但是官方没有想到在com.bea.core.repackaged的相关包还有spring的相关类。这两个包中的类实现几乎一样的,只是来源于不同的包。

动态分析

通过静态分析已经知道CVE-2018-3191所对应的补丁就是AbstractPlatformTransactionManager,用于防止Spring JNDI注入。分析中主要关注JtaTransactionManager这个类,以下是该类中关键的几个地方。

public class JtaTransactionManager extends AbstractPlatformTransactionManager implements TransactionFactory, InitializingBean, Serializable {
   public static final String DEFAULT_USER_TRANSACTION_NAME = "java:comp/UserTransaction";
   public static final String[] FALLBACK_TRANSACTION_MANAGER_NAMES = new String[]{"java:comp/TransactionManager", "java:appserver/TransactionManager", "java:pm/TransactionManager", "java:/TransactionManager"};
   public static final String DEFAULT_TRANSACTION_SYNCHRONIZATION_REGISTRY_NAME = "java:comp/TransactionSynchronizationRegistry";
   private static final String TRANSACTION_SYNCHRONIZATION_REGISTRY_CLASS_NAME = "javax.transaction.TransactionSynchronizationRegistry";
   private transient JndiTemplate jndiTemplate;
   private transient UserTransaction userTransaction;
   private String userTransactionName;
    .....

JtaTransactionManager类继承自AbstractPlatformTransactionManager,实现了Serializable接口,其中私有属性userTransactionName是用于JNDI寻址。

在Java反序列化中,入口有很多,readObject是最常见的,定位到JtaTransactionManager.readObject方法,实现如下:

private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {

   ois.defaultReadObject();

   this.jndiTemplate = new JndiTemplate();

   this.initUserTransactionAndTransactionManager();

   this.initTransactionSynchronizationRegistry();

}

继续跟踪initUserTransactionAndTransactionManager方法的实现:

protected void initUserTransactionAndTransactionManager() throws TransactionSystemException {

   if (this.userTransaction == null) {

      if (StringUtils.hasLength(this.userTransactionName)) {

         this.userTransaction = this.lookupUserTransaction(this.userTransactionName);

         this.userTransactionObtainedFromJndi = true;

      } else {

         this.userTransaction = this.retrieveUserTransaction();

      }

   }

.....

在 initUserTransactionAndTransactionManager的方法中就有基于JNDI寻址方法lookupUserTransaction,关键寻址部分代码如下:

protected UserTransaction lookupUserTransaction(String userTransactionName) throws TransactionSystemException {

   try {

      if (this.logger.isDebugEnabled()) {

         this.logger.debug("Retrieving JTA UserTransaction from JNDI location [" + userTransactionName + "]");

      }



      return (UserTransaction)this.getJndiTemplate().lookup(userTransactionName, UserTransaction.class);

   } catch (NamingException var3) {

      throw new TransactionSystemException("JTA UserTransaction is not available at JNDI location [" + userTransactionName + "]", var3);

   }

}

更详细关于JNDI的使用可参考廖新喜之前的博文http://xxlegend.com/。漏洞效果如下图:

由于该漏洞利用的gadget是weblogic中自带,与JDK版本无关,所以只要系统能连外网,未禁止T3协议,漏洞就可以利用。

附录A 产品使用指南

TRG安全平台提供应急响应手册

TSA(绿盟态势感知平台)

规则引擎版本号大于等于23479的TSA 已自带WebLogic事件规则,不需要执行以下操作添加规则。

添加“WebLogic漏洞攻击-自定义”事件规则:

进入BSA态势感知主页,进入规则引擎APP,如图1.1:

图1.1 进入规则引擎APP

新建网络入侵规则

新建规则,如图1.2:

图 1.2 新建规则

 

如客户侧没有此内置规则,可以在规则引擎中利用自定义规则方式进行添加,在新建页面,如图1.3:

规则模式:专家模式

规则分类:网络入侵规则

规则sql:

select sip, dip, sum(last_times) as atk_count, min(timestamp) as start_time, max(timestamp) as end_time,concat_agg(related_id_list) as related_id_list from internal_app_bsaips_TMP_ipslog where rule_id in (24174,24022,23614,23074,21757,21758,21456,29116,30312,23685,63299,23267,62627,60689,66344,61636,66197,66189,66195,60862,24283,24286) group by sip, dip

图1.3 新建规则-专家模式填写

 

点击下一步,出现规则属性设置页面,如图1.4:

名称:weblogic漏洞攻击-自定义

安全等级:中

事件阶段:攻击渗透

超时时间:1800(默认值)

持续时间:3600(默认值)

归并属性:sip,dip

事件类型:系统入侵事件 – 漏洞攻击

规则描述:针对weblogic漏洞的攻击渗透。

规则建议:攻击者在尝试对weblogic漏洞做攻击尝试,如果被攻击的我方资产部署有weblogic,请持续关注该资产是否有后续的攻击事件产生。

图1.4 新建规则-规则属性设置

 

点击完成,完成该规则配置。

在规则列表中使之生效,如图1.5:

图1.5 使规则生效

TAM新版本(绿盟全流量分析平台)

绿盟全流量分析平台默认自带WebLogic事件规则,不需要执行任何操作添加规则。

附录B WebLogic服务恢复

  • 控制台恢复

在服务重启前,可进入WebLogic控制台删除相关配置,详细步骤如下:

1、依次点击“base_domain”——》“安全”——》“筛选器”

2、将原有配置清空,点击保存。

3、点击“查看更改和重新启动”,进入“重新启动核对清单”,勾选“AdminServer(管理)”,点击“重新启动”按钮。

  • 配置文件恢复

配置完连接筛选器后,配置信息会保存在“\Oracle\Middleware\user_projects\domains\base_domain\config\config.xml”文件中。用文本编辑器打开上述文件,找到如下配置内容后删除:

<connection-filter>weblogic.security.net.ConnectionFilterImpl</connection-filter>

<connection-filter-rule>* * 7001 deny t3 t3s</connection-filter-rule>

 

声 明

本安全公告仅用来描述可能存在的安全问题,绿盟科技不为此安全公告提供任何保证或承诺。由于传播、利用此安全公告所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,绿盟科技以及安全公告作者不为此承担任何责任。绿盟科技拥有对此安全公告的修改和解释权。如欲转载或传播此安全公告,必须保证此安全公告的完整性,包括版权声明等全部内容。未经绿盟科技允许,不得任意修改或者增减此安全公告内容,不得以任何方式将其用于商业目的。

 

关于绿盟科技

北京神州绿盟信息安全科技股份有限公司(简称绿盟科技)成立于2000年4月,总部位于北京。在国内外设有30多个分支机构,为政府、运营商、金融、能源、互联网以及教育、医疗等行业用户,提供具有核心竞争力的安全产品及解决方案,帮助客户实现业务的安全顺畅运行。

基于多年的安全攻防研究,绿盟科技在网络及终端安全、互联网基础安全、合规及安全管理等领域,为客户提供入侵检测/防护、抗拒绝服务攻击、远程安全评估以及Web安全防护等产品以及专业安全服务。

北京神州绿盟信息安全科技股份有限公司于2014年1月29日起在深圳证券交易所创业板上市交易,股票简称:绿盟科技,股票代码:300369。

 

Spread the word. Share this post!

Meet The Author

Leave Comment