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, 内存马查杀, 域名枚举, 库, 应急响应