【内存马】JavaWeb 内存马初识与检测

一、内存马初识

随着攻防演练越演越烈,流量分析、EDR、WAF、防护软件等越来越多的设备被广泛使用,传统的基于文件上传式的webshell 已经越来越容易被检测到,在这些安全设备面前几乎无处遁形。

Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,采用无文件的方法直接注入到内存中,控制服务器。不需要依赖于文件,从而躲避杀软,给检测带来巨大的难度。

二、内存马的分类

  1. Servlet型内存马:Servlet、Filter、Listener
  2. 框架类型内存马:Spring Controller、Interceptor
  3. Agent类型内存马
  4. 其他……

三、Servlet 类型

1、Java Web 三大组件介绍

Servlet、Filter、Listener 是JavaWeb 的三大组件,有关这三个组件如下进行简单的说明:

  1. Servlet:处理http 请求的业务逻辑。
  2. Filter:对http的请求进行过滤,如敏感字符等。过滤完请求后再把请求转交给Servlet。
  3. Listener:Javaweb中的监听器,如监听在线的用户访问量,统计网站的总访问量等。

2、三大组件的运行顺序

当Javaweb 运行起来之后,Listener 最先进行监听直到Javaweb 停止运行,之后当有http请求的话,Filter 会对请求进行脱敏,再将请求转交给Servlet,Servlet处理完请求之后,响应再次来到Filter脱敏,之后返回给客户端。

3、内存马的原理

Servlet 类型的内存马的原理大同小异,其都会通过getServletContext() 函数获取”context“ 的属性值,并设置可修改的属性。之后定义filter 过滤器,拦截请求,检测请求参数中是否有木马参数,如cmd,若有,则执行木马命令,没有则正常放行。

四、Spring 类型

1、Sprint小谈

Spring 可以简单看作是把Javaweb三大组件结合起来的框架,使用MVC架构 (Model、View、Controller)。此架构中HTTP 的最终请求是在Controller 中实现。

2、Spring内存马

跟Servlet 类型的差不多,都是拿到”context“ 的属性值,并动态的添加一个Controller,之后映射到内存地址,获取请求参数实现恶意代码,并做命令回显。

3、Spring隐形马

隐形马又叫劫持马,原理跟dll 劫持差不多,都是通过对一个白名单的类进行劫持,从而执行恶意代码。

在以上内存马中,是通过在内存马中注册一个新的类来实现的,依然是有办法遍历内存中的类来实现查杀。但是隐形马是通过劫持了白名单的类,这样将大大增加查杀的难度。

五、Agent 类型

1、Agent 技术示例

简单而言,Agent 技术允许我们去读取、修改内存中的数据,多用于调试修改等,比如:

  • 某种编辑器的调试功能,典型如IDA、OD、JetBrains编程开发系列等
  • 某些软件破解工具,就是修改了内存中的数据
  • RASP技术:火线动态IAST(植入运行程序当中,可以深入内存马中检测)

2、Agent 内存马

其原理就是深入服务器计算机内存,把一个正常的正在运行的类修改成恶意类

六、内存马的查杀

1、内存马的检测

在java 中,只有在JVM中被加载后的类才能调用执行,因此,内存马的检测需要去内存中排查。

Java提供了Instrumentation 类来实现运行中注入代码执行,可以通过这个类遍历内存中的class字节码,并反编译成java 代码,进行webshell 检测。

2、内存马的排查

虽然内存马运行在内存中,需要特定的手段去查杀,但是其访问的方式跟普通木马无异,都是需要通过URL传递命令执行。可以根据日志中用户的请求路径和参数、已经响应状态码和相应内容进行筛选,以判断是否被注入内存马。