0x00声明
出品|长白山攻防实验室(ID:hellp)
以下内容,来自长白山攻防实验室作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。
0x01前言
经过最近几年的攻防演练,内存马技术在打点中发挥越来越重要的地位,内存马相比传统的webshell,更容易躲避传统安全监测设备的检测,通常被用来做持久化,规避检测,持续驻留目标服务器中,本次主要结合攻防演练的经验来系统阐述内存马技术。
0x02 内存马原理
在介绍原理之前,我想大家都有这样一个困惑,在拿到webshell后,总担心自己的webshell被管理员和其他攻击队发现,从而不能持久化控制目标主机。所以学好内存马原理至关重要,Java内存马类型如下:
其原理为客户端发起一个web请求,中间件的各个独立的组件Listener、Filter、Servlet会在请求过程中做监听、判断、过滤操作,内存马利用请求过程在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode达到持久化的控制服务器。
内存马优先级listener->filter->servlet,本文先讲fileter型内存马,想到fileter内存马首先要理解过滤链(FilterChain),在一个 Web 应用程序中可以注册多个 Filter 程序,也可以在web.xml注册多个组件,每个 Filter 程序都可以针对某一个 URL 进行拦截。如果多个 Filter 程序都对同一个 URL 进行拦截,那么这些 Filter 就会组成一个Filter 链(也称过滤器链)在开发中同时处理多个对象,要用doFilter进行处理。
0x03 内存马实现
我们已经了解了Filter内存马的原理,filter会创建FilterChain,这里注入Filter型内存马的3个对象的定义如下:
>filterDefs存放了filter的定义,比如名称跟对应的类
>filterConfigs除了存放了filterDef还保存了当时的Context
>FilterMaps则对应了web.xml中配置的
每个Filter执行完之后需要执行FilterChain#do-Filter放行,然后会继续进入到下一个filter,依次执行每个filter里面的doFilter()方法,而我们实现filter内存马也就是往FilterChain里加一个filter。
首先在filter里创建doFilter()方法,实现冰蝎马的请求,其中request方法是接受serlvet的请求,session获取session,利用pageContext.put方法进行保存信息。