RASP之内存马后渗透浅析
字数 2119 2025-08-30 06:50:35

RASP内存马后渗透技术深度分析

1. RASP技术概述

RASP(Runtime Application Self-Protection)是一种运行时应用程序自我保护技术,于2014年提出。其核心特点包括:

  • 实现方式:通过Instrumentation编写Agent,在Agent的premain和agentmain方法中加入检测类(通常继承ClassFileTransformer)
  • 监控机制:当程序运行时,检测字节码文件中是否包含敏感类文件(如ProcessImpl等)
  • 核心API
    • ClassFileTransformer:允许在类加载前或类重新定义时对字节码进行转换
    • Instrumentation:提供启动时代理和重新定义类的能力

与传统WAF对比:

  • 实现更为底层
  • 规则制定更简单
  • 攻击行为识别更精准

2. 题目环境分析

2.1 题目背景

  • 环境:SpringBoot应用
  • 提供文件:JAR包和RASP组件
  • 漏洞点:/user/info接口的data参数可传入Base64编码的恶意字节码
  • 依赖:包含Commons Collections(CC)依赖

2.2 安全限制

  • SecurityObjectInputStream类中的黑名单
  • RASP插件禁用的黑名单

3. 利用链分析

3.1 可用链分析

发现以下组件未被禁用:

  • LazyMap
  • DefaultedMap
  • Hashtable

3.2 链构造思路

采用CC7前半段+CC3后半段的组合链,利用DefaultedMap的特性:

  1. DefaultedMapreadObject()方法
  2. 反序列化触发Hashtable#readObject()
  3. 传入的key是DefaultedMap实例
  4. 调用reconstitutionPut(table, key, value)

3.3 关键调用流程

  1. DefaultedMap继承AbstractMapDecorator,调用其equals方法
  2. map属性通过DefaultedMap传递
  3. 通过DefaultedMap.decorate静态方法将HashMap传给map属性
  4. 最终调用HashMapequals方法(继承自AbstractMap

3.4 AbstractMap.equals关键判断

  1. 是否为同一对象
  2. 对象的运行类型
  3. Map中元素个数(需两个以上)
  4. 判断元素的key和value内容是否相同

3.5 利用点

当value是transformer实例时,会调用transform方法。可利用:

  • InstantiateTransformer:transformer的实例化类
  • TrAXFilter:其构造方法会调用TransformerImplnewTransformer从而加载类

4. 内存马构造与利用

4.1 初始内存马问题

直接使用内存马只能回显"you_are_successful!",无法执行命令

4.2 RASP绕过方法

方法一:修改配置参数

分析rasp-engine.jar中的com.baidu.openrasp.config.Config类:

  1. 禁用Hook:修改disableHooks属性
  2. 白名单绕过:修改hookWhiteAllcloudSwitch
  3. Hook处理器:修改HookHandler

方法二:双重内存马注入

需要打两次内存马,较为复杂

4.3 文件操作技术

文件写入+读取

// 示例代码框架
public void fileOperation() {
    // 文件写入逻辑
    // 文件读取逻辑
}

命令执行技术

方法1:创建新进程绕过

// UNIX/Linux系统
ProcessBuilder pb = new ProcessBuilder(cmd);
Process p = pb.start();
// 获取输出流等操作

方法2:Hook点利用

// 使用ProcessImpl或Unsafe类
// Win下使用ProcessImpl

4.4 完整内存马实现

命令执行+回显解决方案

解决NullPointerException问题:

// 初始化静态变量
static {
    // 初始化代码
}

// 完整流程
public void executeCommand() {
    // 获取PID
    // 初始化命令执行
    // 转换输出流
    // 输出结果
}

UNIX/Linux系统实现

// 使用ProcessImpl获取PID
// 执行命令并处理输入输出流

5. 完整利用流程

  1. 构造恶意序列化链

    • 组合CC7和CC3链
    • 使用DefaultedMapInstantiateTransformer
    • 最终触发TrAXFilter构造方法
  2. 绕过RASP检测

    • 修改RASP配置参数
    • 或采用双重内存马注入
  3. 内存马注入

    • 实现命令执行和文件操作功能
    • 处理回显问题
  4. 利用过程

    • 通过/user/info接口传入恶意Base64编码
    • 触发反序列化漏洞
    • 加载内存马
    • 执行系统命令或文件操作

6. 防御建议

  1. RASP配置加固

    • 保护关键配置参数
    • 防止运行时修改
  2. 代码层面

    • 严格限制反序列化操作
    • 使用安全的ObjectInputStream实现
  3. 依赖管理

    • 及时更新存在漏洞的库(如Commons Collections)
  4. 运行时监控

    • 监控可疑的类加载行为
    • 检测内存马注入行为

7. 总结

本文详细分析了基于RASP环境下的内存马后渗透技术,重点包括:

  • RASP工作原理和绕过方法
  • Commons Collections反序列化链的构造
  • 内存马的实现和优化
  • 完整的利用流程和防御建议

该技术展示了在安全防护日益增强的环境下,攻击者如何通过深入分析防护机制和利用框架特性实现有效攻击,同时也强调了多层次防御的重要性。

RASP内存马后渗透技术深度分析 1. RASP技术概述 RASP(Runtime Application Self-Protection)是一种运行时应用程序自我保护技术,于2014年提出。其核心特点包括: 实现方式 :通过Instrumentation编写Agent,在Agent的premain和agentmain方法中加入检测类(通常继承ClassFileTransformer) 监控机制 :当程序运行时,检测字节码文件中是否包含敏感类文件(如ProcessImpl等) 核心API : ClassFileTransformer :允许在类加载前或类重新定义时对字节码进行转换 Instrumentation :提供启动时代理和重新定义类的能力 与传统WAF对比: 实现更为底层 规则制定更简单 攻击行为识别更精准 2. 题目环境分析 2.1 题目背景 环境:SpringBoot应用 提供文件:JAR包和RASP组件 漏洞点: /user/info 接口的 data 参数可传入Base64编码的恶意字节码 依赖:包含Commons Collections(CC)依赖 2.2 安全限制 SecurityObjectInputStream 类中的黑名单 RASP插件禁用的黑名单 3. 利用链分析 3.1 可用链分析 发现以下组件未被禁用: LazyMap DefaultedMap Hashtable 3.2 链构造思路 采用CC7前半段+CC3后半段的组合链,利用 DefaultedMap 的特性: DefaultedMap 有 readObject() 方法 反序列化触发 Hashtable#readObject() 传入的key是 DefaultedMap 实例 调用 reconstitutionPut(table, key, value) 3.3 关键调用流程 DefaultedMap 继承 AbstractMapDecorator ,调用其 equals 方法 map 属性通过 DefaultedMap 传递 通过 DefaultedMap.decorate 静态方法将 HashMap 传给 map 属性 最终调用 HashMap 的 equals 方法(继承自 AbstractMap ) 3.4 AbstractMap.equals关键判断 是否为同一对象 对象的运行类型 Map中元素个数(需两个以上) 判断元素的key和value内容是否相同 3.5 利用点 当value是 transformer 实例时,会调用 transform 方法。可利用: InstantiateTransformer :transformer的实例化类 TrAXFilter :其构造方法会调用 TransformerImpl 的 newTransformer 从而加载类 4. 内存马构造与利用 4.1 初始内存马问题 直接使用内存马只能回显"you_ are_ successful !",无法执行命令 4.2 RASP绕过方法 方法一:修改配置参数 分析 rasp-engine.jar 中的 com.baidu.openrasp.config.Config 类: 禁用Hook :修改 disableHooks 属性 白名单绕过 :修改 hookWhiteAll 和 cloudSwitch 值 Hook处理器 :修改 HookHandler 方法二:双重内存马注入 需要打两次内存马,较为复杂 4.3 文件操作技术 文件写入+读取 命令执行技术 方法1 :创建新进程绕过 方法2 :Hook点利用 4.4 完整内存马实现 命令执行+回显解决方案 解决 NullPointerException 问题: UNIX/Linux系统实现 5. 完整利用流程 构造恶意序列化链 : 组合CC7和CC3链 使用 DefaultedMap 和 InstantiateTransformer 最终触发 TrAXFilter 构造方法 绕过RASP检测 : 修改RASP配置参数 或采用双重内存马注入 内存马注入 : 实现命令执行和文件操作功能 处理回显问题 利用过程 : 通过 /user/info 接口传入恶意Base64编码 触发反序列化漏洞 加载内存马 执行系统命令或文件操作 6. 防御建议 RASP配置加固 : 保护关键配置参数 防止运行时修改 代码层面 : 严格限制反序列化操作 使用安全的ObjectInputStream实现 依赖管理 : 及时更新存在漏洞的库(如Commons Collections) 运行时监控 : 监控可疑的类加载行为 检测内存马注入行为 7. 总结 本文详细分析了基于RASP环境下的内存马后渗透技术,重点包括: RASP工作原理和绕过方法 Commons Collections反序列化链的构造 内存马的实现和优化 完整的利用流程和防御建议 该技术展示了在安全防护日益增强的环境下,攻击者如何通过深入分析防护机制和利用框架特性实现有效攻击,同时也强调了多层次防御的重要性。