从Java源码来看Native命令执行方法
💡
原文中文,约2800字,阅读约需7分钟。
📝
内容提要
本文介绍了在Java中使用更底层、更复杂的调用方式来实现RCE功能的可行性,包括反射机制和ProcessBuilder类的使用方法,以及针对不同操作系统环境下的命令执行方式进行的分析和hook掉ProcessImpl类的构造方法并实例化的方法。
🎯
关键要点
- 在RASP等安全产品防护下,简单使用Runtime.getRuntime().exec(cmds)已不现实。
- 反序列化漏洞中,简单实现RCE功能可能无法达到目的,需探索Runtime的底层实现。
- Java反射机制允许获取类的构造方法、成员变量和方法,需掌握基本用法。
- 通过反射获取Class对象可使用Class.forName或loadClass,获取构造方法可用getConstructor或getDeclaredConstructor。
- 普通命令执行示例为Runtime.getRuntime().exec("calc"); 反射实现为Class.forName("java.lang.Runtime").getMethod("exec", String.class).invoke(runtime, "calc");
- Runtime执行命令时,接收String参数并通过ProcessBuilder类执行。
- Windows中,ProcessImpl构造方法调用create方法创建进程;Linux中,UNIXProcess对象通过forkAndExec方法创建进程。
- 通过hook ProcessBuilder类可构造命令执行,示例包括使用反射创建ProcessBuilder实例并调用start方法。
- 在Windows环境下,ProcessImpl构造方法调用native方法执行命令;在Linux中,UNIXProcess类的start方法调用native方法执行命令。
➡️