amosroger91/First-On-Scene
GitHub: amosroger91/First-On-Scene
一款面向 MSP 的免费开源端点安全事件应急响应分诊工具,在完全离线且零依赖的条件下采集取证工件并给出确定性判定结果。
Stars: 1 | Forks: 0
## 🚨 怀疑机器被入侵?运行此命令。
你的设备上安装了 NinjaOne / ScreenConnect,并怀疑可能已被攻破。请在目标机器上运行这个**单一且自包含的命令**(在本地运行,或者直接粘贴到你的 RMM / ScreenConnect 运行命令窗口中)。它**无需安装任何依赖**,在分析期间**不会发起任何网络调用**,并会输出明确的判定结果——同时它还能标记出那些并非由你安装的远程访问软件。
```
$p="$env:TEMP\Invoke-FosTriage.ps1"; iwr "https://raw.githubusercontent.com/amosroger91/First-On-Scene/main/deploy/standalone/Invoke-FosTriage.ps1" -OutFile $p -UseBasicParsing; & $p -ExpectedRemoteTools 'NinjaOne,ScreenConnect'
```
它会输出如下控制台判定结果:
```
============================================================
FIRST-ON-SCENE :: PROBLEM_DETECTED (Incident)
HOST: WS-01 SCORE: 45 REASON: UNAUTHORIZED_REMOTE_ACCESS
============================================================
Remote-access tools found:
[expected] ScreenConnect / ConnectWise Control (process,service)
[UNAUTHORIZED] RustDesk (installed)
============================================================
Report: C:\ProgramData\FirstOnScene\cases\...\Incident_Report_*.html
```
它将以 `0`(无异常)/ `10`(监控)/ `20`(事件)/ `21`(数据泄露)作为退出代码退出,以便你的 RMM 根据不同结果执行分支逻辑,并且它会封装一个完整的取证案例文件夹(包含数据包 + SHA-256 清单 + 证据监管链)。物理隔离 / CJIS 环境?请预先下载单个文件,而不是使用 URL——请参阅[物理隔离指南](docs/DEPLOYMENT_AIRGAPPED.md)。
该脚本位于 [`deploy/standalone/Invoke-FosTriage.ps1`](deploy/standalone/Invoke-FosTriage.ps1)。
## 为什么 MSP 专业人员会将其保留在工具箱中
- **结论明确,拒绝噪音。** 确定性的、基于 MITRE ATT&CK 映射的规则引擎可产生明确的判定结果和评分——经过专门调优,避免在健康的机器上因误报而导致工具“狼来了”。
- **真正的 CJIS 就绪。** 默认情况下零网络出站流量。可选的 AI 仅限**本地运行**(Ollama,锁定在回环地址)。取证数据绝不离开端点。请参阅 [CJIS 合规态势](docs/CJIS_COMPLIANCE.md)。
- **取证严谨可靠。** 每个案例都通过 SHA-256 **清单**和防篡改的哈希链式**证据监管链**进行封装。哪怕修改一个字节,验证也会失败。
- **端点零依赖。** Windows 上运行纯 PowerShell 5.1,Linux/macOS 上运行纯 Bash + jq。你进行取证的设备上无需安装任何额外软件。
- **RMM 原生支持。** 清晰的退出代码 + 自定义字段输出。提供一流的 [NinjaOne](docs/DEPLOYMENT_NINJAONE.md)、[通用 RMM](docs/DEPLOYMENT_RMM.md) 和[物理隔离](docs/DEPLOYMENT_AIRGAPPED.md)部署支持。
- **免费开源。** MIT 许可证。所有工具均免费且开源。无需 API 密钥,无需 SaaS,无单节点授权成本。
## 快速开始
### Windows(以管理员身份运行 PowerShell)
```
.\scripts\win\fos.ps1
```
### Linux / macOS(需要 jq)
```
sudo bash scripts/nix/fos.sh
```
这条单一命令会运行整个 pipeline 并输出判定结果。退出代码如下:
| 退出代码 | 判定结果 | 含义 |
|---|---|---|
| `0` | ALL_CLEAR | 无需采取行动的异常 |
| `10` | MONITOR | 值得关注的低可信度发现 |
| `20` | PROBLEM_DETECTED | 事件 |
| `21` | PROBLEM_DETECTED | 数据泄露 |
| `1` | error | 运行失败 |
## 产出内容
每次运行都会在 `results/
/` 目录下创建一个**封装好的案例文件夹**:
```
bundle.json Raw collected artifacts (read-only collection)
findings.json Deterministic verdict + scored, ATT&CK-mapped findings (machine-readable)
findings.md Human-readable findings
Incident_Report_*.html Branded, shareable report
manifest.json SHA-256 of every evidence file
chain_of_custody.log Tamper-evident, hash-chained audit trail
Steps_Taken.txt Append-only action log
```
## 工作原理
```
┌──────────────────────┐ ┌───────────────────────────┐
endpoint │ COLLECTOR (native) │ bundle │ ANALYZER (deterministic) │
(read-only)│ PowerShell / Bash ├───────▶│ rule engine + scoring │
│ zero deps, zero net │ .json │ verdict + classification │
└──────────────────────┘ └─────────────┬─────────────┘
│
┌────────────────────────────────┼───────────────────────┐
▼ ▼ ▼
findings.json / .md HTML report decisive action
(+ optional LOCAL AI (branded) (All Clear /
narrative, advisory) Problem Detected
+ your hook)
```
- **Collector**(收集器)运行在(可能被入侵的)端点上。只读操作,无依赖,无网络外发。
- **Analyzer**(分析器)可运行在任何地方——在端点上或干净的分析员工作站上——并掌握最终判定结果。
- **AI 是可选的、仅限本地运行且仅作参考**——它会生成一段通俗易懂的英文叙述,但绝不改变判定结果。[设置指南](docs/AI_LOCAL_SETUP.md)。
检测规则位于 [`rules/detections.json`](rules/detections.json) 中——带有版本控制、ATT&CK 映射,且易于扩展。请参阅[编写指南](docs/RULES.md)。
## 部署说明
| 目标平台 | 指南 |
|---|---|
| **NinjaOne**(自定义字段,Conditions,退出代码) | [docs/DEPLOYMENT_NINJAONE.md](docs/DEPLOYMENT_NINJAONE.md) |
| **任何 RMM**(ConnectWise, Datto, Action1, Syncro, Atera, Tactical…) | [docs/DEPLOYMENT_RMM.md](docs/DEPLOYMENT_RMM.md) |
| **物理隔离 / CJIS 网络**(离线 USB 工具包) | [docs/DEPLOYMENT_AIRGAPPED.md](docs/DEPLOYMENT_AIRGAPPED.md) |
## 常用选项
```
# Branding + 自定义响应钩子
.\scripts\win\fos.ps1 -BrandName "Acme SOC" -CustomProblemScript C:\rmm\alert.ps1
# 仅收集(在干净的工作站上拉取 bundle 以进行离线分析)
.\scripts\win\fos.ps1 -Mode collect
# 分析之前收集的 bundle
.\scripts\win\fos.ps1 -Mode analyze -BundlePath .\results\\bundle.json
# 添加 LOCAL AI 叙述(需要 localhost 上的 Ollama;保留在 box 上)
.\scripts\win\fos.ps1 -EnableLocalAI
```
Linux 环境下的等效选项为 `--brand`, `--mode collect|analyze`, `--bundle`, `--enable-local-ai`。
## 验证证据完整性
```
Import-Module .\scripts\win\FOS.Common.psm1
Test-FosManifest -CaseDir .\results\ # SHA-256 of every evidence file
Test-FosCoc -CaseDir .\results\ # tamper-evident chain of custody
```
```
. scripts/nix/fos-common.sh
fos_manifest_verify results/
fos_coc_verify results/
```
## 文档
- [架构设计](docs/ARCHITECTURE.md)
- [CJIS 合规态势](docs/CJIS_COMPLIANCE.md)
- [编写检测规则](docs/RULES.md)
- [本地 AI 设置 (Ollama)](docs/AI_LOCAL_SETUP.md)
- [更新日志](CHANGELOG.md)
## 许可证
MIT — 请参阅 [LICENSE](LICENSE)。永久免费且开源。标签:AI合规, AI风险缓解, HTTP工具, IPv6, Libemu, PB级数据处理, PowerShell, RMM集成, Web报告查看器, 事件分诊, 人工智能辅助分析, 安全运维, 库, 应急响应, 应用安全, 数字取证, 自动化脚本