cev-api/Java-Triage

GitHub: cev-api/Java-Triage

面向可疑 Java 代码库的静态分类工具,支持解密常见混淆字符串并检测恶意行为指标。

Stars: 0 | Forks: 0

# Java Triage ![1](https://i.imgur.com/UI2YkSr.png) ![2](https://i.imgur.com/jBc8bNq.png) ![3](https://i.imgur.com/kJiw9Uh.png) ![4](https://i.imgur.com/QelAGpR.png) `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) 上看到了这个: ![Loser](https://i.imgur.com/mlxkzbL.png) 这又是另一个非常明显的 Minecraft 账户窃取程序/木马,它利用虚假视频引诱傻瓜丢失账户。 这促使我制作了这个 Python 应用程序,以快速对此类明显的分发内容进行分类。事实证明是的,它确实会窃取你的 Minecraft 凭证并将其发送到 Discord webhook,该 webhook 隐藏在另一个 API 之后。然后它会下载另一个木马,该木马使用 JNIC(拙劣地)提取 Windows 二进制文件作为第二个 payload。鉴于那个 payload 也不是 Java,我目前的兴趣就到此为止了。 更新:Mediafire 已针对此仓库添加了警告,他们真好! ![Media](https://i.imgur.com/nTrHgDA.png) ## 环境要求 - 推荐使用 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检测, 云安全监控, 云资产清单, 代码生成, 勒索软件分析, 反混淆工具, 威胁情报, 字符串解密, 开发者工具, 渗透测试工具, 知识库安全, 网络信息收集, 网络安全审计, 网络犯罪分析, 逆向工程, 速率限制处理, 静态分析