YDSantos12/blast-radius

GitHub: YDSantos12/blast-radius

BLAST-RADIUS是一款后渗透取证工具,用于分析开发工作站的安全风险。

Stars: 2 | Forks: 2

# BLAST-RADIUS 针对受损开发工作站的凭据清单与撤销计划。 凌晨 3 点,当开发者执行了一个恶意的 npm 包或安装了受损的 VS Code 扩展时,在任何警报触发之前,主机就已经被攻陷了。EDR 会记录下它执行了什么——进程、hash、命令行。但没有一个能提供分析师真正需要的信息:用户拥有哪些凭据,每项凭据在外部能解锁什么,以及应该按什么顺序撤销。分析师通常需要花费 2 到 6 个小时手动重建这个清单,而与此同时 token 却依然有效。 ## 它的功能 collector 会枚举受损用户可访问的每一项凭据——它是什么、在哪里、能解锁什么。engine 会生成 Burn List:一份按优先级排序的 HTML 报告,包含每项凭据的确切撤销步骤,此外如果该机器已成为新一轮攻击的源头,它还能检测到攻击的横向传播。 清单涵盖: - npm token - GitHub PAT 和 OAuth token - SSH 私钥 - AWS IAM 凭据 - Azure 和 GCP token - PyPI token - Docker registry 凭据 - VS Code 扩展密钥 (state.vscdb) - 环境变量 - Windows Credential Manager - 嵌入了 token 的 git 仓库远程 URL ## Burn List Burn List 是 engine 的输出——一个可以在任何浏览器中打开的 HTML 文件,无需依赖互联网连接。每项凭据都会被归入以下四个级别之一,并按紧急程度排序。 - **立即撤销** — 高权限凭据,需在继续调查前撤销:GitHub PAT、具有活动连接且无 passphrase 的 SSH 密钥、长期的 AWS IAM 密钥、具有发布权限的 npm token。 - **轮换** — 中等权限。在同一 IR 会话中进行轮换。 - **审计** — 在事件时间窗口内,检查相关的仓库和 pipeline 是否有未经授权的更改。 - **监控** — 低风险,或者在 v0.1 版本中无法解析出外部权限。 如果该机器发布了包、注册了 GitHub Actions 的 self-hosted runner、注入了 workflow 文件,或者创建了用于数据外传的仓库——报告会在单独的章节中将其标记出来。每一项事件都包含严重程度和所需采取的操作。这一点至关重要,因为受损的机器可能就是下一波攻击的源头。 BLAST-RADIUS 不会试图证明数据发生了外传。它采用 Zero Trust (NIST SP 800-207) 的“ assume-breach ”(假设已沦陷)原则:受损用户进程可访问的所有内容都将被视为已暴露。优先级的撤销策略与 NIST SP 800-61 (Incident Response) 的遏制阶段保持一致。 ## 用法 ### 收集(在受损机器上) 将二进制文件传输到已隔离的主机。以受损用户的身份执行——**不要**以 SYSTEM 或管理员身份运行。凭据存储的作用域仅限于用户;以 SYSTEM 身份运行会导致收集不完整。 `-window` 标志接收 ISO 8601 UTC 格式的事件窗口开始时间戳。如果省略,默认值为 24 小时前——在开始之前,请根据真实的事件发生时间进行更正。 ``` # Windows .\blast-radius-collector-windows-amd64.exe -verbose -window 2026-06-01T03:00:00Z ``` ``` # macOS (v0.2) ./blast-radius-collector-darwin-amd64 -verbose -window 2026-06-01T03:00:00Z ``` 通过加密通道将 `collection--.json` 文件传输到分析师的机器上。该文件以明文形式包含所有环境变量。嵌入了 token 的 git 仓库远程 URL(`https://TOKEN@github.com/...`)同样会在不做脱敏处理的情况下保存,以便 engine 提取出 token。 ### 分析(在分析师的机器上) ``` pip install -r engine/requirements.txt cd engine python main.py analyze ../path/to/collection.json ``` 要覆盖在收集阶段定义的事件时间窗口: ``` python main.py analyze ../path/to/collection.json \ --window-start 2026-06-01T03:00:00Z ``` 结果将生成为当前目录下的 `burnlist--.html`。 ## 部署 **物理访问。** 使用存有二进制文件的 U 盘。在受损机器上以受损用户的身份本地执行。 **EDR Live Response。** 大多数企业级 EDR 可以通过 agent 通道远程执行二进制文件:CrowdStrike RTR、Microsoft Defender Live Response、SentinelOne RSO、Kaspersky Execution Task。上传二进制文件,以用户身份执行,再通过同一通道取回 JSON。在执行之前,请将二进制文件的 hash 添加到 EDR 的排除项中——凭据枚举会触发行为检测。 **WinRM / SSH。** 如果主机尚未被隔离且远程管理可用,可通过 `Invoke-Command` 或 `ssh` 进行复制和执行。 每次收集都会包含 `meta.collector_hash`——即执行文件的 SHA-256 hash。在信任该收集结果之前,请将其与 release 中发布的 hash 进行比对验证。 ## 编译 要从源代码编译: ### Collector (Go 1.22+) ``` git clone https://github.com/YDSantos12/blast-radius cd blast-radius/collector go mod tidy ``` ``` # Windows $env:GOOS="windows"; $env:GOARCH="amd64" go build -ldflags="-s -w" -trimpath ` -o dist/blast-radius-collector-windows-amd64.exe ./cmd/collector ``` ``` # macOS (Intel) GOOS=darwin GOARCH=amd64 \ go build -ldflags="-s -w" -trimpath \ -o dist/blast-radius-collector-darwin-amd64 ./cmd/collector # macOS (Apple Silicon) GOOS=darwin GOARCH=arm64 \ go build -ldflags="-s -w" -trimpath \ -o dist/blast-radius-collector-darwin-arm64 ./cmd/collector ``` ### Engine (Python 3.10+) ``` cd engine pip install -r requirements.txt python main.py analyze --help ``` ## 限制 **收集过程无法证明数据外传。** BLAST-RADIUS 假设用户可访问的所有内容都已被读取。在没有文件读取 (file-read) 遥测技术(Sysmon 的默认配置不捕获此类数据)的 Windows 环境下,证明特定文件被特定进程读取是不可能的。这种“ assume-breach ”姿态采用了 Zero Trust (NIST SP 800-207) 原则,并与 NIST SP 800-61 (Incident Response) 的遏制阶段保持一致。 **在 v0.1 版本中未实现在线权限解析。** collector 不会保留原始的 token 值——脱敏后的值无法用于调用 GitHub 或 npm 的 API。GitHub token 会被默认归入“立即撤销”级别,无论其实际作用域如何。在线解析功能计划在 v0.2 版本中推出。 **collection.json 的信任边界。** engine 会完全信任接收到的 collection.json。如果文件中被篡改了 `context` 字段——例如在没有 passphrase 的 SSH 密钥中填入了 `has_passphrase: true`——将直接影响级别的分配。在正规的 IR 流程中,这不会造成问题。但如果对收集结果的真实性存疑,请独立核实高价值凭据。 **Windows Credential Manager 与浏览器凭据。** 受 DPAPI 保护的凭据需要用户的会话才能解密。collector 会记录其存在,但在没有解密密钥的情况下不会读取其值。这些存储区需要进行手动检查。 **macOS 支持将在 v0.2 版本中推出。** collector 可以编译为 darwin 版本,但 macOS 特有的路径——Keychain 和 VS Code 原生存储——在 v0.1 版本中尚未实现。 ## 背景 2025 年 11 月,Shai-Hulud 2.0 蠕虫通过 `postinstall` 脚本感染了 npm 包,这些脚本会在开发者的主目录下执行 TruffleHog。找到的密钥随后被外传到名为“Sha1-Hulud: The Second Coming”的公开仓库中。随后,该主机会被注册为名为 SHA1HULUD 的 GitHub Actions self-hosted runner。BLAST-RADIUS 可以检测到 runner 痕迹、外传仓库的命名模式以及 TruffleHog 缓存的存在。 在 2025 年至 2026 年期间,GlassWorm 蠕虫通过 VS Code 扩展进行传播。不可见的 Unicode 字符隐藏了一个第二阶段的 loader。其 C2 通信通过 Solana 区块链和 Google Calendar 进行。它通过 Windows 的 Run 键实现持久化。BLAST-RADIUS 会对 VS Code 扩展的状态以及 Run 键的修改进行盘点记录。 ## 截图 **正在受损机器上运行的 collector(已隔离的虚拟机,无网络连接)** ![Collector 启动收集模块](https://static.pigsec.cn/wp-content/uploads/repos/cas/3b/3b9b8c63b50b753c23659717b63e8b5c4f99a434ca9b9f6fb0faff4d1424dbc7.png) **完整的收集输出——模块、敏感数据警告及 JSON 路径** ![包含所有已完成模块的 collector 输出](https://static.pigsec.cn/wp-content/uploads/repos/cas/9f/9f067570a202b2cab0f243ace940cf89358fa1d6c4aa759c51687ad088e55270.png) **Burn List——包含收集元数据的文件头以及检测到传播的横幅** ![包含“检测到传播源”的 Burn List 文件头](https://static.pigsec.cn/wp-content/uploads/repos/cas/f0/f0b7ab79262bac41e8873b19e9bdc5b4cb1cc8d68f9055021922aca60674cdfc.png) **传播章节——识别出 SHA1HULUD runner 并关联至 Shai-Hulud 2.0** ![严重传播:runner_registration SHA1HULUD](https://static.pigsec.cn/wp-content/uploads/repos/cas/f7/f77d643077759cdcbbe79263147a0344bdda82e9ca1ef8db442e423a30c22f0e.png) **立即撤销级别的凭据——解析出权限的 npm token、AWS IAM 和 SSH 密钥** ![处于“立即撤销”级别的三项凭据及其撤销 URL](https://static.pigsec.cn/wp-content/uploads/repos/cas/72/72d06010552c45ba4649d6e5b62f782d8645af9953456034f7ccb40e1065824e.png) MIT BLAST-RADIUS 是一款取证辅助工具,而非法律仪器。Burn List 中的级别代表了在 Zero Trust (NIST SP 800-207) 的“ assume-breach ”原则下、应用于 NIST SP 800-61 (Incident Response) 遏制阶段时所作出的操作风险评估——它们不能作为发生受损或数据外传的证据。撤销决策应由分析师和 incident commander 负责。请勿在未经授权的主机上执行 collector。
标签:EVTX分析, StruQ, 事件响应, 凭据管理, 凭证收集, 安全, 库, 应急响应, 数字取证, 自动化脚本, 超时处理