cev-api/Java-Triage
GitHub: cev-api/Java-Triage
面向可疑 Java 代码库的静态分类工具,支持解密常见混淆字符串并检测恶意行为指标。
Stars: 0 | Forks: 0
# Java Triage




`java_triage.py` 是一个用于可疑 Java 代码库的静态分类工具。
它递归扫描 `.java` 文件,解密已知的字符串调用模式,扫描可疑的字符串字面量,提取行为指标,查找可疑的工件文件,并可选择从链上配置数据中解析运行时 C2 提示。
## 功能
- 解密 `StringDecrypt.decrypt(new byte[]{...})` 调用(多轮重写)。
- 解密 `load(new int[]{...}, new int[]{...}, k1, k2)` 模式(多轮重写)。
- 包含常见 Java 混淆器使用的确定性长度种子 XOR 流候选支持。
- 跟踪解密统计信息(已见/已替换/未解决,按系列计数,轮次计数)。
- 扫描普通 Java 字符串字面量以查找可疑指标(URL、命令执行字符串、payload 路径、编码块和关键字信号)。
- 检测 Discord 指标,包括 bot token、webhook URL 和 snowflake ID (guiQld/channel/user/role/application)。
- 检测额外的通信指标,包括 Telegram bot token/API 模式和通用的非 Discord webhook 模式。
- 检测额外的编码字面量(Base64/Base32/hex/XOR 恢复的文本,在可能的情况下)。
- 对解码后的字符串进行分类(URL、RPC 模板、凭证字段、路径、加密相关值等)。
- 标记行为指标,例如:
- 动态类加载/调用
- HTTP payload 下载和渗出模式
- 原生 payload 提取/加载
- 命令执行和投放器/提权辅助工具
- CMSTP/UAC 绕过和 Defender 篡改指标
- 将评估行为发现分为:
- `benign`(良性)
- `needs_review`(需审查)
- `suspicious`(可疑)
- 分配行为严重性(`critical`/`high`/`medium`/`low`/`info`)并报告严重性计数。
- 在文本/富文本报告中添加元数据前言(`Basic Properties`、`JAR Info`、`Bundle Info`)。
- 当本地工具/库可用时,可选择使用 `Vhash`、`SSDEEP`、`TLSH`、`TrID` 和 `Magika` 丰富元数据。
- 识别可疑工件(`*.jar.*`、大型不透明 `.dat`/`.bin`、嵌入式资源 payload)。
- 生成:
- 人类可读的文本输出(带有可选的富文本终端表格)
- 机器可读的 JSON 输出
## 默认解密行为
默认情况下,运行:
```
python java_triage.py
```
将会:
1. 对 `` 运行快速的混淆密度探测
2. 如果检测到任何支持的混淆调用模式,将 `` 复制到当前目录中的解密工作文件夹
3. 重写该副本中支持的混淆字符串调用
4. 扫描重写后的树(解密后扫描模式)
如果探测**未**检测到任何支持的混淆调用模式,则不会创建解密副本,而是直接扫描源树。
当前默认探测阈值:
- 总 `StringDecrypt.decrypt(...)` + `load(new int[]{...})` 调用次数 >= `1`
自动输出文件夹命名:
- `_deobfuscated`
- 如果存在:`_deobfuscated_2`、`_3` 等。
## 字符串 + Discord 覆盖范围
字符串字面量扫描(`"text"` 样式)包括:
- URL 和类似端点的字符串
- 命令/lolbin 模式(`cmd.exe`、`powershell`、`cmstp` 等)
- 路径/payload 指标(`.exe`、`.dll`、`.jar`、`.dat`、`.bin`、temp/appdata 路径)
- 高熵编码块(base64/hex 样式的字面量)
- 可疑关键字(`token`、`authorization`、`webhook`、`defender` 等)
行为扫描还包括:
- 环境变量访问(`System.getenv`)
- 通过 `URLClassLoader` 进行动态类加载(如果存在远程 HTTP 主机,则有额外信号)
- 本地 Minecraft 会话/账户文件路径引用(`session.json`、`launcher_accounts.json`、`.minecraft`),带有可选的渗出上下文
- 当用户名/UUID 读取与出站 HTTP 活动同时出现时,可能的身份信息渗出
针对 Discord 的检测包括:
- bot token
- webhook URL(`discord.com/api/webhooks/...`)
- snowflake ID(`17-20` 位数字的 ID)
- 包含 `guild_id`、`channel_id`、`user_id`、`role_id`、`application_id` 等标签的字面量中的上下文 ID
## Minecraft 会话文件访问检测
为了减少误报,会话/账户路径检测要求:
- Token 必须出现在 Java 字符串字面量中:`session.json`、`launcher_accounts.json` 或 `.minecraft`。
- 同一文件中存在文件 I/O 操作(例如 `new File(`、`Paths.get(`、`Files.read...`、`FileInputStream(`、`FileReader(`)。
这可以防止仅导入或 UI 文本被错误分类为文件访问。如果该文件中还包含出站 HTTP,则会针对可能的渗出行为发出额外的高严重性信号。
## Minecraft 身份信息渗出检测
当读取用户标识符且同一文件中出现出站 HTTP 时,扫描器会标记一个高严重性指标:
- 用户名读取:`method_1676()`、`getName()`、`getUsername()`
- UUID 读取:`method_44717()`、`GameProfile.getId()`、`Session.getUuid()` 及映射/yarn 变体
- 出站 HTTP 标记:发现的 host URL、`HttpClient.send(...)`、`OkHttpClient.newCall(...)`、`HttpURLConnection`
如果任何用户名/UUID 读取与出站 HTTP 同时出现,工具将发出 `possible_minecraft_identity_exfiltration` 及其源位置和证据。
此外,针对 Minecraft 会话/用户/配置文件访问的别名覆盖范围已扩展,以改善跨版本的检测:
- 会话存在/访问:`method_1548()`、`getSession()`、`getUser()`、`net.minecraft.client.util.Session`、`new Session(...)`
- 用户名访问:`method_1676()`、`getName()`、`getUsername()`
- UUID 访问:`method_44717()`、`getProfileId()`、`getUuid()`、`GameProfile.getId()`
- Token 访问:`method_1674()`、`getAccessToken()`、`session.getAccessToken()`
## 灵感
我在 [YouTube](https://www.youtube.com/watch?v=bsZJo49RaBE) 上看到了这个:

这又是另一个非常明显的 Minecraft 账户窃取程序/木马,它利用虚假视频引诱傻瓜丢失账户。
这促使我制作了这个 Python 应用程序,以快速对此类明显的分发内容进行分类。事实证明是的,它确实会窃取你的 Minecraft 凭证并将其发送到 Discord webhook,该 webhook 隐藏在另一个 API 之后。然后它会下载另一个木马,该木马使用 JNIC(拙劣地)提取 Windows 二进制文件作为第二个 payload。鉴于那个 payload 也不是 Java,我目前的兴趣就到此为止了。
更新:Mediafire 已针对此仓库添加了警告,他们真好!

## 环境要求
- 推荐使用 Python 3.9+
- 可选:[`rich`](https://pypi.org/project/rich/) 用于增强终端输出
- 用于元数据丰富的可选 CLI 工具:`ssdeep`、`tlsh`、`trid`、`vhash`
- 用于元数据丰富的可选 Python 包:[`magika`](https://pypi.org/project/magika/)
## 安装
脚本本身不需要安装包。
```
# 可选,用于 rich UI 输出
pip install rich
# 可选,用于 magika 元数据增强
pip install magika
```
## 用法
```
python java_triage.py [target]
```
随时查看完整选项列表:
```
python java_triage.py --help
```
### 示例
```
# 扫描当前目录
python java_triage.py
# 扫描特定的解压源码树
python java_triage.py ./sample_project
# 禁用默认的自动解密复制/重写并直接扫描源文件
python java_triage.py ./sample_project --no-auto-decrypt
# 显式将解密副本写入选定路径,然后进行扫描
python java_triage.py ./sample_project --decrypt-codebase-out ./sample_project_deobf
# 原地重写 (对目标树具有破坏性)
python java_triage.py ./sample_project --decrypt-codebase-in-place
# 仅重写;跳过解密后的分类扫描
python java_triage.py ./sample_project --no-rescan-after-decrypt
# JSON 输出到 stdout
python java_triage.py ./sample_project --json
# 保存 JSON 报告
python java_triage.py ./sample_project --json --out report.json
# 分析期间禁用任何网络查找
python java_triage.py ./sample_project --no-network
# 更宽的 rich 输出
python java_triage.py ./sample_project --rich-width 220
```
## CLI 选项
- `target`:要扫描的文件夹(默认:当前目录)
- `--json`:输出 JSON 而不是文本
- `--out `:将输出写入文件
- `--no-progress`:禁用进度消息
- `--no-network`:禁用通过网络进行的运行时 C2 解析
- `--rich-width `:用于进度/最终报告渲染的首选 rich 控制台宽度(默认:`120`,最小有效宽度:`80`)
- `--decrypt-codebase-in-place`:直接在目标树中重写支持的加密字符串调用
- `--decrypt-codebase-out `:将树复制到 ``,在那里重写,然后扫描重写后的树
- `--no-rescan-after-decrypt`:仅执行重写阶段并退出
- `--no-auto-decrypt`:禁用机会性的默认自动解密探测+重写行为
## 输出
文本输出包括:
- 分析上下文(原始目标 vs 活动扫描根目录)
- 基本属性(哈希 + 可选的丰富信息(如果可用))
- JAR 信息(manifest + 归档元数据)
- Bundle 信息(bundle 计数、时间戳、扩展名/类型)
- 解码 + 字符串发现
- 包括源行号(`file:line`)
- 包括明确的解密类别:
- `xor_decrypted_string`
- `decrypted_string`
- 评估发现(`benign`、`needs_review`、`suspicious`)
- 行为发现(带严重性)
- 工件发现
- 运行时 C2 解析状态
- 摘要计数(包括高风险发现、高风险行为、评估计数、类别总计、行为严重性总计)
- 感知解密的摘要计数器:
- `XOR decrypted strings`
- `Other decrypted strings`
- 从解密模式下的解密重写统计信息中填充
Rich 输出包括:
- 在分阶段处理之前显示启动横幅
- 最终报告之前的解密进度阶段和扫描进度阶段
- 更宽、展开的表格(`expand=True`),长文本可折叠
- `Analysis Context` 表格,显示分析何时在解密/提取的副本路径上运行
- 专用元数据部分(`Basic Properties`、`JAR Info`、`Bundle Info`)
- 专用 `Assessment Findings` 表格
- 带风险列的 `Behavioral Findings`
- `Decode + String Findings` 类别列宽度受限,以提高可读性
JSON 输出结构:
```
{
"root": "scanned/path",
"scan_mode": "post_decryption_only",
"deobfuscation": {
"calls_seen": 0,
"replaced": 0,
"unresolved": 0,
"stringdecrypt_xor_replaced": 0,
"stringdecrypt_other_replaced": 0,
"load_calls_seen": 0,
"load_replaced": 0,
"load_unresolved": 0,
"passes_run": 0
},
"target_metadata": {
"basic_properties": {},
"jar_info": {},
"bundle_info": {}
},
"summary": {
"xor_decrypted_count": 0,
"decrypted_string_count": 0,
"high_risk_behavior_count": 0,
"behavior_severity_counts": {
"critical": 0,
"high": 0,
"medium": 0,
"low": 0,
"info": 0
},
"assessment_counts": {
"benign": 0,
"needs_review": 0,
"suspicious": 0
}
},
"assessment_summary": {
"counts": {
"benign": 0,
"needs_review": 0,
"suspicious": 0
},
"findings": {
"benign": [],
"needs_review": [],
"suspicious": []
}
},
"runtime_c2": {},
"findings": [],
"behavior_findings": [
{
"severity": "info"
}
],
"artifact_findings": []
}
```
## 注意事项与限制
- 这是一个分类辅助工具,而不是完整的恶意软件沙箱或反编译器。
- 解密阶段是确定性的且基于启发式;不支持的例程自定义可能仍未解决。
- 行为检测基于签名/启发式,可能会产生误报或遗漏新颖的技术。
- 基于网络的运行时 C2 解析(`eth_call`)是尽力而为的,可能会因指标缺失、RPC 问题或解码差异而失败。
- 元数据丰富(`SSDEEP`/`TLSH`/`TrID`/`Magika`/`Vhash`)是尽力而为的,仅在存在依赖项时出现。
- **不要**依赖此工具作为确保你使用任何 Java 应用程序安全的手段。
标签:ATT&CK映射, C2提取, DNS 反向解析, GHAS, IP 地址批量处理, Java安全, Webhook检测, 云安全监控, 云资产清单, 代码生成, 勒索软件分析, 反混淆工具, 威胁情报, 字符串解密, 开发者工具, 渗透测试工具, 知识库安全, 网络信息收集, 网络安全审计, 网络犯罪分析, 逆向工程, 速率限制处理, 静态分析