Java内存马的研究与分析(一)
前言
在实战中像SpringBoot无法解析Jsp需要有Jsp的相关依赖才能解析,还有遇到有目录监控Jsp无法落地的情况。因此参考学习了网上数十篇优秀文章进行总结与复现。
Java内存马的概念
Java内存马(Java Memory Shell)利用JVM中内存对象和反射技术来执行恶意代码段
Java内存马的分类
传统Web应用型内存马
使用基本 Servlet-API 实现的动态注册内存马,此种类型的内存马最经典,已经被扩展至适应各个中间件。
Servlet型内存马
:动态注册Servlet及映射路由
Filter型内存马
:动态注册Filter及映射路由
Listener型内存马
:动态注册Listener
JavaWeb应用将Servlet与其映射、处理类/Filter与其映射、处理类/Listener与其处理类存放在Context中,并在程序运行时进行查找和匹配。传统Web应用型内存马就是内存的处理代码与指定的映射动态的添加在Context中的关键位置中,使程序处理一个在本地代码、配置文件中不存在的恶意逻辑
框架型内存马
除了传统的 Servlet 项目,使用 Spring 全家桶进行开发的项目越来越多,而 Spring-MVC 则是自实现了相关路由注册查找逻辑,以及使用拦截器来进行过滤,思想上与 Servlet-Filter 的设计类似。
SpringController型内存马
:动态注册Controller及映射路由
Spring Interceptor型内存马
:动态注册Interceptor及映射路由
Spring Webflux型内存马
:动态注册WebFilter及映射路由
Spring MVC使用Controller来接收用户的输入和封装Service,虽然有一部分开发习惯用Mapping来处理,但是这里通常代表处理一个用户请求的“端点“,类似于Servlet,而Interceptor拦截器则类似于Filter
Spring WebFlux是Spring Framework5.0中引入的新的响应式web框架,它不依赖Servlet-API,但是同样必须要有Filter的这种思想,实际上就是WebFilter
中间件型内存马
在中间件的很多功能实现上,因为采用了类似 Filter-FilterChain 的职责链模式,可以被用来做内存马,由于行业对 Tomcat 的研究较多,因此大多数的技术实现和探究是针对 Tomcat 的,但其他中间件也有相当多的探究空间。
对于各种中间件/框架,利用其设计模式,可挖掘出多种内存马的利用方式
Tomcat Valve型内存马
:动态注册Valve
Tomcat Upgrade型内存马
:动态注册UpgradeProtocol
Tomcat Executor型内存马
:动态替换全局Executor
Tomcat Poller型内存马
:动态替换全局Poller
Grizzly Filter型内存马
:动态注册Grizzly Filter及映射路由
中间件的很多设计都是“流式”、“管道式”,一般称之为责任链模式,每个关键点都会将Request处理,并传递给下一个处理者。在这种模式下,攻击者可以向责任链中添加自己的恶意逻辑,实现内存马的驻留
其他内存马
还有一些其他非常规的利用思路,可以用在内存马的实现上,例如 WebSocket 协议等。
除了基于 Web 协议的内存马,可以使用各种协议作为内存马的通信途径,如 grpc、jmx、jpda 等,或封装多层协议
WebSocket型内存马
:动态注册Websocket路由及处理逻辑
Tomcat JSP型内存马
:动态注册Tomcat JSP管理逻辑并实现驻留
线程型内存马
:动态添加一个无法杀死的线程
RMI型内存马
:动态启动一个RMI Registry
对于WebSocket协议请求、JSP请求的处理,各个中间件包含自己的逻辑,这些逻辑的具体实现也可以用来作为内存马的逻辑处理
线程型内存马在系统中启动一个永不停止的线程,此时关键类无法被GC,会一直存在的目标系统中,执行事先预定义的逻辑。而RMI内存马启动一个RMI Registry并绑定恶意类作为后门
Agent型内存马
利用 Java Agent 技术进行植入内存马逻辑的实现方式
对于 Agent 型内存马,可以 hook 非常多的位置,如各种 SPI 的实现,可以接管整个 JVM,获取数据
Agent型内存马
:通过Hook并修改关键方法添加恶意逻辑
直到目前,Agent型内存马在两款炙手可热的webshell管理工具冰蝎和哥斯拉上都有实现。从落地Jar执行命令注入,到Self-attach,再到无文件落地的Agent注入,相关技术实现越来越精彩
除了按照内存马的实现方式分类,还可以按照内存马的利用方式分为:冰蝎马、哥斯拉马、蚁剑马、命令回显马、流量隧道马等等。
Java内存马的优劣势
优势
- 由于网络原因不能反弹 shell 的;
- 内部主机通过反向代理暴露 Web 端口的;
- 服务器上有防篡改、目录监控等防御措施,禁止文件写入的;
- 服务器上有其他监控手段,写马后会告警监控,人工响应的;
- 服务使用 Springboot 等框架,无法解析传统 Webshell 的;
劣势
- 服务重启后会失效;
- 对于传统内存马,存在的位置相对固定,已经有相关的查杀技术可以检出
Java内存马类型选择
原生 Servlet-API内存马、新颖 WebSocket内存马、通用 Agent型内存马
最受欢迎的是Servlet-API 型和 Agent 型内存马
小众非主流内存马更容易过检测
__END__