文章目录

  • 注:
  • Java Instrument简介
  • Java Agent 开发
    • agentmain() 方法
      • VirtualMachine
    • Agent内存马实现:Tomcat环境
    • 演示:Tomcat环境
    • 演示:Springboot环境
    • Instrument内存马的特点
  • 参考

注:

本文还没完成,后面有空再完成吧。
其实吧,关键的东西都在代码实现里了:
https://github.com/fa1c0n1/JavaInstrument

Java Instrument简介

我们只要拥有一个web容器进程执行用户的权限,理论上就可以完全控制该进程的地址空间(更确切的说是地址空间中的非Kernel部分),包括地址空间内的数据和代码。OS层进程注入的方法有很多,不过具体到Java环境,我们不需要使用操作系统层面的进程注入方法。Java为我们提供了更方便的接口,Java Instrumentation。

java.lang.Instrument包是在JDK5引入的,开发者通过修改方法的字节码实现动态修改类代码。利用Instrument,开发者可以开发单独的代理Agent实现对JVM进程的运行时监控,分析JVM进程运行时内存状态,甚至可以很方便地修改内存中类的字节码,修改或者扩展已有的功能

Java Agent 开发

Java agent的使用方式有两种:

  • 实现premain方法,在JVM启动前加载;
  • 实现agentmain方法,在JVM启动后加载。

premain和agentmain函数声明如下,拥有Instrumentation inst参数的方法优先级更高:


public static void agentmain(String agentArgs, Instrumentation inst) {...
}public static void agentmain(String agentArgs) {...
}public static void premain(String agentArgs, Instrumentation inst) {...
}public static void premain(String agentArgs) {...
}

第一个参数String agentArgs就是Java agent的参数。
第二个参数 Instrumentaion inst 相当重要,后面会提到。

由于内存马的使用场景,一般是注入正在运行的JVM进程,所以下面只介绍 agentmain 方式的使用。

agentmain() 方法

VirtualMachine

Agent内存马实现:Tomcat环境

演示:Tomcat环境

演示,SpringMVC 5.2.0 + Tomcat 8.5.39:

启动Tomcat环境后,注入我们的Agent内存马。

这里要注意,由于是自己的测试环境,所以刚启动Tomcat,需要自己访问一下Tomcat服务的随便一个url,否则Tomcat里的一些类没有加载进内存,比如注入Agent内存马时要找的目标类org.apache.catalina.core.ApplicationFilterChain。没有加载到内存中,从而找不到这个类,所以注入内存马失败。而线上环境的话由于早就被访问过无数次了,所以Tomcat的这些类肯定都已被加载到内存中了,所以就不存在这个问题,直接注入Agent内存马即可。

然后做以下操作:

  • 访问已存在的路由url

(1) 指定非webshell的参数时,原有业务不受影响:

(2) 指定webshell参数时,将执行我们注入的webshell代码:

  • 访问不存在的路由url

(1) 指定非webshell的参数时,显示404页面:

(2) 指定webshell参数时,将执行我们注入的webshell代码:

agent内存马持久化:Tomcat重启后被自动注入agent内存马

agent内存马注入Tomcat进程后,原来路径下的两个jar被agent删除了,然后当Tomcat进程关闭前,两个jar会写入到Tomcat的临时目录,并开启AgentTomcatMemShellInject 进程。


当Tomcat再次启动后,AgentTomcatMemShellInject检测到Tomcat进程后,将agent内存马注入进去,然后AgentTomcatMemShellInject进程便结束了。


此时再次访问agent内存马,发现依旧生效。自此,便实现了agent内存马在Tomcat环境下的持久化,会随着Tomcat进程的重启而自动复活。(如果不想让它自动复活,则在Tomcat关闭后,kill掉AgentTomcatMemShellInject的进程即可)

演示:Springboot环境

Springboot环境下,目前笔者无法做到自动复活。因为在Agent注入到Springboot的进程后,尝试了各种办法都无法在agentmain()方法中获取到上下文context对象,从而无法进一步获取Tomcat端口号。


Instrument内存马的特点

  • 优点:不会生成新的Servlet,Filter,Listener对象,因此隐蔽性更强。
  • 缺点:需要生成Agent文件落地,有可能会被IDS文件检测检测到Agent。

    针对缺点的改进,参考学习[3][4]


相关代码已传github:

https://github.com/fa1c0n1/JavaInstrument

参考

[1] https://mp.weixin.qq.com/s/cbF2cdV9mnbGZWDwHuUoNA
[2] https://www.cnblogs.com/rebeyond/p/9686213.html
[3] https://mp.weixin.qq.com/s/JIjBjULjFnKDjEhzVAtxhw
[4] https://mp.weixin.qq.com/s/ulINOH4BnwfR7MBc6r5YHQ
[5] https://mp.weixin.qq.com/s/sV_mUnI6GshehMiLgCSn7Q
[6] https://mp.weixin.qq.com/s/YVwqD6SwUq_jkEe_9afBCg
[7] https://mp.weixin.qq.com/s/gmKSmW5SIME8lWKj8bvhWw

Java内存马-Instrument相关推荐

  1. dll 源码_【技术分享】 | 一个JAVA内存马的源码分析

    前言 偶然接触到了这样一个JAVA内存马,其作者也是冰蝎的作者,项目地址: https://github.com/rebeyond/memShell 正好最近在接触JAVA,借此机会学习下大佬的代码, ...

  2. Java内存马攻防实战——攻击基础篇

    ​ 在红蓝对抗中,攻击方广泛应用webshell等技术在防守方提供的服务中植入后门,防守方也发展出各种技术来应对攻击,传统的落地型webshell很容易被攻击方检测和绞杀.而内存马技术则是通过在运行的 ...

  3. Java内存马简单实现

    文章目录 Tomcat内存马 JavaWeb 基本流程 Listener型内存马 恶意Listener监听器 动态注册Listener流程 构造Listener内存马 编写恶意Listener监听器 ...

  4. 初识Java内存马检测

    近些年,无文件攻击技术越来越流行.本文旨在介绍无文件攻击中最为流行的一种技术--Java内存马,让企业.用户了解和重视其危害性,提高防范意识,降低安全风险. - 全文约1500字,预计阅读时间为4分钟 ...

  5. java内存马查杀工具

    java-memshell-scanner:扫描java内存马 <%@ page import="java.net.URL" %> <%@ page import ...

  6. Java内存马查杀GUI工具

    注意:请勿在生产环境使用,存在打崩业务的风险,目前适用于自己搭建靶机分析学习 功能: 关于Java Web内存马查杀的文章和工具已经有不少,不过大都不够完善,各有缺点:于是我做了一款GUI版本的实时内 ...

  7. java内存马学习与理解

    文章目录 1. 前置知识 1.1 java web 核心组件 listener filter filter的生命周期 filter链 servlet 2. tomcat 2.1 核心组件 1. con ...

  8. java内存马分析集合

    基于tomcat Servlet内存马 web.xml <?xml version="1.0" encoding="UTF-8"?> <web ...

  9. 【网络安全】Agent内存马的自动分析与查杀

    前言 出发点是Java Agent内存马的自动分析与查杀,实际上其他内存马都可以通过这种方式查杀 本文主要的难点主要是以下三个,我会在文中逐个解答 如何dump出JVM中真正的当前的字节码 如何解决由 ...

  10. 利用 Fastjson 注入 Spring 内存马,太秀了~!

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

最新文章

  1. RHEL 5服务篇—部署DNS域名解析服务(一)BIND软件
  2. azkaban 与 java任务_Azkaban的任务类型分析35:JavaProcessJob的执行
  3. 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
  4. @RequestMapping的使用
  5. 小米miui系统已停止服务器,小米两款机型停止 MIUI 更新,明天发布最终体验版固件...
  6. 漫画通信:惊呆了,手机登录还可以这么玩!
  7. Java中的13个原子操作类
  8. 推荐10篇jQuery技术的文章
  9. Fatal error: Uncaught Error: Call to undefined function gzinflate()
  10. lg手机历史机型_细数LG G系列旗舰手机进化史
  11. NS3:FlowMonitor设计讲解
  12. python py如何变成exe_python如何将py变成exe文件
  13. 关于处理公司内网办公系统登录不了的问题
  14. Django 学习记录
  15. Android计算器——横屏切换科学计算器
  16. 来了!娱乐篇!一文带你了解那些适合日常使用的开源工具和应用(娱乐篇)
  17. 江苏泗洪计算机学校怎么样,泗洪一大波学校先后被教育部点名!有没有你母校?...
  18. Scrapy采集“人民的名义”豆瓣评价实验报告
  19. 转载-VB根据网络时间校准本地时间
  20. 定时自动开启和关闭Azure虚拟机

热门文章

  1. 计蒜客 - 青出于蓝胜于蓝
  2. html项目符号实心圆圈,HTML基础 ul type 项目符号为圆圈与方块
  3. U盘在windows电脑中毒,插入Macbook变成exe文件
  4. 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
  5. 【排障】为什么你发出去的邮件被退回
  6. 转载 GIS的下个十年(Cary Mann, vice president, Bentley)
  7. itest(爱测试) 4.3.1 发布,开源BUG 跟踪管理 amp; 敏捷测试管理软件
  8. flex:1属性是什么意思
  9. 几种常见的HTML分割线
  10. 一篇文章搞懂数据仓库:四种常见数据模型(维度模型、范式模型等)