Interceptor内存马

Interceptor是SpringMVC中的拦截器,类似于Servlet中的Filter,主要针对Controller层进行拦截请求。

Interceptor的注册过程

在DispatcherServlet#doDispatch方法中的会调用getHandler方法(可接Controller查找部分),在这个方法里面会调用getHandlerExecutionChain方法,之后会遍历AbstractHandlerMapping.adaptedInterceptors,添加到chain中:

拦截器的调用主要在DispatcherServlet#doDispatch方法中,见applyPreHandle方法:

在这个方法中遍历HandlerExecutionChain.interceptorList中的拦截器对请求进行处理:

动态添加Interceptor

只要把自定义的Interceptor加到AbstractHandlerMapping.adaptedInterceptors中就完成了Interceptor的动态添加。

通过Context可以获取到RequestMappingHandlerMapping的Bean,而它又继承AbstractHandlerMapping类:

所以通过反射可以很方便地获取到adaptedInterceptors这个成员变量,然后直接加入即可:

   @RequestMapping("/add")
    public String addInterceptor() throws Exception {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        assert attributes != null;
        ServletContext servletContext = attributes.getRequest().getServletContext();
        WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext);
        // 从IoC容器中获取bean
        assert context != null;
        RequestMappingHandlerMapping handlerMapping = context.getBean(RequestMappingHandlerMapping.class);

        Class<?> clazz = Class.forName("org.springframework.web.servlet.handler.AbstractHandlerMapping");
        Field field = clazz.getDeclaredField("adaptedInterceptors");
        field.setAccessible(true);
        List interceptors = (List) field.get(handlerMapping);
        interceptors.add(new MyInterceptor());

        return "Add success";
    }
}
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        PrintWriter writer = response.getWriter();
        writer.write("This is MyInterceptor\n");
        writer.flush();
        writer.close();

        return true;
    }
    
}

<think>我们正在讨论如何使用Arthas来检测内存内存驻留型恶意软件)。内存是一种无文件攻击技术,它驻留在内存中,因此难以通过传统文件扫描检测。Arthas是阿里巴巴开源的Java诊断工具,可以用于监控、分析运行中的Java应用程序,包括查找异常类、方法等。 根据引用[1]和[2],内存是攻击者常用的武器,因为它可以逃避传统安全检测。因此,我们需要使用像Arthas这样的工具来检测内存中的异常。 使用Arthas检测内存的一般步骤: 1. 启动Arthas并附加到目标Java进程。 2. 使用Arthas的命令来检查JVM中加载的类、方法,以及线程等。 3. 查找可疑的类或方法,特别是那些动态生成的(如通过字节码操作库生成的)或不在已知路径中的类。 4. 分析可疑类的行为,如是否有网络连接、执行系统命令等。 具体操作: 步骤1:启动Arthas 通常,我们下载Arthas的jar包,然后运行: java -jar arthas-boot.jar 然后选择目标Java进程的编号。 步骤2:使用sc命令(Search Class)查找可疑类 例如,我们可以搜索所有包含特定关键词(如"memshell"、"shell"、"filter"等)的类: sc *memshell* sc *shell* sc *filter* 步骤3:使用jad命令反编译类 如果发现了可疑类,我们可以使用jad命令来反编译这个类,查看其源代码: jad com.example.MaliciousClass 步骤4:使用trace或watch命令监控方法调用 如果某个方法被怀疑是恶意方法,我们可以使用trace或watch命令来监控该方法的调用情况,包括参数和返回值。 trace com.example.MaliciousClass maliciousMethod watch com.example.MaliciousClass maliciousMethod '{params, returnObj}' -x 3 步骤5:检查线程 内存通常会创建线程来监听请求,因此我们可以使用thread命令查看所有线程,查找可疑线程(如名称异常、执行任务异常等): thread thread -n 3 # 查看最繁忙的3个线程 步骤6:检查HTTP请求处理链 对于Web应用,内存通常以Servlet Filter或Interceptor的形式存在。我们可以使用Arthas的`ognl`命令来获取当前Web应用的Filter链: ognl '@org.springframework.web.context.WebApplicationContext@getServletContext().getFilterRegistration()' 或者对于Tomcat,可以尝试: ognl '#context=@org.apache.catalina.core.ApplicationContext@getContext("/manager"), #context.getPipeline().getFirst()' 步骤7:卸载可疑的Filter(如果确认是恶意的) 如果发现恶意的Filter,可以使用Arthas的`ognl`命令将其从Filter链中移除(注意:这需要谨慎,且可能不是永久性的,重启后失效): ognl '#context=@org.apache.catalina.core.ApplicationContext@getContext("/manager"), #context.getFilterRegistrations().remove("evilFilter")' 注意:以上操作需要有一定的Java安全知识和经验,因为误操作可能导致应用不可用。 此外,引用[3]提到,有时需要更专业的工具进行深入分析,甚至进行逆向工程。如果Arthas无法满足需求,可能需要使用其他工具(如Java Agent、调试器)或进行内存转储分析。 引用[4]中提到了应急响应的一些思路,包括流量分析、事件日志分析等,这些也可以结合使用。 由于内存是动态加载的,重启后可能消失,但攻击者可能设置了持久化机制(如写入注册表、计划任务等),因此还需要结合系统层面的检查。 总结:Arthas是一个强大的工具,可以帮助我们检测内存,但需要结合其他安全措施和工具进行综合防护。 下面,我们将生成相关问题。</think>### 使用Arthas检测内存的方法 内存内存驻留型恶意软件)通过无文件攻击技术驻留在JVM内存中,逃避传统文件扫描(引用[1][2])。Arthas作为Java诊断工具,可通过以下步骤检测: --- #### **1. 启动Arthas并附加目标进程** ```bash java -jar arthas-boot.jar # 选择目标Java进程PID ``` --- #### **2. 扫描可疑类加载器** 内存通常通过自定义类加载器注入: ```bash # 列出所有类加载器 classloader -l # 检查非标准类加载器(如URLClassLoader的子类) classloader -c <可疑类加载器哈希值> --load <恶意类名> ``` --- #### **3. 检测动态生成的恶意类** 内存常通过字节码操作(如ASM)动态生成类: ```bash # 搜索特定关键词的类(如"shell"、"memshell") sc *shell* # 反编译可疑类查看源码 jad com.example.EvilShell ``` --- #### **4. 监控高危方法调用** 定位敏感操作(如命令执行、网络连接): ```bash # 监控Runtime.exec()调用 watch java.lang.Runtime exec 'params[0]' -x 3 # 监控URLClassLoader加载行为 watch java.net.URLClassLoader loadClass 'params[0]' -x 2 ``` --- #### **5. 分析Filter/Servlet链(Web场景)** 内存常注入Filter或Servlet: ```bash # 获取所有Filter ognl '#ctx=@com.taobao.arthas.core.advisor.AdviceManager@getClassLoader("org.apache.catalina.core.ApplicationFilterFactory"), #filters=#ctx.getDefaultUnwrapInstance().getFilterRegistrations()' # 检查可疑Filter优先级(内存通常位于链首) ``` --- #### **6. 线程行为分析** 检测恶意线程(如反向Shell连接): ```bash # 列出所有线程 thread # 监控线程执行栈 thread -n 3 # 展示最忙的3个线程 stack <可疑线程ID> # 查看调用栈 ``` --- #### **7. 内存Dump深度分析** 导出堆内存进一步逆向(引用[3]): ```bash heapdump /tmp/dump.hprof # 导出堆快照 # 使用MAT或JVisualVM分析恶意类引用关系 ``` --- #### **关键排查点** - **异常类路径**:如`org.apache.catalina.core.ApplicationFilterChain`中的非标准Filter - **高频方法调用**:如`ClassLoader.defineClass()`的异常调用 - **隐蔽线程**:无命名线程或伪装线程(如`pool-1-thread-*`) > **注意事项**:内存在JVM重启后消失,但需排查持久化入口(如计划任务、注册表)(引用[3])。结合流量分析(如HTTP请求中的异常参数)可提高检出率(引用[4])。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值