内存马
slug
series-status
status
summary
date
series
type
password
icon
tags
category
内存马
简介
Java内存马(Memory Shell)是一种恶意代码,通常用于远程控制受感染的Java应用程序。它与其他类型的后门(Backdoor)类似,但它的主要特点是能够在受感染的Java虚拟机(JVM)的内存中持续运行,而不需要将恶意代码写入磁盘。这使得Java内存马在某种程度上能够规避传统的安全防护措施,例如病毒扫描和沙箱分析。
Java内存马的原理:
- 感染:攻击者首先需要通过各种攻击手段将内存马注入到目标Java应用程序的内存中。这可以通过利用Java反序列化漏洞、社会工程学、供应链攻击等方式实现。
- 加载和运行:成功将内存马注入到Java虚拟机后,攻击者会利用Java的类加载器(ClassLoader)机制来动态加载和执行恶意代码。此过程中,攻击者可以使用反射、动态代理等Java技术来绕过安全检查。
- 远程控制:内存马通常会启动一个后门进程,监听一个指定的端口,等待攻击者的连接。攻击者通过与后门进程建立连接,就可以向受感染的Java应用程序发送指令,从而控制目标系统。
- 持久化:虽然Java内存马主要在内存中运行,但攻击者通常还会采取一些手段来实现持久化。这可能包括修改Java应用程序的启动参数、使用Java代理(Java Agent)等方式。
原理
我们以Java Web举例,在Java Web中有三大组件分别是Servlet, Filter,Listener
Servlet
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
- Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第4步,否则,执行第2步。
- 装载并创建该Servlet的一个实例对象。
- 调用Servlet实例对象的init()方法。
- 创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
- WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet的destroy()方法。
Filter
Filter译为过滤器。过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或servlet处理,通常都是用来拦截request进行处理的,也可以对返回的response进行拦截处理。

web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。
生命周期
Listener
监听器用于监听Web应用中某些对象的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当监听范围的对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计网站在线人数、系统加载时进行信息初始化、统计网站的访问量等等。
主要由三部分构成:
- 事件源:被监听的对象
- 监听器:监听的对象,事件源的变化会触发监听器的响应行为
- 响应行为:监听器监听到事件源的状态变化时所执行的动作
在初始化时,需要将事件源和监听器进行绑定,也就是注册监听器。
可以使用监听器监听客户端的请求、服务端的操作等。通过监听器,可以自动出发一些动作,比如监听在线的用户数量,统计网站访问量、网站访问监控等。
Tomcat
在 Tomcat 中,每个 Host 下可以有多个 Context (Context 是 Host 的子容器), 每个 Context 都代表一个具体的Web应用,都有一个唯一的路径就相当于下图中的 /shop /manager 这种,在一个 Context 下可以有着多个 Wrapper
Wrapper 主要负责管理 Servlet ,包括的 Servlet 的装载、初始化、执行以及资源回收
StandardContext(常用)

示例
查杀工具-FindShell
首先使用冰蝎创建一个内存马
成功进入内存马界面
接下来尝试使用findshell查杀,项目主页为
服务器上首先部署代码,执行
git clone <https://github.com/4ra1n/FindShell.git
> 然后进入到FindShell目录,打包项目,执行(如果没有mvn命令需要先yum -y install apache-maven安装)mvn package 打包后在target目录下生成FindShell-1.0.jar文件
通过官方文档得知检测命令为
java -jar FindShell.jar --pid [目标JVM的PID] 我们首先通过jps命令获取jvm的pid
再执行
java -jar FindShell-1.0.jar --pid 2230 发现内存马
如果需要自行分析内容,可以增加--debug参数,执行
java -jar FindShell-1.0.jar --pid 2230 --debug 这样dump出来的class文件会放到out目录下,我们也可以自行反编译class文件分析,下图为反编译看到的内存马内容
发现内存马就需要清理,鉴于内存马可能有多个,且程序也有可能无法全部查出来,有条件的情况下,最好还是可以重启tomcat
- ---------------20220317补充--------------
程序为了减少dump过多导致性能等问题,做了黑名单,满足黑名单名称的类才会进行dump分析,默认dump的文件比较少,因此我做了下简单修改,让程序不过分影响性能的情况下尽量多dump一些文件分析
1.修改src/main/java/org/sec/util/NameFilter.java 33行if (klassName.contains(k)) {为if (klassName.toLowerCase().contains(k)) { 使其匹配class名称时忽略大小写
2.修改src/main/java/org/sec/Constant.java 增加keyword,框起来的是我自己增加的
增加了cmd,filter,servlet三个
3.修改后重新执行mvn package打包即可
查杀工具-arthas, Copagent, VisualVM(远程调试)
Loading...