type
status
date
slug
summary
tags
category
icon
password
记录内存马概述的基础学习过程
一、原理
常规情况下.jsp文件需要经过以下流程运行代码。
而内存马则是跳过.jsp文件转换为java文件和编译.class文件的步骤,直接从操作JVM内存。
每个java项目都有一个context对象,这个对象代表的就是整个程序/进程,拿到这个对象,调用它已经定义好的(添加,删除,修改对象)方法,动态添加对象。


二、内存马使用场景
- 内网机器禁止外连,此时只能使用正向连接
- 内网机器的文件夹禁止写入,无法实现文件落地
- 内网机器允许写入,但是文件被监控,会触发异常告警,被安全工程师处理
- 站点不支持jsp文件解析的情况(比如:springboot默认不支持)
三、内存马的优缺点
- 优点:
- 缺点:无法持久性存在(服务器一重启,进程重启都会导致内存马丢失)
补充(需文件落地木马的常规检测):
- 文件每次被写入,直接监控文件内容,文件名等特征
- 请求的流量特征监控
- 内网机器禁止外连
四、内存马注入方式
1、jsp webshell植入内存马(依赖jsp文件)
2、java agent植入内存马(依赖jar包)
3、JavaWeb RCE植入内存马(不依赖任何文件)
五、内存马种类
①Servlet内存马(Servlet,Filter,Listener)
这种类型的内存马通过创建新的Filter、Servlet或Listener来执行恶意命令。
实现逻辑:
上传一个jsp文件,当你访问这个jsp文件的时候jsp的恶意代码被执行,此时直接就注入内存马,之后这个jsp文件有无就无所谓了,注入的恶意代码会一直生效到此进程结束或重启而不需要再依赖原本的jsp文件。
②Spring内存马
实现逻辑:
动态地添加一个Controller,映射到一个接口/api
如果注册的接口是系统本来存在的,那就是隐藏马

③Agent内存马
本质是一个jar包,不能单独运行
使用Java的Instrumentation机制动态修改字节码,从而执行恶意代码

六、内存马检测与查杀
- 重启 + 文件查杀
河马webshell查杀,
- 漏洞检测与修复
github内存马检测工具:
java-memshell-scanner
通过Java应用的接口,获取tomcat JVM里面加载的类,遍历所有类,判断是否为风险类
1)内存注册,但是磁盘没有文件
2)class文件里面包含恶意内容
shell-analyzer (java11跑)
其实就是可视化页面,通过attach目标进程的方式获取内存里生效的组件
七、JAVA EE三大组件基础
什么是Servlet?(控制器)
简单理解为接口开发规范,处理请求的控制器。
接口的代码实现

pom.xml 声明项目依赖
web.xml 注册接口 注册接口的第二种方法:@webServlet("/upload")

代码的解析需要容器


过滤器
简单理解为程序出入口
可以定义整站流量都走同一个过滤器。比如:全站接口都需要登录,验证cookie的操作
也可定义指定接口/url走某个过滤器。比如:/admin接口专走adminFilter过滤器
所有接收请求的统一解密和所有响应的请求加密都在这里做

监听器

当一个请求在浏览器访问/xxx,后台会如下调用:过滤器在监听器之后调用。

