一、前言
前段时间总是发现客户那边呈现了内存马弄的我头大,当时仿佛是一个脚本小子拿着SummerSec师傅的ShiroAttack2工具打的,客户那边正好shiro运用的默许密钥存在反序列化破绽,然后被*穿了,当时原本说是准备研讨以下那个工具学习一波,后来工作一堆其他杂事一拖再拖,最近想起来了,就系统的学习了下java内存马这块的技术。
本文主要内容
- 基于动态注册Servlet组件的内存马完成和剖析
- 基于动态注册框架则见的内存马的完成和剖析
- Javaagent技术以及基于Javaagent和Javassist技术的内存马完成和剖析
- 冰蝎、哥斯拉的内存马完成
- 内存马的检测查杀技术
- 内存马反查杀技术
- 内存马的”耐久化“ 复生技术
二、技术铺垫
1、Tomcat相关
1)、Tomcat 中有 4 类容器组件:
Engine、Host 、Context 、 Wrapper;关系如下
- Engine(org.apache.catalina.core.StandardEngine):最大的容器组件,能够包容多个 Host。
- Host(org.apache.catalina.core.StandardHost):一个 Host 代表一个虚拟主机,一个Host能够包含多个 Context。
- Context(org.apache.catalina.core.StandardContext):一个 Context 代表一个 Web 应用,其下能够包含多个 Wrapper。
- Wrapper(org.apache.catalina.core.StandardWrapper):一个 Wrapper 代表一个 Servlet(重点 :上文提到的动态注册Servlet组件的内存马技术,想要动态的去注册Servlet组件完成过程中的关键之一就是如何获取Wrapper对像,再往上也就是如何获取到Context对象,从而控制整个Web应用)。
2)、Servlet的三大根底组件:
Servlet、Filter 、Listener ;处置恳求时,处置次第如下:
恳求 → Listener → Filter → Servlet
- Servlet: 最根底的控制层组件,用于动态处置前端传送过来的恳求,每一个Servlet都能够了解成运转在效劳器上的一个java程序;生命周期:从Tomcat的Web容器启动开端,到效劳器中止调用其destroy()完毕;驻留在内存里面
- Filter:过滤器,过滤一些非法恳求或不当恳求,一个Web应用中普通是一个filterChain链式调用其doFilter()办法,存在一个次第问题。
- Listener:监听器,以ServletRequestListener为例,ServletRequestListener主要用于监听ServletRequest对象的创立和销毁,一个ServletRequest能够注册多个ServletRequestListener接口(都有request来都会触发这个)。
3)、Tomcat中Context对象的获取
关于Tomcat来说,一个Web应用中的Context组件为org.apache.catalina.core.StandardContext对象,前文也有提到我们在完成经过动态注册Servlet组件的内存马技术的时分,其中一个关键点就是怎样获取器Context对象,而该对象就是StandContext对象。那么我们能够经过哪些途径得到StandContext对象那呢?
有requet对象的时分
Tomcat中Web应用中获取的request.getServletContext是ApplicationContextFacade对象。该对象对ApplicationContext停止了封装,而ApplicationContext实例中又包含了StandardContext实例,所以当request存在的时分我们能够经过反射来获取StandardContext对象:
request.getServletContext().context.context
ServletContext servletContext = request.getServletContext();//获取到applicationcontextFacade Field fieldApplicationContext = servletContext.getClass().getDeclaredField("context");//应用反射获取ApplicationContext对象 fieldApplicationContext.setAccessible(true);//使私有可获取 ApplicationContext applicationContext = (ApplicationContext) fieldApplicationContext.get(servletContext);//获取到ApplicationContext对象 Field fieldStandardContext = applicationContext.getClass().getDeclaredField("context");//应用反射获取StandardContext对象 fieldStandardContext.setAccessible(true);//使私有可获取 StandardContext standardContext = (StandardContext) fieldStandardContext.get(applicationContext);//获取到StandardContext对象
感谢您的来访,获取更多精彩文章请收藏本站。
![](https://www.gyzsq.com/wp-content/uploads/2022/07/9259adea4619.gif)
1 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
2 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
3 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
![头像](/wp-content/themes/zibll/img/avatar-default.png)
- 最新
- 最热
只看作者