Java内存马基础
什么是内存马
先简单梳理一下webshell的发展历程,大致如下
大马==>小马拉大马(先上传小马,之后通过小马来上传大马)==>一句话木马==>加密一句话木马==>加密内存马
这里在附上一张传统webshell的分类图
内存马是无文件攻击的一种常用手段,不会有文件落地,给检测带来巨大难度。其中,Webshell内存马是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马。
Tomcat内存马
Java应用服务器有很多,流行的有:
其中最常见的就是Tomcat,而Java内存马中最典型的就是Tomcat内存马,主要分为以下几类:
- servlet-api 类
- filter 型
- servlet 型
- spring 类
- 拦截器
- controller 型
- Java Instrumentation 类
- agent 型
实现逻辑
Java web有三大组件,分别是Listener、Filter、Servlet
这里简单梳理一下这三大组件的作用:
- Servlet:是运行在 Web 服务器或应用服务器上的程序,它是作为来自 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。
- Filter:即过滤器,是对Servlet技术的一个补充,它负责对到资源的请求或来自资源的响应进行过滤、检查
- Listener:即监听器,它负责监听客户端、服务端的操作,并触发执行一些代码
客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,我们只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以实现内存马。为了便于理解,附上两张客户端请求的流程图: