lehasaS/JavaClassDumper
GitHub: lehasaS/JavaClassDumper
一款用于 Java 类文件泄露后的源码恢复与调查的自动化工具。
Stars: 0 | Forks: 0
# Java Class Dumper
你是否发现某个 Java Web 应用程序暴露了类文件(例如在 `.../WEB-INF/classes/` 下)?
如果能发现一个类路径,通常可以通过链式调用恢复更多类:
- 从反编译源码中导入,
- 部署描述符(`web.xml` 等),
- 反编译器输出中的未解析依赖提示。
`java_class_dumper.py` 自动化了这一恢复循环。
## 此工具的作用
`java_class_dumper.py` 是一个用于 Java 应用源码泄露调查的通用类恢复管道。
它结合了:
- `.java` 源码中的导入解析,
- `.class` 路径重建,
- 带重试/续传的 HTTP 下载,
- CFR 反编译,
- 从 CFR 头部(`Could not load the following classes`)迭代扩展依赖。
目标是消除重复的手动循环:
1. 下载类,
2. 反编译,
3. 检查缺失类,
4. 用新目标重新运行。
## 管道概览
每次运行,该工具可以:
1. 解析 `--java-root` 中的导入。
2. 从部署描述符(`web.xml` 等)播种类队列。
3. 从 `--java-root` 下现有的 CFR 头部播种类队列。
4. 可选地反编译 `--java-root` 下的本地 `.class` 文件,并从发现的依赖中播种。
5. 从 `--base-url` 下载未解析的 `.class` 文件。
6. 用 CFR 反编译新下载的类。
7. 解析 CFR 缺失类头部并排队新类。
8. 重复直到收敛或达到 `--max-auto-passes`。
## 要求
- Python 3.9+
- Java 运行时(`java`)在 PATH 中
- [CFR](https://github.com/leibnitz27/cfr) Java 反编译器
- 对目标类 URL 根的网络访问
## 安装
```
# 1) Git clone the repository
git clone https://github.com/lehasaS/JavaClassDumper
# 2) Enter the tool directory
cd JavaClassDumper
# 3) (Recommended) create and activate a virtualenv
python3 -m venv .venv
source .venv/bin/activate
# 4) Install dependencies (currently stdlib-only; keeps workflow consistent)
pip install -r requirements.txt
# 5) Install the tool in editable mode (adds `java-class-dumper` CLI entrypoint)
# `--no-build-isolation` helps in offline/restricted environments.
pip install -e . --no-build-isolation
# 6) Verify
java-class-dumper --help
```
说明:
- 保持你的 CFR jar 可访问,并通过 `--cfr-jar /path/to/cfr.jar` 传递。
- 如果你喜欢直接执行,仍然可以运行 `python3 java_class_dumper.py ...`。
## 安全 / 范围
- 仅在你被授权评估的系统上使用。
- 本工具用于防御性工件恢复和分析工作流。
## 基本用法
```
python3 java_class_dumper.py \
--java-root \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--cfr-jar /path/to/cfr.jar
```
## 现有转储工作流
如果你已经有反编译源码(示例文件夹名):
```
python3 java_class_dumper.py \
--java-root Vulnerable-App-Decompiled-Source/ \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--cfr-jar cfr.jar \
--verbose
```
即使没有先前的 `imports_fetch_report.json` 也有效。
## 输出与合并行为
默认行为是合并友好:
- `--output-dir` 默认自动推断靠近 `--java-root`。
- 对于 `*Decompiled` 根,如果存在同级 `*Downloaded` 则复用。
- 否则复用 `Downloaded`、`downloaded` 或 `mirror`(位于输出根下)。
- 仅通过 `--new-mirror-run` 强制新建镜像文件夹。
## 类根行为
`--class-root` 是可选的。
如果省略,默认保持中性(`/`),不会假设特定产品的披露路径。
示例:
- `https://vulnerable.application.com/WEB-INF/classes/` + 默认类根 -> `com/vulnerable/Application.class`
- `https://vulnerable.application.com/custom/path/` + 显式 `--class-root /java_class_internal/classes` -> `/java_class_internal/classes/com/vulnerable/Application.class`
## 播种来源
### 1) `.java` 中的导入
- 解析 `import ...;`
- 处理静态导入和可选通配符扩展(`--expand-wildcards`)
### 2) 部署描述符(`--seed-from-descriptors`)
解析 `--java-root` 下的 XML 并从标签中提取类,例如:
- `servlet-class`
- `filter-class`
- `listener-class`
- `ejb-class`
- `home`、`remote`、`local-home`、`local`、`service-endpoint`
### 3) CFR 头部(`--seed-from-cfr-headers`)
解析:
- `Could not load the following classes:`
### 4) 本地 `.class` 文件(`--seed-from-local-class-files`)
如果 `--java-root` 下已存在 `.class` 文件,会先反编译它们以发现更多缺失类。
## 过滤行为
### 标准命名空间排除(默认)
默认排除以下项:
- `java.`
- `javax.`
- `jakarta.`
- `sun.`
- `com.sun.`
- `org.w3c.`
- `org.xml.`
使用 `--exclude-prefix` 添加更多。
### 包含前缀处理
- 如果提供了 `--include-prefix`,则强制执行。
- 如果未提供 `--include-prefix`,工具将使用所有非标准导入。
## 恢复 / 状态
默认情况下,工具从以下位置恢复:
- 现有的镜像文件,
- 之前的 `imports_fetch_report.json`(如果存在)。
使用 `--no-resume` 禁用恢复。
失败处理:
- 默认跳过之前的失败(`--skip-previous-failures`)
- 模式:`hard`(默认)或 `all`
## 反编译行为
默认启用反编译(`--decompile`)。
每次传递:
- 反编译新下载的类,
- 挖掘 CFR 头部中的未解析类,
- 将未解析类排队到下一次传递。
使用 `--max-auto-passes` 设置扩展限制(默认 `8`)。
## 重要标志
- `--java-root`
- `--base-url`
- `--class-root`
- `--output-dir`
- `--include-prefix`
- `--exclude-prefix`
- `--decompile / --no-decompile`
- `--cfr-jar`
- `--decompiled-dir`
- `--seed-from-cfr-headers / --no-seed-from-cfr-headers`
- `--seed-from-descriptors / --no-seed-from-descriptors`
- `--seed-from-local-class-files / --no-seed-from-local-class-files`
- `--threads`
- `--insecure`
- `--verbose`
## 实用配方
### 1. 描述符引导(`web.xml` 引导)
```
python3 java_class_dumper.py \
--java-root Vulnerable-App-Decompiled-Source/ \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--seed-from-descriptors \
--seed-from-cfr-headers \
--seed-from-local-class-files \
--cfr-jar cfr.jar \
--verbose
```
### 2. 限制到已知包家族
```
python3 java_class_dumper.py \
--java-root Vulnerable-App-Decompiled-Source/ \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--include-prefix com.vulnerable.application. \
--include-prefix org.vendor.product. \
--cfr-jar cfr.jar
```
### 3. 仅下载(不反编译)
```
python3 java_class_dumper.py \
--java-root Vulnerable-App-Decompiled-Source/ \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--no-decompile
```
### 4. 强制新建镜像文件夹
```
python3 java_class_dumper.py \
--java-root Vulnerable-App-Decompiled-Source/ \
--base-url https://vulnerable.application.com/WEB-INF/classes/ \
--new-mirror-run
```
## 报告文件
默认报告路径:
- `/imports_fetch_report.json`
计数器包括:
- 选中的导入/类
- 自动传递次数
- 下载文件数
- 失败数
- CFR 发现的类计数
- 描述符/CFR/本地种子计数
## 故障排除
### `Selected imports: 0`
- 验证 `--java-root` 是否确实包含可解析的 `.java` 和/或描述符。
- 如果使用了 `--include-prefix`,请检查它是否过于狭窄。
- 确保已启用所需的播种标志。
### TLS 证书错误
- 优先使用正确的主机名/证书链。
- 对于具有不匹配证书的控制实验室测试:使用 `--insecure`。
### CFR 无法运行
- 确保已安装 Java。
- 验证 `--cfr-jar` 路径。
### 错误的远程路径
- 验证 `--base-url` / `--class-root` 组合。
- 在已知披露路径时优先使用显式 `--class-root`。
## 注意事项
- 默认在 TTY 中启用颜色;通过 `--no-color` 禁用。
- 使用 `--verbose` 获取逐次传递的详细诊断信息。
标签:CFR, Class文件, HTTP下载, Java运行时, JS文件枚举, URL提取, WEB-INF, WebSocket, 云资产清单, 依赖分析, 信息泄露, 关键词优化, 反编译, 源码恢复, 源码泄露, 路径恢复, 逆向工具, 逆向工程, 部署描述符, 重试机制