JAVA内存马的“一生”

一、前言

前段时间总是发现客户那边呈现了内存马弄的我头大,当时仿佛是一个脚本小子拿着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对象
------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞11赞赏 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像代卡0