Msmap AgentFileless深度解析:Windows与Linux无文件Java Agent注入完整指南
Msmap AgentFileless深度解析Windows与Linux无文件Java Agent注入完整指南【免费下载链接】msmapMsmap is a Memory WebShell Generator.项目地址: https://gitcode.com/gh_mirrors/ms/msmapMsmap 是一款开源的Java 内存马Memory WebShell生成器其中的AgentFileless模式实现了真正的无文件 Java Agent 注入全程不需要在磁盘上放置 jar 包、不需要-javaagent启动参数而是在运行时把 Instrumentation 代理对象直接构造在内存里再重定义已加载的核心类让 Tomcat 等 Java 容器原地长出一个后门。本文将带你彻底看懂 Msmap AgentFileless 在Windows 与 Linux两大平台上的实现原理与使用方法面向新手、代码量极少 一、什么是AgentFileless无文件注入传统 Java 内存马的植入思路一般分两派派系原理局限性进程内注入RCE 后直接操作容器内部结构Valve / Filter / Listener 等强依赖具体容器类型与版本不够通用Java Agent 注入借助 Instrumentation.redefineClasses 重定义已加载类传统方式需要加载 agentjar 文件 启动参数AgentFileless 恰好取两者之长运行时在内存中伪造出一个合法的 Instrumentation 对象并 attach 到自身 JVM 进程用redefineClasses替换已加载的javax.servlet.http.HttpServlet类后门逻辑被埋进service()方法入口之后每个 HTTP 请求都会先经过后门判断。 核心亮点注入目标不是某个具体的 webapp而是容器核心类HttpServlet。这意味着 Tomcat及使用该 Servlet API 的容器下的所有 Servlet 都受影响注入点通用、覆盖面广且全程不落盘、不重启。相关源码位置供进阶阅读AgentFileless 注入器模板config/dependency.pyAGENTFILELESS 变量内含 Windows/Linux 双平台逻辑被后门化的 HttpServlet 模板gist/java/container/jdk/javax.py组装、编译、编码的生成器入口generator.py二、三步走从生成到生效的完整链路生成注入器执行一条命令见第四节generator.py会写出target/AgentFileless.java自动编译后把 class 字节码进行 Base64 编码并同时产出shell.jsp/shell.jspx投递脚本对应generator.py中的b64file()逻辑投递到目标 JVM把生成的 JSP 上传到目标站点并访问一次。JSP 内部定义了一个加载器类负责把 Base64 解码、通过ClassLoader.defineClass定义 AgentFileless 类并实例化内存中自附加并重定义AgentFileless 的静态构造块随即触发获取 Unsafe → 开启自附加 → 获得 Instrumentation → redefineClasses(HttpServlet)后门永久生效直到 JVM 重启。三、核心原理Windows 与 Linux 的两条不同路径redefine()方法根据os.name自动分流两个平台走的是完全不同的技术路线 3.1 WindowsUnsafe 翻开关 Attach API打开自附加开关JDK 默认jdk.attach.allowAttachSelffalse禁止进程 attach 自己。代码先setProperty再用Unsafe.staticFieldOffset putBoolean强制改写sun.tools.attach.HotSpotVirtualMachine.ALLOW_ATTACH_SELF静态字段为 trueenableAttachSelf加载 attach 实现类优先尝试从类路径加载sun.tools.attach.WindowsVirtualMachine有 tools.jar 时找不到时直接反序列化内置的字节码数组defineClass(ByteBuffer)在内存中定义该类——依然不需要任何外部文件完成注入把目标类名javax.servlet.http.HttpServlet和类字节码写入静态字段并根据 x86/x64 设置pointerLength为 4/8最后调用其work()方法。内部通过 JVM Attach 机制拿到 Instrumentation执行redefineClasses完成替换。3.2 Linux/proc/self/mem 壳码 JNI_GetCreatedJavaVMsLinux 路线更硬核——完全绕开 Attach API直接操作自身进程的内存解析/proc/self/maps找到libjava.so与libjvm.so的映射基址解析 ELF 符号表遍历.symtab节区定位Java_java_io_RandomAccessFile_length当作一段可写的临时执行区和JNI_GetCreatedJavaVMs的真实地址壳码替换执行把一小段 x86_64 壳码栈对齐 调用 JNI_GetCreatedJavaVMs通过/proc/self/mem写入前者所在内存并借道执行拿到 JVMTI 环境指针后立即恢复原始字节不留痕迹伪造 InstrumentationImpl用 Unsafe 分配 4096 字节伪造一个 JVMTI agent 结构体在偏移 8 处写入 jvmtiEnv 指针再反射调用sun.instrument.InstrumentationImpl的私有构造器得到一个合法的 Instrumentation 对象redefineClasses替换 HttpServlet注入完成。⚠️ Linux 实现依赖内存布局与符号表结构因此 Msmap 默认支持Linux Tomcat 8/9其他版本需按进阶指南自行适配macOS 暂不支持。四、快速上手AgentFileless 生成器使用步骤先获取项目如需要 clone 仓库git clone https://gitcode.com/gh_mirrors/ms/msmap cd msmap python generator.py交互式菜单路径Java → JDK → JavaX → 编码器 → WebShell 类型 → 密码也支持命令行一步到位python generator.py Java JDK JavaX XOR AntSword passwd参数位含义可选项1语言Java2容器JDKAgentFileless 模式入口3组件JavaX注入 HttpServlet4编码器RAW / Base64 / XOR / AES128 / RC45WebShell 类型CMD / AntSword / JSPJS / Godzilla / Behinder随编码器而定6密码任意字符串需与客户端保持一致进阶配置在config/environment.py中auto_build自动调用 javac 编译b64_class对类字节码做 Base64 编码generate_script生成 shell.jsp / shell.jspx 投递脚本java_compiler_path编译器绝对路径各 WebShell 类型工作方式一览CMD / SH解码后按os.name分别执行cmd.exe /c或/bin/sh -c见gist/java/stub/cmd.py一套代码通吃 Windows 与 Linux用浏览器即可快速验证回显AntSword / JSPJSpayload 是 Base64 编码的 JSP接收后在内存中defineClass动态加载见gist/java/stub/antsword.py客户端选择对应编码如xor_md5、rc_4_sha256、aes_128_ecb_pkcs7_padding_md5脚本位于extend/AntSword/encoder/即可连接GodzillaAES128 编码对应 JAVA_AES_BASE64 类型哥斯拉客户端直连。五、AgentFileless 与传统注入方式对比维度AgentFileless本文方案进程内注入Valve/Filter 等磁盘文件❌ 无 jar、无 class 落盘❌ 无容器依赖低依赖 JDK 自身 attach/JNI 机制跨容器通用高依赖具体容器内部结构是否需要重启❌ 热注入❌ 热注入存活周期JVM 进程存活期间JVM 进程存活期间隐蔽性无 jar、无-javaagent参数、无新类文件加载痕迹视注入点而定六、检测与防御要点蓝队视角无文件注入的痕迹恰恰藏在运行时行为里内存扫描枚举 JVM 中已加载类对比HttpServlet等方法体是否与标准库一致识别异常 Base64 动态加载字节码的类敏感行为监控Windows 监控 jvm.dll 的异常自附加调用Linux 监控/proc/pid/mem的异常写入本文 3.2 节的核心动作类重定义审计JVM 层面可开启对 redefineClasses 的校验与日志核心类被重定义属于高危事件基线比对定期比对内存中核心类字节码哈希与干净基线发现篡改即可告警。七、常见问题 FAQQ需要什么 JDK 版本注入逻辑依赖sun.misc.Unsafe、sun.instrument.InstrumentationImpl及 JDK attach 机制主要面向 JDK 8/11 环境Msmap 默认适配 Linux Tomcat 8/9更高版本 JDK 限制更多需要额外适配。Q服务器重启后门还在吗不在。内存马只存活于 JVM 进程内存中重启即消失——这也是内存马名称的由来。Q客户端类型和编码器必须严格对应吗是的。如 AntSword 的 XOR 编码对应xor_md5AES128 对应aes_128_ecb_pkcs7_padding_md5Godzilla 的 AES128 对应JAVA_AES_BASE64且密码必须与生成时设置的一致选项大小写敏感。一句话总结Msmap AgentFileless 运行时自附加 内存类重定义用一条命令同时打通了 Windows 与 Linux 平台的无文件 Java Agent 注入链路是研究 Java 内存马原理与蓝队防御的优秀开源样本 【免费下载链接】msmapMsmap is a Memory WebShell Generator.项目地址: https://gitcode.com/gh_mirrors/ms/msmap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考