vicabsilv/S1-to-STIX-CTI
GitHub: vicabsilv/S1-to-STIX-CTI
将 SentinelOne 的威胁告警数据自动提取、过滤分类,并转换为标准 STIX 2.1 格式与可视化报告的网络威胁情报工具。
Stars: 0 | Forks: 0
# SentinelOne CTI Reporter
一个全面的网络威胁情报 (CTI) 报告系统,该系统从 SentinelOne 提取数据,将其转换为 STIX 格式,并使用 OASIS CTI 可视化工具生成可视化报告。
## 功能
- **数据提取**:从 SentinelOne API 获取告警和威胁
- **STIX 转换**:转换为具有适当关系的 STIX 2.1 格式
- **Hash 丰富**:使用 VirusTotal 将 SHA-1 哈希解析为 SHA-256
- **可视化**:与 cti-stix-visualization 工具集成
- **自动化报告**:支持每天 3 次自动化报告
- **多种输出**:生成 HTML 报告、STIX bundle 和原始数据
## 前置条件
### 必备软件
- Python 3.7+
- SentinelOne API 访问权限
- VirusTotal API key(可选,用于 hash 丰富)
### Python 依赖
安装所需的包:
```
pip install -r requirements.txt
```
### API 凭证
设置环境变量或使用配置文件:
```
# 环境变量
export S1_API_TOKEN="your_sentinelone_api_token"
export VT_API_KEY="your_virustotal_api_key"
# 或使用 config.json 文件
```
## 快速开始
### 项目结构
本项目包含两个版本:
- **`enhanced/`** - 增强版(⭐ **推荐** - 积极维护中)
- **根目录** - 原始版本(旧版)和共享文件
### 1. 设置配置
在根目录下编辑 `config.json`,填入您的 API 凭证:
```
{
"s1_api_token": "your_sentinelone_api_token",
"vt_api_key": "your_virustotal_api_key",
"s1_base_url": "https://usea1-300-nfr.sentinelone.net/web/api/v2.1",
"time_window_hours": 8,
"output_dir": "cti_reports"
}
```
### 2. 运行单个报告
#### 增强版(推荐)
```
cd enhanced
python s1_cti_reporter_enhanced.py --mode full --hours 24
```
#### 原始版本(旧版)
```
python s1_cti_reporter.py --mode full
```
### 3. 设置自动化报告(每天 3 次)
```
# Windows
python scheduler.py --setup --platform windows
# Linux
python scheduler.py --setup --platform linux
```
## 工作原理
增强版 SentinelOne CTI Reporter 遵循一个多阶段 pipeline,将原始威胁数据转化为可操作的 STIX 2.1 情报。以下是每个阶段的详细分解:
### 架构概述
系统由四个主要阶段组成:
1. **数据收集** - 从 SentinelOne API 获取威胁
2. **威胁过滤与分类** - 智能过滤和分类
3. **创建 STIX 对象** - 构建结构化的威胁情报对象
4. **报告生成** - 创建人类可读的报告和 STIX bundle
### 阶段 1:数据收集 (`fetch_threats()`)
**目的**:从 SentinelOne API 或现有的 CSV 文件中检索威胁数据。
**流程**:
1. **API 身份验证**:
- 从环境变量 (`S1_API_TOKEN`) 或 `config.json` 加载 API token
- 创建带有 `Authorization: ApiToken {token}` header 的已验证 HTTP 会话
- 配置 base URL(例如:`https://usea1-300-nfr.sentinelone.net/web/api/v2.1`)
2. **时间窗口计算**:
- 根据 `--hours` 参数计算开始/结束时间戳(默认:24 小时)
- 将时间戳格式化为 ISO 8601 格式以进行 API 查询
3. **API 请求**:
- 向 `/threats` endpoint 发送 GET 请求,包含以下参数:
- `limit`:1000(每次请求的最大威胁数)
- `createdAt__gte`:开始时间戳
- `createdAt__lte`:结束时间戳
4. **回退到 CSV**:
- 如果 API 调用失败或未返回数据,则自动回退到处理现有的 CSV 文件
- 在项目目录中搜索最近的 `*threats*.csv` 文件
5. **原始数据存储**:
- 将原始 API 响应保存到 `cti_reports/raw/enhanced_threats_{timestamp}.json`
- 保留原始数据结构以供审计和调试
**输出**:来自 SentinelOne API 的原始威胁字典列表
### 阶段 2:威胁过滤与分类
**目的**:过滤掉误报并对威胁进行分类,以便进行情报处理。
#### 2.1 误报检测 (`_is_false_positive()`)
**执行的检查**:
1. **分析员裁定**:
- 检查 `threatInfo.analystVerdict`(API 格式)或 `Analyst Verdict`(CSV 格式)
- 如果裁定包含 "false_positive" 或 "false positive" 则进行过滤
2. **缓解状态**:
- 检查 `threatInfo.mitigationStatus` 是否包含 "marked_as_benign" 或 "marked as benign"
- 过滤掉已被手动标记为安全的威胁
3. **模式匹配**:
- 对威胁名称/详细信息应用 regex 模式以识别已知的误报:
- `CagService.exe` (CentraStage 服务)
- `putty.exe` (合法的 SSH 客户端)
- `explorer.exe` (Windows 资源管理器)
- `RuntimeBroker.exe` (Windows 系统进程)
- `svchost.exe` (Windows 系统进程)
- `WinRAR.exe`, `7zG.exe` (合法的压缩工具)
**结果**:只有需要采取行动的威胁才会进入下一阶段
#### 2.2 威胁分类 (`_categorize_threat()`)
**分配的类别**:
- **`malware`**:分类包含 "malware"、"ransomware"、"trojan" 或 "backdoor"
- **`confirmed_threat`**:置信度为 "malicious"
- **`suspicious_activity`**:置信度为 "suspicious"
- **`unknown`**:不匹配任何类别(仍会处理,但优先级较低)
**数据源**:
- `threatInfo.classification`(API 格式)或 `Classification`(CSV 格式)
- `threatInfo.confidenceLevel`(API 格式)或 `Confidence Level`(CSV 格式)
#### 2.3 MITRE ATT&CK 映射 (`_get_mitre_technique()`)
**映射流程**:
1. **基于进程的映射**:
- 将 `threatInfo.originatorProcess` 与已知的进程模式进行比对检查:
- `cmd.exe` → `T1059.003` (Windows 命令行)
- `powershell` → `T1059.001` (PowerShell)
- `explorer.exe` → `T1055` (进程注入)
- `services.exe` → `T1543.003` (Windows 服务)
2. **Indicator 提取**:
- 从 API 响应中解析 `indicators` 数组
- 从 indicator 战术链接中提取 MITRE 技巧 ID
- 示例:`https://attack.mitre.org/techniques/T1055/012/` → `T1055.012`
3. **默认回退**:
- 如果未找到技巧,则默认为 `T1059`(命令和脚本解释器)
**输出**:经过过滤和分类的威胁,附带 MITRE ATT&CK 映射
### 阶段 3:创建 STIX 对象 (`create_enhanced_stix_objects()`)
**目的**:将过滤后的威胁转化为具有适当关系且符合 STIX 2.1 标准的对象。
#### 3.1 数据提取 (`_extract_alert_data()`)
**提取的字段**:
- **Hashes**:`threatInfo.sha1` 或 `threatInfo.sha256`(出于兼容性考虑优先使用 SHA-1)
- **IP 地址**:`agentDetectionInfo.externalIp`, `agentDetectionInfo.agentIpV4`
- **Endpoints**:`agentRealtimeInfo.agentComputerName`
- **恶意软件名称**:`threatInfo.threatName`
- **分类**:`threatInfo.classification`
- **置信度**:`threatInfo.confidenceLevel`
- **时间戳**:`threatInfo.createdAt` 或 `threatInfo.identifiedAt`
- **进程**:`threatInfo.originatorProcess`
**格式处理**:自动支持嵌套的 API 格式和平坦的 CSV 格式
#### 3.2 基于 Hash 的去重
**流程**:
1. 按 SHA-1 hash 对威胁进行分组以消除重复项
2. 限制为前 50 个唯一的 hash 以保持 bundle 易于管理
3. 对于每个 hash 组,选择最近的威胁(根据 `createdAt` 时间戳)
**结果**:每个唯一的恶意软件 hash 对应一个 STIX 对象
#### 3.3 创建 STIX 对象
**创建的对象**(按顺序):
1. **Identity 对象**:
- 代表“SentinelOne CTI Reporter”系统
- 用作所有其他对象的 `created_by_ref`
2. **File 对象**:
- 每个唯一的 hash 对应一个
- 包含 SHA-1 hash 和恶意软件名称
- 示例:带有 `hashes: {SHA-1: "5a206f176f8386203e1052ba4d53921893e231d2"}` 的 `File`
3. **IPv4Address 对象**:
- 从威胁的网络信息中提取
- 每个威胁限制为 5 个 IP 以防止 bundle 膨胀
- 示例:`IPv4Address(value: "3.22.119.20")`
4. **DomainName 对象**:
- 从与 DNS 相关的字段中提取(如果有)
- 示例:`DomainName(value: "malicious-domain.com")`
5. **Infrastructure 对象**:
- 代表受影响的 endpoint
- 类型:"endpoint"
- 示例:`Infrastructure(name: "SE-4", infrastructure_types: ["endpoint"])`
6. **Malware 对象**:
- 代表恶意软件家族
- `is_family: true` 表示它是一个家族,而不是一个特定的实例
- 示例:`Malware(name: "SentinelOne Malware: DiscordSetup.exe", malware_types: ["Malware"])`
7. **ThreatActor 对象**:
- 仅为高置信度威胁创建(`confidenceLevel: "malicious"` 或 "high")
- 类型:"crime-syndicate"
- 示例:`ThreatActor(name: "Threat Actor - DiscordSetup.exe")`
8. **AttackPattern 对象**:
- 代表 MITRE ATT&CK 技巧
- 包含指向 MITRE ATT&CK 数据库的外部参考
- 示例:`AttackPattern(name: "MITRE ATT&CK: T1055.012", external_references: [{source_name: "mitre-attack", external_id: "T1055.012"}])`
9. **Indicator 对象**:
- 每个唯一的威胁 hash 对应一个
- 包含与文件 hash 匹配的 STIX 模式
- 模式:`[file:hashes.'SHA-1' = '{hash}']`
- 标签包含分类、置信度和类别
10. **ObservedData 对象**:
- 将 File 对象链接到观察元数据
- 包含 `number_observed` 计数(该威胁被发现的次数)
- 通过 `objects` 属性链接到 File 对象
#### 3.4 关系创建
**创建的关系**(根据 STIX 2.1 规范进行验证):
1. **Indicator → File**:`indicates` 关系
2. **Indicator → Malware**:`indicates` 关系
3. **Indicator → AttackPattern**:`uses` 关系(仅限于前 3 个模式)
4. **Indicator → ThreatActor**:`attributed-to` 关系(仅限于前 2 个 actor)
5. **File → IPv4Address**:`communicates-with` 关系(仅限于前 5 个 IP)
6. **File → DomainName**:`resolves-to` 关系(仅限于前 3 个 domain)
7. **File → Infrastructure**:`targets` 关系(仅限于前 3 个 endpoint)
8. **Malware → ThreatActor**:`attributed-to` 关系
9. **Malware → AttackPattern**:`uses` 关系
**验证**:所有关系都根据 STIX 2.1 规范进行了验证,以确保:
- 源对象类型对于该关系类型有效
- 目标对象类型对于该关系类型有效
- 源对象和目标对象都存在于 bundle 中
**输出**:准备好进行打包的 STIX 2.1 对象列表
### 阶段 4:报告生成
#### 4.1 创建 STIX Bundle
**流程**:
1. 将所有 STIX 对象包装在一个 `Bundle` 容器中
2. 通过格式化美化序列化为 JSON
3. 保存到 `cti_reports/stix/enhanced_stix_bundle_{timestamp}.json`
**Bundle 结构**:
```
{
"type": "bundle",
"id": "bundle--{uuid}",
"objects": [
// All STIX objects here
]
}
```
#### 4.2 生成 HTML 报告 (`generate_enhanced_report()`)
**报告部分**:
1. **页眉**:
- 报告标题和生成时间戳
- 渐变样式以增加视觉吸引力
2. **统计仪表板**:
- 分析的威胁总数(过滤后)
- 创建的 STIX 对象计数
- 唯一恶意软件 hash 计数
- MITRE ATT&CK 映计数
3. **按类别进行威胁分析**:
- **确认的威胁**:高置信度的恶意活动
- **可疑活动**:需要调查
- **恶意软件检测**:识别出的恶意软件
- 每个类别都显示一个表格,包含:
- 威胁名称
- Hash(已截断)
- 受影响的 endpoint
- MITRE ATT&CK 技巧
- 状态
- 检测时间
4. **威胁模式**:
- 前 5 个 MITRE ATT&CK 技巧(按出现次数)
- 前 5 个最活跃的 endpoint(按威胁数量)
5. **页脚**:
- 指向 STIX bundle 文件的链接
- 指向 STIX 可视化工具的链接(如果已配置)
**样式**:现代 CSS,具有响应式设计、颜色编码的类别以及 MITRE 技巧的徽章样式
#### 4.3 威胁分析 (`_analyze_threats()`)
**计算的指标**:
- 按类别计数(已确认、可疑、恶意软件)
- 唯一 hash 计数
- MITRE 技巧频率(使用 Counter)
- Endpoint 活动频率
- 分类分布
**输出文件**:
- `cti_reports/reports/enhanced_cti_report_{timestamp}.html` - 人类可读报告
- `cti_reports/stix/enhanced_stix_bundle_{timestamp}.json` - STIX 2.1 bundle
- `cti_reports/raw/enhanced_threats_{timestamp}.json` - 原始威胁数据
### 数据流总结
```
SentinelOne API
↓
[Stage 1: Data Collection]
↓
Raw Threat Data (JSON/CSV)
↓
[Stage 2: Filtering & Categorization]
├─→ False Positive Detection
├─→ Threat Categorization
└─→ MITRE ATT&CK Mapping
↓
Filtered & Categorized Threats
↓
[Stage 3: STIX Object Creation]
├─→ Data Extraction
├─→ Hash Deduplication
├─→ STIX Object Creation
└─→ Relationship Validation
↓
STIX 2.1 Objects + Relationships
↓
[Stage 4: Report Generation]
├─→ STIX Bundle Serialization
├─→ HTML Report Generation
└─→ Threat Analysis
↓
Final Outputs:
├─→ STIX Bundle (JSON)
├─→ HTML Report
└─→ Raw Data Archive
```
### 关键设计决策
1. **双格式支持**:自动处理 API(嵌套)和 CSV(平坦)格式
2. **智能过滤**:多层误报检测以减少噪音
3. **基于 Hash 的去重**:确保每个唯一的恶意软件实例对应一个 STIX 对象
4. **关系验证**:所有关系都根据 STIX 2.1 规范进行了验证
5. **可扩展性**:应用限制(50 个 hash、5 个 IP、3 个 domain)以保持 bundle 易于管理
6. **向后兼容性**:如果 API 不可用,则回退到 CSV
7. **全面的元数据**:在创建丰富的 STIX 对象的同时保留原始数据
## 用法
### 命令行选项
#### 增强版(推荐)
```
python s1_cti_reporter_enhanced.py [OPTIONS]
Options:
--mode {full,fetch,convert} Operation mode (default: full)
--config CONFIG Configuration file path (default: config.json)
--hours HOURS Time window in hours (default: 24)
--use-existing Use existing CSV data instead of API
```
#### 原始版本
```
python s1_cti_reporter.py [OPTIONS]
Options:
--mode {fetch,convert,visualize,report,full}
Operation mode (default: full)
--config CONFIG Configuration file path
--time-window HOURS Time window in hours (default: 8)
```
### 模式(增强版)
- **`full`**:完整流程(获取 → 过滤 → 转换 → 报告)
- **`fetch`**:仅从 SentinelOne API 获取数据
- **`convert`**:将现有数据转换为 STIX(需要现有的威胁数据)
### 模式(原始版本)
- **`fetch`**:仅从 SentinelOne 获取数据
- **`convert`**:将现有数据转换为 STIX
- **`visualize`**:打开 STIX 可视化工具
- **`report`**:从现有的 STIX bundle 生成 HTML 报告
- **`full`**:完整流程(获取 → 转换 → 报告 → 可视化)
### 示例
#### 增强版
```
# 运行完整 pipeline(推荐)
python s1_cti_reporter_enhanced.py --mode full --hours 24
# 获取过去 48 小时的数据
python s1_cti_reporter_enhanced.py --mode full --hours 48
# 使用现有 CSV 数据代替 API
python s1_cti_reporter_enhanced.py --mode full --use-existing
# 仅获取数据而不进行处理
python s1_cti_reporter_enhanced.py --mode fetch --hours 24
# 使用自定义 config 文件
python s1_cti_reporter_enhanced.py --config my_config.json --mode full
```
#### 原始版本
```
# 运行完整 pipeline
python s1_cti_reporter.py --mode full
# 获取过去 24 小时的数据
python s1_cti_reporter.py --mode full --time-window 24
# 使用自定义 config 文件
python s1_cti_reporter.py --config my_config.json
# 仅获取数据
python s1_cti_reporter.py --mode fetch
```
## 输出结构
### 增强版输出
```
cti_reports/
├── raw/
│ └── enhanced_threats_YYYYMMDD_HHMMSS.json # Raw threat data from API
├── stix/
│ └── enhanced_stix_bundle_YYYYMMDD_HHMMSS.json # STIX 2.1 bundle
└── reports/
└── enhanced_cti_report_YYYYMMDD_HHMMSS.html # HTML report
```
### 原始版本输出
```
cti_reports/
├── raw/
│ ├── alerts_YYYYMMDD_HHMMSS.json
│ └── threats_YYYYMMDD_HHMMSS.csv
├── stix/
│ └── stix_bundle_YYYYMMDD_HHMMSS.json
└── reports/
└── cti_report_YYYYMMDD_HHMMSS.html
```
**注意**:所有时间戳均采用 UTC 格式 (YYYYMMDD_HHMMSS)
## 配置
### 环境变量
- `S1_API_TOKEN`:SentinelOne API token
- `VT_API_KEY`:VirusTotal API key
### 配置文件选项
- `s1_api_token`:SentinelOne API token
- `vt_api_key`:VirusTotal API key
- `s1_base_url`:SentinelOne API base URL
- `time_window_hours`:数据收集时间窗口
- `vt_daily_limit`:VirusTotal 每日查询限制
- `vt_minute_limit`:VirusTotal 每分钟查询限制
- `output_dir`:输出目录路径
- `visualization_dir`:cti-stix-visualization 工具的路径
## 自动化调度
### Windows 任务计划程序
```
python scheduler.py --setup --platform windows
```
创建 3 个每日任务:
- 上午 8:00 - 晨报
- 下午 2:00 - 下午报告
- 晚上 8:00 - 晚报
### Linux Cron
```
python scheduler.py --setup --platform linux
```
为相同的计划添加 cron 条目。
## STIX 可视化
系统与 [OASIS CTI STIX 可视化](https://github.com/oasis-open/cti-stix-visualization)工具集成:
1. **自动**:脚本自动打开可视化工具
2. **手动**:在浏览器中打开 `../cti-stix-visualization/index.html`
3. **上传**:上传生成的 STIX bundle 文件
### 可视化功能
- 交互式图形可视化
- 对象关系映射
- 详细的对象检查
- 自定义图标支持
- 导出功能
## 报告类型
### HTML 报告
- 汇总统计数据
- 时间窗口信息
- 指向可视化的直接链接
- 嵌入的 STIX 数据
### STIX Bundle
- 符合 STIX 2.1 标准
- Indicator、File、Process、Relationship
- 使用 VirusTotal 数据进行丰富
- 正确的对象关系
### 原始数据
- 原始的 SentinelOne API 响应
- CSV 威胁导出
- 保留以供分析
## 故障排除
### 常见问题
**API Token 问题**
```
Error: S1_API_TOKEN environment variable or config required
```
解决方案:设置环境变量或更新 config.json
**VirusTotal 速率限制**
```
🚫 VirusTotal daily limit reached
```
解决方案:在配置中增加每日限制或等待重置
**未找到可视化工具**
```
Visualization tool not found at: ../cti-stix-visualization
```
解决方案:克隆可视化工具或更新配置中的路径
### 日志
- 检查 `cti_report.log` 以获取计划任务日志
- 查看控制台输出以获取详细的错误消息
- 检查生成的文件以进行数据验证
## 安全注意事项
- API token 存储在环境变量或配置文件中
- 不会将数据传输到外部服务器(API 调用除外)
- STIX 可视化在浏览器中本地运行
- 原始数据存储在本地
## 性能
- **数据获取**:8 小时窗口约需 30-60 秒
- **Hash 解析**:每个 hash 约 2-5 秒(有速率限制)
- **STIX 转换**:约 10-30 秒
- **报告生成**:约 5-10 秒
## 贡献
1. Fork 该仓库
2. 创建一个功能分支
3. 进行更改
4. 彻底测试
5. 提交 pull request
## 许可证
该项目基于 MIT 许可证授权 - 有关详细信息,请参阅 LICENSE 文件。
## 🙏 鸣谢
- [OASIS CTI TC](https://www.oasis-open.org/committees/cti/) 提供 STIX 标准
- [cti-stix-visualization](https://github.com/oasis-open/cti-stix-visualization) 提供可视化工具
- SentinelOne 提供 API 访问权限
- VirusTotal 提供 hash 丰富功能
标签:API集成, Python, STIX, 可观测性, 威胁情报, 开发者工具, 无后门, 逆向工具