Juwon1405/yushin-mac-artifact-collector
GitHub: Juwon1405/yushin-mac-artifact-collector
一款面向macOS的零依赖模块化DFIR取证数据收集脚本,可快速提取系统、网络、浏览器、持久化等十类关键artifact并生成符合取证标准的SHA-256清单。
Stars: 1 | Forks: 0
# yushin-mac-artifact-collector
[](https://www.gnu.org/software/bash/)
[](https://support.apple.com/macos)
[](LICENSE)
[]()
一个模块化、符合取证标准的 artifact 收集工具,专为需要从 macOS 终端快速获取取证数据的 DFIR 分析师构建 —— 无需安装 Agent,无需 Homebrew,无需 Python。只需 `bash` + macOS 内置工具。
## ✨ 亮点
- **单文件,零依赖。** 将 `collector.sh` 拷贝到任何 macOS 机器(10.15+)上并运行即可。
- **10 个独立模块。** 可运行全部、单个或逗号分隔的部分模块。
- **符合取证标准。** 为每个收集的 artifact 提供 SHA-256 清单,确保证据保管链的完整性。
- **超时保护。** 每个命令都被包装执行 —— 无响应的命令会被终止并标记为 `[timeout]`,绝不会阻塞整个运行过程。
- **供应链攻击模块。** 内置 IOC 扫描,针对 [litellm PyPI 供应链攻击 (2026-03)](https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/) 以及通用的 `.pth` / 缓存投毒模式。
- **带有 WAL/SHM 的浏览器数据库。** 连同附属文件一起复制 Chrome / Edge / Firefox / Safari 的历史记录,以保留未提交的事务。
## 🚀 快速开始
```
# 完整收集(所有 modules)— 建议使用 sudo 以确保完整覆盖
sudo ./collector.sh
# 快速模式(缩减的 log 窗口,更快的收集)
sudo ./collector.sh --quick
# 仅运行特定 modules
./collector.sh --modules supply_chain,network,persistence
# 列出可用 modules
./collector.sh --list-modules
```
**输出:** 当前工作目录下的 `{hostname}_{YYYYMMDD_HHMM}.zip`。
## 📋 要求
| 项目 | 详情 |
|------|--------|
| 操作系统 | macOS 10.15 (Catalina) 或更高版本 |
| Shell | `/bin/bash`(所有 macOS 均预装) |
| 权限 | 无需 `sudo` 即可运行,但**建议使用 `sudo`** 以完整访问 `/Library/`、`/var/log/` 和 Unified Log |
| 依赖 | 无 —— 仅使用 macOS 内置工具(`system_profiler`、`log`、`sqlite3`、`lsof`、`ditto` 等) |
| 磁盘 | 收集期间在 `/tmp/` 中需要约 50–300 MB 临时空间(自动清理) |
## 🧩 模块
收集工具被组织为 **10 个独立模块**。可以通过 `--modules` 单独调用或以任意组合调用每个模块。
### 核心取证模块
#### `system`
操作系统级别的配置和安全态势。
- macOS 版本、硬件配置文件、内核信息、运行时间、启动时间
- Gatekeeper、SIP (System Integrity Protection)、FileVault 状态
- 已加载的内核扩展(`kextstat`、`kmutil`)
- XProtect / 隔离事件历史(SQLite 导出)
- MDM 注册状态
- Python 解释器代码签名验证
#### `persistence`
在重启或登录后仍能存留的机制。
- 正在运行的进程(`ps aux`)
- LaunchAgents(用户 + 系统)、LaunchDaemons
- `launchctl list` 输出
- Crontab 条目、登录项
- `~/.config/` 脚本枚举(可捕获 `sysmon.py` 等供应链后门模式)
#### `accounts`
用户身份和活动历史。
- 本地用户列表(`dscl`)
- 登录历史(`last -100`)
- 完整的 `zsh_history` 和 `bash_history`
#### `network`
网络配置和活动连接。
- 接口配置、路由表、ARP 缓存
- 活动连接(`netstat -anv`、`lsof -nP -i`)
- DNS 配置(`scutil --dns`、`/etc/hosts`、`/etc/resolv.conf`)
- Unified Log 中的 SSH / VNC / ARD / 屏幕共享日志条目
#### `remote_kvm`
用于 IP-KVM 检测的 USB/Thunderbolt 设备枚举(例如,PiKVM、IPMI、iDRAC)。
- 针对 USB、Thunderbolt、以太网、网络、显示器的 `system_profiler`
- 跨设备清单针对 KVM/BMC/IPMI 指示器的关键字 grep
- 电源管理设置(`pmset`)
#### `security_agents`
端点安全工具健康检查。
- CrowdStrike Falcon:进程、daemon plist、二进制文件、日志
- Tanium:客户端二进制文件、plist、日志
- JAMF:二进制文件、JSS 连接、版本、plist
- 系统扩展状态、MDM 注册详情
#### `browser`
带有 WAL/SHM 完整性的浏览器历史数据库收集。
- Google Chrome(所有配置文件)
- Microsoft Edge(所有配置文件)
- Mozilla Firefox(所有配置文件)
- Safari
- 复制 `-wal` 和 `-shm` 附属文件以保留未提交的事务
#### `logs`
macOS Unified Log 和传统日志收集。
- Unified Log:过去 6 小时(完整模式)或 1 小时(快速模式)
- 过滤后的 Unified Log:身份验证、远程访问、TCC、隐私、安全代理事件
- `/var/log/system.log`、`/var/log/jamf.log`
#### `timeline`
软件安装时间线。
- 已安装的应用程序(`system_profiler SPApplicationsDataType`)
- 已注册的软件包(`pkgutil --pkgs`)
- `/Library/Receipts/InstallHistory.plist`
- `/var/log/install.log`
### 供应链攻击模块
#### `supply_chain`
Python 和 Node.js 供应链攻击 IOC 检测。为应对 [litellm PyPI 供应链攻击 (2026-03-24)](https://futuresearch.ai/blog/litellm-pypi-supply-chain-attack/) 而构建,但专为**通用供应链攻击分诊**设计。
| 检查项 | 检测内容 |
|-------|-----------------|
| **恶意 `.pth` 文件** | 全盘扫描 `litellm_init.pth` 并导出 `site-packages` 中所有 `.pth` 文件的内容 |
| **包审计** | 在所有 Python 解释器中执行 `pip list` / `pip show litellm` |
| **缓存投毒** | 扫描 `uv`、`pip` 和 `pipx` 缓存以查找恶意 artifact |
| **虚拟环境扫描** | 查找 `~/` 下的所有 `site-packages` 目录,检查 litellm 和 `.pth` 文件 |
| **后门持久化** | `~/.config/sysmon/sysmon.py`(litellm 后门模式) |
| **C2 通信** | 针对 `litellm.cloud` 的 DNS 解析日志,针对活动 C2 连接的 `lsof` |
| **凭据窃取** | SSH 密钥、AWS/GCP/Azure 凭据、kubeconfig、`.env` 文件的访问时间戳 |
| **Kubernetes 横向移动** | Service account token,`kube-system` 中的 `node-setup-*` pod |
| **Node.js 钩子** | `package.json` 中的 `preinstall` / `postinstall` 脚本检测 |
| **Fork 炸弹指标** | Python 进程计数(指数级 `.pth` 重复触发检测) |
**快速 litellm 扫描(单条命令):**
```
./collector.sh --quick --modules supply_chain
```
## 🚩 标志
| 标志 | 描述 |
|------|-------------|
| `--quick` | 减少 Unified Log 收集时间窗口(6小时→1小时短期,24小时→6小时长期)和行数限制。也可通过 `COLLECTOR_QUICK=1` 环境变量使用。 |
| `--modules mod1,mod2` | 要运行的模块的逗号分隔列表。仅执行指定的模块。 |
| `--list-modules` | 打印可用的模块名称并退出。 |
## 📦 输出结构
```
{hostname}_{timestamp}.zip
├── metadata/
│ ├── collection_meta.txt # Collector version, host, mode, modules
│ └── hashes_sha256.txt # SHA-256 manifest of all collected files
├── system/
├── persistence/
├── accounts/
├── network/
├── remote_kvm/
├── security_agents/
├── browser/
│ ├── chrome_Default_History.db
│ ├── chrome_Default_History.db-wal
│ ├── chrome_Default_History.db-shm
│ ├── safari_History.db
│ └── ...
├── logs/
├── timeline/
└── supply_chain/
├── pth_litellm_init.txt
├── pth_all_site_packages.txt
├── pip_list_all.txt
├── pip_show_litellm.txt
├── sysmon_backdoor_ls.txt
├── sysmon_backdoor_content.txt
├── dns_litellm_cloud.txt
├── credential_file_timestamps.txt
├── k8s_check.txt
└── ...
```
仅会为已启用的模块创建目录。`metadata/` 目录将始终存在。
## ✅ 完整性验证
每次收集都会包含 `metadata/hashes_sha256.txt` —— 这是归档中每个文件的 SHA-256 哈希值,在打包**之前**生成。解压后要进行验证:
```
cd {extracted_directory}
shasum -a 256 -c metadata/hashes_sha256.txt
```
## 🎯 设计原则
- **零依赖。** 不需要 Python,不需要 Ruby,不需要 Homebrew 包。纯粹的 bash + macOS 内置工具。
- **超时保护。** 每个命令都带有独立的超时设置(默认 120 秒,可按命令配置)运行。无响应的命令将被终止并在输出中标记为 `[timeout]`。
- **非破坏性。** 只读收集 —— 不修改任何文件,不更改目标系统上的任何设置。
- **便携。** 单个文件,通过 `scp` / AirDrop / USB 复制后即可立即运行。
- **符合取证标准。** 提供 SHA-256 清单,用于证据保管链文档记录。
## 🔧 扩展收集工具
要添加新模块:
1. 按照现有模式定义一个名为 `module_{name}()` 的函数
2. 将模块名称添加到 `ALL_MODULES` 变量中
3. 在 `--list-modules` 输出中添加一行描述
4. 在函数顶部使用 `add_steps N` 以实现准确的进度跟踪
5. 使用 `capture`、`copy_if_exists` 或 `copy_with_wal` 辅助函数进行收集
```
module_my_custom() {
add_steps 3
capture "some_command" "$WORK/my_custom/output.txt"
capture "another_command" "$WORK/my_custom/other.txt"
copy_if_exists "/path/to/artifact" "$WORK/my_custom/artifact.bin"
}
```
## ⚠️ 已知限制
- **完全磁盘访问权限 (FDA):** 部分 artifact(例如 Safari 历史记录、Mail 数据库)需要在 **系统设置 → 隐私与安全性 → 完全磁盘访问权限** 中为 Terminal 或 iTerm 授予 FDA。如果没有 FDA,这些文件将显示 `[skip] not found` 或 `Operation not permitted`。
- **Unified Log 深度:** macOS Unified Log 的保留期因系统而异。在日志量庞大的系统上,较旧的条目即使在 24 小时窗口内也可能已被轮换覆盖。
- **SIP 保护路径:** System Integrity Protection 会阻止访问某些系统目录。使用 `sudo` 运行会有所帮助,但某些路径在设计上仍不可访问。
- **浏览器数据库锁定:** 如果浏览器正在运行,复制的数据库文件可能处于部分写入状态。WAL/SHM 的复制可以缓解此问题,但若要进行取证级别的浏览器分析,建议关闭浏览器或使用 `sqlite3` 的 `.clone` 命令。
## 🤝 配套平台
如需一个基于 Web 的**取证平台**来接收此收集工具的 ZIP 输出、将 artifact 解析为可搜索的证据表并生成 DFIR PDF 报告(可选本地 Ollama / OpenAI 辅助),请参见:
➡️ **[yushin-mac-forensics-platform](https://github.com/Juwon1405/yushin-mac-forensics-platform)**
## 📜 版本历史
| 版本 | 日期 | 变更 |
|---------|------|---------|
| 2.0 | 2026-03-25 | 模块化架构,`--modules` 选择性执行,`supply_chain` 模块(litellm PyPI IOC),`--quick` CLI 标志,WAL/SHM 浏览器数据库支持,进度跟踪大修 |
| 1.0 | 2026-01 | 初始的单体收集工具,涵盖系统、持久化、网络、浏览器、安全代理和远程 KVM |
## 📄 许可证
MIT —— 详见 [LICENSE](LICENSE)。
## ✍️ 作者
**YuShin (優心 / Bang Juwon)** —— DFIR 从业者,东京。
如果此工具对您有帮助,欢迎给仓库点个 ⭐。欢迎提交 Issue / PR。
标签:Artifact Collector, DAST, HTTP工具, IOC扫描, Linux/macOS运维, PB级数据处理, SHA-256校验, 供应链攻击, 单文件, 取证收集, 子域名变形, 安全运维, 库, 应急响应, 应急响应工具, 应用安全, 恶意软件分析, 搜索语句(dork), 数字取证, 数字取证, 文档安全, 模块化设计, 浏览器取证, 终端安全, 网络安全审计, 自动化修复, 自动化脚本, 自动化脚本, 证据保全, 零依赖