mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-22 07:00:43 +08:00
3.0 KiB
3.0 KiB
Agent 内存马
实现原理
JDK1.5 提供了 JVMTI 接口供开发者扩展以查看 JVM 状态,或控制 JVM 代码执行。其中最重要的就是 java.lang.instrument,可以添加自定义的
Transformer,来进行字节码修改。具体细节可查看 JVM 源码分析之 javaagent 原理完全解读。
JavaAgent 有两种入口:
- 静态注入,MANIFEST 定义 Premain-Class 属性指定实现类,并且类中实现了
public static void premain(String args, Instrumentation inst)方法,在 Java 程序运行参数中添加java -javaanget:/path/to/agent.jar -jar app.jar,应用启动时,就会调用到premain方法执行字节码增强相关代码逻辑。 - 动态注入,MANIFEST 定义 Agent-Class 属性指定实现类,并且类中实现了
public static void agentmain(String args, Instrumentation inst)方法,在 Java 程序运行过程中,通过 attach 机制进行 attach 时,会调用到agentmain方法执行字节码增强相关代码逻辑。
当一个 jar 包中 MANIFEST 定义如下时:
Premain-Class: com.reajason.javaweb.memshell.agent.CommandFilterChainTransformer
Agent-Class: com.reajason.javaweb.memshell.agent.CommandFilterChainTransformer
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true
那么这个 Java Agent 既支持静态注入,也支持动态注入。
实现方式
目前提供了 Tomcat 最简单的命令回显 Agent 内存马实现方式
- 基于 ASM,CommandFilterChainTransformer.java
- 基于 Javassist,CommandFilterChainTransformer.java
- 基于 ByteBuddy,CommandFilterChainTransformer.java
如何使用
可以直接 IDEA 中的 Gradle,里面双击 memshell-agent 下的 Tasks 中 build 下的 jar 进行构建。
## 进入项目根目录
cd MemShellParty
## MacOs or Linux
./gradlew :memshell-agent:jar
## Windows
gradlew.bat :memshell-agent:jar
构建结束,会在每个模块 build/libs/ 下生成 Jar 包,其中带 all 的为我们所需要用的包,例如:
- memshell-agent-asm/build/libs/memshell-agent-asm-1.0.0-all.jar
- memshell-agent-javassist/build/libs/memshell-agent-javassist-1.0.0-all.jar
- memshell-agent-bytebuddy/build/libs/memshell-agent-bytebuddy-1.0.0-all.jar
下载 jattach 攻击实施动态注入。
- 启动你需要注入的 Tomcat
- 执行命令
/path/to/jattach pid load instrument false /path/to/agent.jar,注意,所有路径都使用绝对路径,不要使用相对路径 - 访问
http://localhost:8080/app/?paramName=id,查看是否成功