X1r0z/memshell-killer

GitHub: X1r0z/memshell-killer

一款通过 Java Agent 机制对运行中 JVM 进行内存马检测、反编译取证和恶意路由移除的应急响应命令行工具。

Stars: 9 | Forks: 0

# memshell-killer 一款用于 Java Web 内存马应急响应的命令行工具。 它通过 Java Attach API 附加到运行中的 JVM,加载 Java Agent,执行单次操作,输出结构化的 JSON,然后分离。借助它,你可以检查实时的运行时路由注册情况,反编译已加载的类,构建类内调用证据,并从内存中移除已确认的恶意注册 —— 所有这些都无需重启目标应用程序。 ## 功能 - **路由清点** — 枚举实时的路由注册,包含 classloader、superclass、interface、field 和 method 元数据。 - **即时反编译** — 直接从 JVM 字节码反编译已加载的类或单个方法,由 CFR 提供支持。 - **调用证据** — 追踪从请求处理方法到可疑 sink 的类内调用链,由 ASM 提供支持。 - **内存移除** — 根据路由类型和类名移除已确认的恶意注册,并验证其已被移除。 - **结构化输出** — 每个命令都返回一个 `{success, data, errors}` JSON 封装,易于通过 `jq` 进行管道处理。 - **非常驻** — 通过 PID 附加,运行一个操作,然后分离;目标中不会保留已加载的 agent。 - **广泛的运行时支持** — 为 Java 8 构建并可在 JDK 17 上运行(自动处理模块访问限制)。 ## 支持的路由类型 | 类型 | 中间件 | 描述 | |------|------------|-------------| | `filter` | Tomcat | Filter 注册和 URL 匹配模式 | | `listener` | Tomcat | 应用和生命周期 listener | | `valve` | Tomcat | Pipeline valve | | `servlet` | Tomcat | Servlet 包装器和映射 | | `controller` | Spring Web MVC | 请求映射和 URL handler | | `interceptor` | Spring Web MVC | Handler interceptor 和已映射的 interceptor | ## 构建 使用 Maven 构建 shaded jar: ``` mvn clean package ``` 或者构建 jar 并将其复制到内置技能的 `scripts/` 目录中: ``` ./build.sh ``` ## 使用说明 安装内置的 skill,以便可以在 Claude Code、Codex 和其他 agent 中直接使用: ``` npx skills add X1r0z/memshell-killer ``` 或者直接调用 CLI: ``` java -jar memshell-killer.jar [options] ``` 使用标准的 JDK 工具查找目标 JVM PID: ``` jps -lv jcmd ``` ### dump 列出实时的路由注册。 ``` java -jar memshell-killer.jar dump [--type ] ``` | 选项 | 描述 | |--------|-------------| | `` | 目标 JVM 进程 ID | | `--type` | 可选的路由类型(`filter`/`listener`/`valve`/`servlet`/`controller`/`interceptor`);省略以检查所有类型 | ``` # 所有 route 类型 java -jar memshell-killer.jar dump 12345 # 仅 filters java -jar memshell-killer.jar dump --type filter 12345 # Surface broad / catch-all routes java -jar memshell-killer.jar dump 12345 \ | jq '.data[] | select((.routes // []) | any(. == "/*" or . == "/**" or . == "/")) | {type, context, routes, name, className}' ``` ### decompile 反编译已加载的类。 ``` java -jar memshell-killer.jar decompile --class-name [--method ] ``` | 选项 | 描述 | |--------|-------------| | `--class-name` | 完全限定的已加载类名 | | `--method` | 可选的要反编译的单个方法 | ``` java -jar memshell-killer.jar decompile --class-name com.example.SuspiciousFilter 12345 \ | jq -r '.data.source' ``` ### call 构建类内调用证据。 ``` java -jar memshell-killer.jar call --class-name ``` | 选项 | 描述 | |--------|-------------| | `--class-name` | 完全限定的已加载类名 | 当反编译后的行为不明确,或者你需要简明的证据来证明请求处理方法到达了可疑 sink(例如 `Runtime.exec`、`ProcessBuilder`、`defineClass`、`ScriptEngine`)时,请使用此命令。其结果是类内证据,而不是整个应用程序的数据流证明。 ``` java -jar memshell-killer.jar call --class-name com.example.SuspiciousFilter 12345 \ | jq -r '.data.chains[]?' ``` ### remove 移除已确认的路由注册。 ``` java -jar memshell-killer.jar remove --type --class-name ``` | 选项 | 描述 | |--------|-------------| | `--type` | 路由类型(`filter`/`listener`/`valve`/`servlet`/`controller`/`interceptor`) | | `--class-name` | 完全限定的已加载类名 | 仅对**已确认**的恶意注册使用移除操作,并需提供之前 `dump` 中的确切 `type` 和 `className`。 ``` java -jar memshell-killer.jar remove --type filter --class-name com.example.SuspiciousFilter 12345 ``` 移除后,检查 `data.removed` 和 `data.details`,然后重新运行一次针对性的 `dump` 以验证路由是否已被移除。如果 `removed` 为 `0`,请重新检查路由类型、类名、classloader、上下文、框架包装器/代理,或者它是否已被移除。 ## 许可证 MIT
标签:GHAS, Java Web, Java安全, JS文件枚举, JVM Agent, 内存马查杀, 域名枚举, 库, 应急响应