【内存马】JavaWeb 内存马初识与检测
【内存马】JavaWeb 内存马初识与检测
一、内存马初识
随着攻防演练越演越烈,流量分析、EDR、WAF、防护软件等越来越多的设备被广泛使用,传统的基于文件上传式的webshell 已经越来越容易被检测到,在这些安全设备面前几乎无处遁形。
Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,采用无文件的方法直接注入到内存中,控制服务器。不需要依赖于文件,从而躲避杀软,给检测带来巨大的难度。
二、内存马的分类
- Servlet型内存马:Servlet、Filter、Listener
- 框架类型内存马:Spring Controller、Interceptor
- Agent类型内存马
- 其他……
三、Servlet 类型
1、Java Web 三大组件介绍
Servlet、Filter、Listener 是JavaWeb 的三大组件,有关这三个组件如下进行简单的说明:
- Servlet:处理http 请求的业务逻辑。
- Filter:对http的请求进行过滤,如敏感字符等。过滤完请求后再把请求转交给Servlet。
- 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传递命令执行。可以根据日志中用户的请求路径和参数、已经响应状态码和相应内容进行筛选,以判断是否被注入内存马。