marez8505/ThreatIntel

GitHub: marez8505/ThreatIntel

生产级威胁情报聚合与IOC丰富化平台,支持STIX 2.1标准化、多源关联分析与自动化信誉评分。

Stars: 0 | Forks: 0

# ThreatIntel **威胁情报聚合与 IOC 丰富化平台** ThreatIntel 是一个生产级的 Python 平台,展示了 **Tier 2–3 SOC 和网络威胁情报 (CTI) 分析师的能力**。它从多个威胁情报源摄取、丰富、关联并导出失陷指标,将发现结果映射到 MITRE ATT&CK 框架并生成可供分析师使用的报告。 ## 目录 - [什么是威胁情报?](#what-is-threat-intelligence) - [关键 CTI 概念](#key-cti-concepts) - [功能特性](#features) - [快速开始](#quick-start) - [CLI 参考](#cli-reference) - [项目结构](#project-structure) - [模块概述](#module-overview) - [IOC 类型与验证](#ioc-types-and-validation) - [STIX 2.1 处理](#stix-21-processing) - [信誉评分模型](#reputation-scoring-model) - [MITRE ATT&CK 映射](#mitre-attck-mapping) - [示例 Feed](#sample-feeds) - [运行测试](#running-tests) - [开发](#development) ## 什么是威胁情报? **网络威胁情报 (CTI)** 是关于组织当前和潜在威胁的结构化、经过分析的信息。它回答了这个问题:*对手正在做什么,他们是如何做的,以及他们留下了什么痕迹?* ### 情报生命周期 ``` Planning → Collection → Processing → Analysis → Dissemination → Feedback ``` 1. **规划**:定义情报需求(哪些威胁对我们重要?) 2. **收集**:从 Feed、OSINT、暗网监控、内部遥测数据收集原始数据 3. **处理**:解析、规范化、去重 IOC 数据 4. **分析**:丰富 IOC、聚类攻击活动、映射到 ATT&CK 5. **分发**:生成报告、推送到 SIEM/SOAR、导出 STIX bundle 6. **反馈**:验证情报质量、优化收集策略 ### IOC 生命周期 **失陷指标 (IOC)** 是识别恶意活动的取证痕迹: ``` Ingestion → Validation → Enrichment → Scoring → Correlation → Reporting → Expiry ``` IOC 具有**生存时间 (TTL)**:IP 会轮换,域名会被查封,哈希会过期。ThreatIntel 跟踪 `first_seen`、`last_seen`,并应用指数衰减评分来计算基于时效性的相关性。 ## 关键 CTI 概念 ### STIX 2.1 (Structured Threat Information eXpression) [STIX 2.1](https://docs.oasis-open.org/cti/stix/v2.1/) 是基于 JSON 的行业标准语言,用于表示威胁情报。ThreatIntel 生成并解析有效的 STIX 2.1 bundle,其中包含: | STIX Object | 用途 | |---|---| | `indicator` | 表示带有检测模式的 IOC | | `malware` | 描述恶意软件家族或实例 | | `attack-pattern` | 引用 MITRE ATT&CK 技术 | | `relationship` | 链接对象(indicator → indicates → malware) | | `campaign` | 按威胁行为者活动对指标进行分组 | | `identity` | 工具来源和组织背景 | | `observed-data` | 原始网络可观测 sightings | STIX 模式描述了要检测的内容: ``` [ipv4-addr:value = '185.220.101.47'] [domain-name:value = 'darkvipr-update1.xyz'] [file:hashes.'SHA-256' = 'b94f6f...'] ``` ### TAXII (Trusted Automated eXchange of Intelligence Information) TAXII 是用于共享 STIX 数据的传输协议。虽然 ThreatIntel 专注于本地 STIX bundle 处理(而非实时 TAXII 客户端),但生成的 bundle 完全兼容 TAXII 2.1 集合。 ### 入侵分析钻石模型 [钻石模型](https://www.activeresponse.org/wp-content/uploads/2013/07/diamond.pdf) 沿四个轴描述入侵: ``` Adversary / \ Capability Infrastructure \ / Victim ``` ThreatIntel 跟踪所有四个轴: - **对手**:攻击活动名称、威胁行为者归属 - **能力**:文件哈希、TTP(MITRE 技术) - **基础设施**:IP 地址、域名、C2 URL - **受害者**:不直接跟踪,但威胁类别暗示了攻击目标 ### ATT&CK 框架 [MITRE ATT&CK Enterprise Matrix](https://attack.mitre.org/matrices/enterprise/) 编目了 14 个战术类别和在真实入侵中观察到的数百种技术。ThreatIntel 将 IOC 特征映射到相关技术: | IOC 类型 | 常见技术 | |---|---| | IP 地址 (C2) | T1071.001 (Web Protocols), T1090.003 (Multi-hop Proxy) | | 域名 (DGA) | T1071.004 (DNS), T1583.001 (Acquire Domains) | | 钓鱼 URL | T1566.002 (Spearphishing Link), T1204 (User Execution) | | 文件哈希 | T1059 (Scripting), T1027 (Obfuscated Files) | | 电子邮件 | T1566.001 (Spearphishing Attachment) | ### IOC Feed 与置信度 威胁情报 Feed 的质量差异巨大。ThreatIntel 为每个 Feed 分配 **1–5 的置信度评级**: | 评级 | 含义 | |---|---| | 5/5 | 内部 IR 团队、经过审查的 ISAC Feed | | 4/5 | 商业威胁情报提供商 | | 3/5 | 开源/社区 Feed (OSINT) | | 2/5 | 低置信度自动 Feed | | 1/5 | 未经验证的众包数据 | ## 功能特性 - **多格式摄取**:CSV, JSON, STIX 2.1, OpenIOC XML, 纯文本 - **IOC 验证**:IPv4/IPv6(RFC、私有/保留地址)、域名(TLD + DGA 熵)、哈希(MD5/SHA-1/SHA-256)、URL(协议 + 可疑路径)、电子邮件 - **离线丰富化**:地理位置启发式、WHOIS 风格上下文、DGA 评分、Tor 出口节点检测、CDN 识别 —— 无需外部 API 调用 - **信誉评分 (0–100)**:多信号评分,结合 Feed 存在性、置信度、时效衰减、上下文信号、攻击活动关联和 MITRE 覆盖广度 - **MITRE ATT&CK 映射**:根据 IOC 类型和威胁类别自动建议技术 - **跨 Feed 关联**:6 种关联方法(精确重叠、攻击活动聚类、/24 子网邻近度、域名模式、时间共现、MITRE 技术重叠) - **STIX 2.1 导出**:生成包含 indicator、malware、attack-pattern 和 relationship 的有效 bundle - **HTML + JSON 报告**:包含 KPI、关联表和 ATT&CK 覆盖率的自包含深色主题 HTML 报告 - **Feed 生命周期**:基于 TTL 的过期、首次/末次发现跟踪、跨 Feed 去重 - **完整 CLI**:`ingest`、`enrich`、`correlate`、`report`、`export`、`demo` 命令 ## 快速开始 ### 前置条件 需要 Python 3.8+。 ``` # 克隆 / 导航到项目 cd ThreatIntel/ # 安装依赖 pip install -r requirements.txt # 安装为包(可选) pip install -e . ``` ### 运行演示 ``` python -m threatintel demo ``` 这将在包含的示例 Feed 上运行完整流水线,并在 `demo_output/` 中生成报告: ``` demo_output/ ├── threat_report.html ← Open in browser ├── threat_report.json ← Machine-readable report ├── correlations.json ← Correlation clusters └── export_stix.json ← STIX 2.1 bundle ``` ## CLI 参考 ### `ingest` — 解析并显示 Feed ``` python -m threatintel ingest --feed feeds/sample_feed_1.csv --type csv --confidence 4 python -m threatintel ingest --feed feeds/sample_feed_2.json --enrich python -m threatintel ingest --feed feeds/sample_stix_bundle.json --type stix --limit 30 ``` | 标志 | 描述 | |---|---| | `--feed FILE` | Feed 文件路径(必需) | | `--type FORMAT` | 强制指定格式:`csv`、`json`、`stix`、`text`、`openioc` | | `--confidence N` | Feed 置信度 1–5(默认值:3) | | `--campaign NAME` | 为没有活动名称的 IOC 指定活动名称 | | `--limit N` | 最多显示的 IOC 数量(默认值:20) | | `--enrich` | 显示前进行丰富化和评分 | ### `enrich` — 丰富化单个 IOC ``` python -m threatintel enrich --ioc 185.220.101.47 --type ip python -m threatintel enrich --ioc darkvipr-update1.xyz --type domain python -m threatintel enrich --ioc "http://evil.com/gate.php" --type url python -m threatintel enrich --ioc b94f6f125c79e3a5ffaa826f584c10d52ada669e6762ea2a6b684f8f39a73e88 --json ``` | 标志 | 描述 | |---|---| | `--ioc VALUE` | 要丰富化的 IOC 值(必需) | | `--type TYPE` | 覆盖类型:`ip`、`domain`、`url`、`md5`、`sha256`、`email` | | `--campaign NAME` | 攻击活动上下文 | | `--feed FEED_ID` | Feed 来源标签(默认值:`cli`) | | `--json` | 输出为 JSON 而非格式化文本 | ### `correlate` — 跨 Feed 关联分析 ``` python -m threatintel correlate --feeds-dir feeds/ --output correlations.json python -m threatintel correlate --feeds-dir feeds/ --min-cluster-size 3 ``` | 标志 | 描述 | |---|---| | `--feeds-dir DIR` | Feed 文件目录(必需) | | `--output FILE` | 输出 JSON 文件(默认值:`correlations.json`) | | `--confidence N` | 默认 Feed 置信度 | | `--min-cluster-size N` | 每个集群的最小 IOC 数(默认值:2) | ### `report` — 生成威胁报告 ``` python -m threatintel report --feeds-dir feeds/ --format html --output ./report/ python -m threatintel report --feeds-dir feeds/ --format json --output report.json python -m threatintel report --feeds-dir feeds/ --format both --output ./report/ ``` | 标志 | 描述 | |---|---| | `--feeds-dir DIR` | Feed 文件目录(必需) | | `--format FORMAT` | `html`、`json` 或 `both`(默认值:`html`) | | `--output PATH` | 输出目录(HTML)或文件(JSON) | | `--title TEXT` | 报告标题 | ### `export` — 导出丰富化后的 IOC ``` python -m threatintel export --feeds-dir feeds/ --format stix --output export.json python -m threatintel export --feeds-dir feeds/ --format csv --output iocs.csv python -m threatintel export --feeds-dir feeds/ --format json --output iocs.json --active-only ``` | 标志 | 描述 | |---|---| | `--feeds-dir DIR` | Feed 文件目录(必需) | | `--format FORMAT` | `stix`、`csv` 或 `json`(默认值:`stix`) | | `--output FILE` | 输出文件路径 | | `--active-only` | 仅导出未过期的 IOC | ### `demo` — 完整端到端演示 ``` python -m threatintel demo python -m threatintel demo --feeds-dir feeds/ --output-dir demo_output/ ``` ## 项目结构 ``` ThreatIntel/ ├── threatintel/ │ ├── __init__.py # Package exports, version │ ├── __main__.py # python -m threatintel entry point │ ├── main.py # CLI: argparse dispatch for all commands │ ├── ioc_types.py # IOC dataclass + type validation functions │ ├── ioc_parser.py # Multi-format feed parser │ ├── stix_processor.py # STIX 2.1 bundle generation and parsing │ ├── enrichment_engine.py # Offline IOC context enrichment │ ├── reputation_scorer.py # Multi-signal 0-100 reputation scoring │ ├── correlator.py # Cross-feed IOC correlation (6 methods) │ ├── mitre_mapper.py # MITRE ATT&CK technique catalog + mapping │ ├── feed_manager.py # Feed ingestion, deduplication, TTL lifecycle │ ├── report_generator.py # HTML + JSON report generation (Jinja2) │ └── utils.py # Terminal output, JSON serialization, pipeline helper ├── feeds/ │ ├── sample_feed_1.csv # DarkViper APT campaign (50 IOCs) │ ├── sample_feed_2.json # CredStorm phishing campaign (30 IOCs) │ ├── sample_stix_bundle.json # STIX 2.1 bundle (20 indicators, 3 malware objects) │ └── README.md ├── tests/ │ ├── __init__.py │ ├── test_ioc_parser.py # Parser + type validation tests │ ├── test_stix_processor.py # STIX generation + parsing tests │ ├── test_reputation_scorer.py # Scoring signal tests │ └── test_correlator.py # Correlation method tests ├── requirements.txt ├── setup.py ├── LICENSE └── README.md ``` ## 模块概述 ### `ioc_types.py` 平台的核心类型系统。 - `IOCType` 枚举:`IPV4`、`IPV6`、`DOMAIN`、`URL`、`MD5`、`SHA1`、`SHA256`、`EMAIL`、`UNKNOWN` - `IOCStatus` 枚举:`ACTIVE`、`EXPIRED`、`WHITELISTED`、`REVOKED` - `ThreatCategory` 枚举:`MALWARE_C2`、`PHISHING`、`RANSOMWARE`、`APT`、`BOTNET` 等 - `IOC` 数据类:规范的 IOC 记录,带有 `to_dict()` / `from_dict()` 序列化 - 验证函数:`validate_ipv4()`、`validate_domain()`、`validate_hash()` 等 - `detect_ioc_type(value)`:自动将任何字符串分类为其 IOC 类型 **DGA 检测**:域名生成算法 (DGA) 评分使用香农熵和辅音-元音比率来识别算法生成的域名。 ### `ioc_parser.py` 具有自动格式检测的多格式 Feed 解析器。 | 格式 | 检测方式 | 备注 | |---|---|---| | 纯文本 | `.txt`, `.lst` | 每行一个 IOC,支持 `#` 注释 | | CSV | `.csv` | 根据表头优先级自动检测 IOC 列 | | JSON | `.json` | 处理扁平列表、对象列表、包装对象 | | STIX 2.1 | 带有 `"type":"bundle"` 的 `.json` | 完整的 STIX 模式提取 | | OpenIOC | `.ioc`, `.xml` | 解析 `IndicatorItem` 元素 | ### `stix_processor.py` 生成并验证符合 [OASIS STIX 2.1 规范](https://docs.oasis-open.org/cti/stix/v2.1/) 的 STIX 2.1 bundle。 ``` processor = STIXProcessor() bundle = processor.generate_bundle(ioc_list, include_malware=True, include_attack_patterns=True) is_valid, errors = processor.validate_bundle(bundle) processor.save_bundle(bundle, "export.json") ``` ### `enrichment_engine.py` 完全离线丰富化 —— 无需外部 API 调用。 | IOC 类型 | 丰富化数据 | |---|---| | IPv4 | RFC 验证、私有/保留/Tor、地理位置启发式、WHOIS 提示 | | 域名 | TLD 信誉、DGA 评分(熵 + 辅音比率)、CDN 检测、punycode | | URL | 协议、主机分析、可疑路径关键词、恶意软件文件扩展名 | | 哈希 | 空哈希检测(空文件 MD5/SHA)、哈希类型分类 | | 电子邮件 | 域名分析、一次性提供商检测 | ### `reputation_scorer.py` 从 7 个加权信号计算 **0–100 风险评分**: | 信号 | 权重 | 描述 | |---|---|---| | 基础类型 | ~10 | IOC 类型的固有风险(hash > URL > IP > email) | | Feed 存在性 | 25 | 每个 Feed 的收益递减(7→5→→3→2 分) | | Feed 置信度 | 20 | 按 Feed 可靠性加权的平均置信度 | | 时效性 | 15 | 30 天半衰期的指数衰减 | | 上下文 | 20 | 丰富化信号:Tor、DGA、CDN、高风险国家 | | 攻击活动 | 10 | 已知攻击活动关联 + 严重性加成 | | MITRE 覆盖广度 | 10 | 映射的技术越多 = 操作复杂性越高 | 评分区间:`BENIGN (<20)` | `LOW (20-39)` | `MEDIUM (40-59)` | `HIGH (60-79)` | `CRITICAL (≥80)` ### `correlator.py` 六种关联方法用于识别相关的 IOC: 1. **跨 Feed 精确匹配** — 相同的 IOC 值出现在 2 个或更多 Feed 中(最高置信度) 2. **攻击活动归属** — 共享相同威胁行为者标签的 IOC 3. **子网邻近度** — 共享 /24 子网的 IP(共享托管基础设施) 4. **域名模式** — 共享相同注册域名的子域名 5. **时间共现** — 在相同时间窗口内观察到且具有重叠威胁类别的 IOC 6. **MITRE 技术重叠** — 共享 2 个或更多 ATT&CK 技术 ID 的 IOC(相同的 TTP 配置文件) ### `mitre_mapper.py` 使用包含 14 个战术下 35 多种技术的精选目录,将 IOC 特征映射到 MITRE ATT&CK Enterprise 技术。映射考虑: - IOC 类型(哪些技术类型通常产生此痕迹) - 威胁类别 - 丰富化上下文(Tor → T1090.003, DGA → T1071.004, 可疑 URL → T1105) ### `feed_manager.py` 具有生命周期管理的中央 IOC 存储: ``` mgr = FeedManager(default_ttl_days=90) mgr.ingest("feeds/sample_feed_1.csv", confidence=4) mgr.ingest("feeds/sample_feed_2.json", confidence=4) mgr.expire_stale() # Mark old IOCs expired iocs = mgr.get_active_iocs() # Active only iocs = mgr.get_high_risk_iocs(min_score=60) mgr.export_csv("export.csv") mgr.export_json("export.json") ``` 去重键:`(ioc_type, normalized_value)` —— 出现在 3 个 Feed 中的相同 IP 会变成一个 IOC,其 `feed_sources` 中包含所有 3 个 Feed ID。 ## IOC 类型与验证 ### IPv4/IPv6 验证 ``` from threatintel.ioc_types import validate_ipv4 result = validate_ipv4("185.220.101.47") # { # "valid": True, # "is_private": False, # "is_bogon": False, # "is_loopback": False, # "network_class": "B", # "possible_tor_exit": True ← heuristic from prefix tables # } ``` RFC 1918 私有地址范围(10.x、172.16-31.x、192.168.x)、链路本地(169.254.x)、环回(127.x)和 IANA 保留范围都会被标记。私有 IP 会自动接受较大的负分调整。 ### 域名 DGA 评分 ``` from threatintel.ioc_types import validate_domain validate_domain("xvnqpkrtdmb.top") # {"dga_score": 0.72, "entropy": 3.81, "consonant_ratio": 4.5, "tld_suspicious": True} validate_domain("google.com") # {"dga_score": 0.04, "entropy": 2.25, "consonant_ratio": 1.5, "tld_suspicious": False} ``` DGA 评分 = `entropy_weight(0.45) + consonant_ratio_weight(0.35) + length_weight(0.20)` ### 文件哈希验证 MD5(32 位十六进制)→ SHA-1(40 位十六进制)→ SHA-256(64 位十六进制)通过长度检测。已知空哈希(空文件)会被标记并给予极低的评分。 ## STIX 2.1 处理 ### 生成 Bundle ``` from threatintel import STIXProcessor, FeedManager, EnrichmentEngine, ReputationScorer mgr = FeedManager() mgr.ingest("feeds/sample_feed_1.csv", confidence=4) iocs = mgr.get_active_iocs() # 丰富信息与评分 engine = EnrichmentEngine() engine.enrich_batch(iocs) scorer = ReputationScorer() scorer.score_batch(iocs) # 生成 STIX bundle processor = STIXProcessor() bundle = processor.generate_bundle(iocs, include_malware=True, include_attack_patterns=True) is_valid, errors = processor.validate_bundle(bundle) processor.save_bundle(bundle, "export.json") ``` ### Bundle 内容 ``` { "type": "bundle", "spec_version": "2.1", "id": "bundle--", "objects": [ {"type": "identity", ...}, {"type": "indicator", "pattern": "[ipv4-addr:value = '185.220.101.47']", ...}, {"type": "malware", "name": "DarkViper RAT", ...}, {"type": "attack-pattern", "external_references": [{"external_id": "T1071.001"}], ...}, {"type": "relationship", "relationship_type": "indicates", ...}, ... ] } ``` ## 信誉评分模型 ``` Score = base_type + feed_presence + feed_confidence + recency + context + campaign + mitre (0-10) (0-25) (0-20) (0-15) (-15 to +20) (0-10) (0-10) ``` 限制在 [0, 100] 范围内。 **负向调整**(上下文信号): - 私有 IP:−15 - CDN/已知良性域名:−10 - 空哈希:−10 **正向提升**(上下文信号): - Tor 出口节点:+10 - DGA 候选:+8 - 高风险国家(RU/CN/KP/IR):+7 - 可疑 TLD:+5 - URL 中的恶意软件文件扩展名:+6 - 可疑 URL 路径:+5 ## MITRE ATT&CK 映射 ``` from threatintel import MitreMapper, IOC, IOCType, ThreatCategory from datetime import datetime, timezone ioc = IOC("185.220.101.47", IOCType.IPV4, threat_categories=[ThreatCategory.MALWARE_C2], feed_sources=["f1"]) mapper = MitreMapper() techniques = mapper.map_ioc(ioc) # [ # {"id": "T1090.003", "name": "Proxy: Multi-hop Proxy", "tactic": "Command and Control", ...}, # {"id": "T1071.001", "name": "Application Layer Protocol: Web Protocols", ...}, # ... # ] ``` ## 示例 Feed `feeds/` 中包含三个真实的示例 Feed: | Feed | 格式 | IOC 数量 | 攻击活动 | 备注 | |---|---|---|---|---| | `sample_feed_1.csv` | CSV | 50 | DarkViper APT | C2 IP、DGA 域名、哈希、URL | | `sample_feed_2.json` | JSON | 30 | CredStorm | 钓鱼域名、URL、电子邮件 | | `sample_stix_bundle.json` | STIX 2.1 | 20 个 indicator + 总共 82 个对象 | 两者 | 带有关系的完整 STIX bundle | **10–12 个 IOC 在 Feed 之间重叠**,用于演示关联检测。 ## 运行测试 ``` # 从 ThreatIntel/ 目录 python -m pytest tests/ -v # 或者使用 unittest python -m unittest discover tests/ -v # 单独的测试文件 python -m pytest tests/test_ioc_parser.py -v python -m pytest tests/test_stix_processor.py -v python -m pytest tests/test_reputation_scorer.py -v python -m pytest tests/test_correlator.py -v ``` 测试覆盖范围包括: - 4 个测试文件中的 100 多个断言 - 所有 IOC 类型验证器 - 多格式解析器(text、CSV、JSON、STIX、OpenIOC) - STIX bundle 生成和验证 - 信誉评分信号(Feed 存在性、置信度、时效性、上下文、攻击活动、MITRE) - 所有 6 种关联方法 - Feed 重叠矩阵 ## 开发 ### 添加新的 Feed 格式 1. 在 `ioc_parser.py` 中添加解析器函数(参见 `parse_text()` 作为模板) 2. 在 `parse_feed()` 的 `dispatch` 字典中注册该格式 3. 如有需要,在 `detect_format()` 中添加检测逻辑 4. 在 `tests/test_ioc_parser.py` 中添加测试 ### 添加 MITRE 技术 编辑 `mitre_mapper.py` 中的 `MITRE_TECHNIQUE_CATALOG`: ``` "T1234.001": { "name": "My New Technique", "tactic": "Command and Control", "description": "Adversaries...", "ioc_types": [IOCType.DOMAIN, IOCType.URL], "categories": [ThreatCategory.MALWARE_C2], } ``` ### 扩展信誉评分器 调整 `reputation_scorer.py` 顶部的权重常量: ``` WEIGHT_FEED_PRESENCE = 25 WEIGHT_FEED_CONFIDENCE = 20 WEIGHT_AGE = 15 # ... ``` 通过实现 `_score_new_factor(self, ioc: IOC) -> float` 并将其添加到 `_compute_breakdown()` 中来添加新的评分因子。 ## 许可证 MIT License — Copyright (c) 2024 Edward Marez 完整文本请参阅 [LICENSE](LICENSE)。 *ThreatIntel 展示了实用的 CTI 工程技能:STIX 2.1 合规性、多 Feed 聚合、评分模型和可供分析师使用的报告 —— 这是 Tier 2–3 SOC 或 CTI 分析师角色的核心技术能力。*
标签:Cloudflare, DAST, HTTP/HTTPS抓包, IOC富化, MITRE ATT&CK, Python, STIX 2.1, STIX Parser, Threat Intelligence Platform, Tier 2 Analyst, Tier 3 Analyst, TLP, 信誉评分, 入侵指标, 关联分析, 威胁分析, 威胁情报, 安全报告, 安全运营中心, 开发者工具, 态势感知, 恶意软件分析, 情报源, 情报聚合, 文档结构分析, 无后门, 网络安全, 网络映射, 自动化侦查工具, 自动化响应, 逆向工具, 隐私保护