Java内存马-Instrument
文章目录
- 注:
- 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相关推荐
- dll 源码_【技术分享】 | 一个JAVA内存马的源码分析
前言 偶然接触到了这样一个JAVA内存马,其作者也是冰蝎的作者,项目地址: https://github.com/rebeyond/memShell 正好最近在接触JAVA,借此机会学习下大佬的代码, ...
- Java内存马攻防实战——攻击基础篇
在红蓝对抗中,攻击方广泛应用webshell等技术在防守方提供的服务中植入后门,防守方也发展出各种技术来应对攻击,传统的落地型webshell很容易被攻击方检测和绞杀.而内存马技术则是通过在运行的 ...
- Java内存马简单实现
文章目录 Tomcat内存马 JavaWeb 基本流程 Listener型内存马 恶意Listener监听器 动态注册Listener流程 构造Listener内存马 编写恶意Listener监听器 ...
- 初识Java内存马检测
近些年,无文件攻击技术越来越流行.本文旨在介绍无文件攻击中最为流行的一种技术--Java内存马,让企业.用户了解和重视其危害性,提高防范意识,降低安全风险. - 全文约1500字,预计阅读时间为4分钟 ...
- java内存马查杀工具
java-memshell-scanner:扫描java内存马 <%@ page import="java.net.URL" %> <%@ page import ...
- Java内存马查杀GUI工具
注意:请勿在生产环境使用,存在打崩业务的风险,目前适用于自己搭建靶机分析学习 功能: 关于Java Web内存马查杀的文章和工具已经有不少,不过大都不够完善,各有缺点:于是我做了一款GUI版本的实时内 ...
- java内存马学习与理解
文章目录 1. 前置知识 1.1 java web 核心组件 listener filter filter的生命周期 filter链 servlet 2. tomcat 2.1 核心组件 1. con ...
- java内存马分析集合
基于tomcat Servlet内存马 web.xml <?xml version="1.0" encoding="UTF-8"?> <web ...
- 【网络安全】Agent内存马的自动分析与查杀
前言 出发点是Java Agent内存马的自动分析与查杀,实际上其他内存马都可以通过这种方式查杀 本文主要的难点主要是以下三个,我会在文中逐个解答 如何dump出JVM中真正的当前的字节码 如何解决由 ...
- 利用 Fastjson 注入 Spring 内存马,太秀了~!
点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...
最新文章
- RHEL 5服务篇—部署DNS域名解析服务(一)BIND软件
- azkaban 与 java任务_Azkaban的任务类型分析35:JavaProcessJob的执行
- 序列化类型 System.Data.Entity.DynamicProxies 的对象时检测到循环引用
- @RequestMapping的使用
- 小米miui系统已停止服务器,小米两款机型停止 MIUI 更新,明天发布最终体验版固件...
- 漫画通信:惊呆了,手机登录还可以这么玩!
- Java中的13个原子操作类
- 推荐10篇jQuery技术的文章
- Fatal error: Uncaught Error: Call to undefined function gzinflate()
- lg手机历史机型_细数LG G系列旗舰手机进化史
- NS3:FlowMonitor设计讲解
- python py如何变成exe_python如何将py变成exe文件
- 关于处理公司内网办公系统登录不了的问题
- Django 学习记录
- Android计算器——横屏切换科学计算器
- 来了!娱乐篇!一文带你了解那些适合日常使用的开源工具和应用(娱乐篇)
- 江苏泗洪计算机学校怎么样,泗洪一大波学校先后被教育部点名!有没有你母校?...
- Scrapy采集“人民的名义”豆瓣评价实验报告
- 转载-VB根据网络时间校准本地时间
- 定时自动开启和关闭Azure虚拟机
热门文章
- 计蒜客 - 青出于蓝胜于蓝
- html项目符号实心圆圈,HTML基础 ul type 项目符号为圆圈与方块
- U盘在windows电脑中毒,插入Macbook变成exe文件
- 外包,你是外包,麻烦你不要偷吃公司零食,注意素质...
- 【排障】为什么你发出去的邮件被退回
- 转载 GIS的下个十年(Cary Mann, vice president, Bentley)
- itest(爱测试) 4.3.1 发布,开源BUG 跟踪管理 amp; 敏捷测试管理软件
- flex:1属性是什么意思
- 几种常见的HTML分割线
- 一篇文章搞懂数据仓库:四种常见数据模型(维度模型、范式模型等)