David-duque03/TTPs_Extraction_Pipeline
GitHub: David-duque03/TTPs_Extraction_Pipeline
一个从 CTI PDF 报告中自动化提取 MITRE ATT&CK TTP 和 IoC 的端到端流水线工具。
Stars: 0 | Forks: 0
# pipeline_ttp_extraction
一个 end-to-end 的 pipeline,利用 [TTPXHunter](https://github.com/dessertlab/TTPXHunter) 进行 TTP 分类,并使用基于 regex 的方法提取 IoC,从 Cyber Threat Intelligence (CTI) PDF 报告中提取 MITRE ATT&CK Tactics, Techniques and Procedures (TTPs) 和 Indicators of Compromise (IoCs)。该 pipeline 分为六个阶段,其中四个阶段在本仓库中以独立脚本的形式实现(阶段 2 到 6,阶段 4-5-6 共享同一个 module);阶段 1 是手动/外部数据收集步骤。
## Pipeline 概述
```
Phase 1: PDF collection (manual, external)
-> raw CTI PDF reports, placed into Conversion_TXT/ReportsX/
|
v
Phase 2: Conversion_TXT/ (PDF -> TXT, incl. image OCR via Qwen2-VL/LM Studio)
|
v
Phase 3: Clean_duplicated/ (deduplication by content hash + English-only filter)
|
v
Phase 4 + 5 + 6: extracts_ttps/ (TTP extraction via TTPXHunter, IoC extraction via
regex, merge into dataset_completo.json + cleanup)
|
v
Statistical analysis: dataset_analysis/ (plots and summaries from the final dataset)
```
每个阶段都独立包含在其各自的文件夹中,并使用运行时从 `Path(__file__).resolve().parent` 计算得出的路径,直接从上一阶段的输出文件夹中读取其输入。这意味着,只要保留下文所述的文件夹结构,整个项目就可以被复制到任何计算机/驱动器上,而无需编辑任何硬编码路径。
## 文件夹结构
```
pipeline_ttp_extraction/
├── Conversion_TXT/ # Phase 2 - PDF -> TXT conversion (+ image OCR)
│ ├── ReportsA/ ReportsB/ ReportsC/ ReportsCTI_HAL/ # Input PDFs (Phase 1 output)
│ ├── pdf_processed/ # Phase 2 raw output
│ ├── txt_out_A/ txt_out_B/ txt_out_C/ txt_out_CTI_HAL/ # Phase 2 final TXT output
│ ├── utils/
│ ├── main.py
│ ├── conversion_txt.yml
│ └── README.md
├── Clean_duplicated/ # Phase 3 - deduplication + English-language filter
│ ├── PDF_dedup/ TXT_dedup/ # Output (created at runtime)
│ ├── audit_files.py
│ ├── environment.yml
│ └── README.md
├── extracts_ttps/ # Phases 4+5+6 - TTP + IoC extraction, dataset build
│ ├── label_dict.pkl # TTPXHunter label map (place manually, see README)
│ ├── ttp_id_name.pkl # TTPXHunter technique-id map (place manually, see README)
│ ├── dataset_completo.json # Phase 4+5+6 output
│ ├── dataset_completo_limpio.json # Cleaned dataset
│ ├── process_files.py
│ ├── clean_dataset.py
│ ├── environment.yml
│ └── README.md
├── dataset_analysis/ # Statistical analysis (plots, summaries)
│ ├── output_dataset_limpio_v2.csv # Input CSV (generate manually, see README)
│ ├── plots_iocs/ # Output (created at runtime)
│ ├── plots_new_iocs_filtered/ # Output (created at runtime)
│ ├── analisis_ttp_dataset.py
│ ├── clean_dataset.py # Convenience copy of extracts_ttps/clean_dataset.py
│ ├── environment.yml
│ └── README.md
└── README.md # This file
```
## 各阶段详情
### 阶段 1 — PDF 收集(手动,外部)
在本仓库中未实现为脚本。公开的 CTI 报告(来自供应商博客、威胁情报源等)被手动收集并以 PDF 文件的形式放入 `Conversion_TXT/ReportsA/`、`ReportsB/`、`ReportsC/` 和 `ReportsCTI_HAL/`(每批一个子文件夹)。
### 阶段 2 — PDF 转 TXT(`Conversion_TXT/`)
使用 PyMuPDF 从每个 PDF 页面中提取文本,提取嵌入的图像/屏幕截图,并使用通过 LM Studio 在本地提供的 `Qwen2-VL-7B-Instruct` vision-language model 对这些图像进行转录,将转录内容重新插入到文本中每张图像出现的位置。在 `txt_out_/` 中为每个 PDF 生成一个最终的 `.txt` 文件。
有关设置和使用详情,请参阅 [`Conversion_TXT/README.md`](Conversion_TXT/README.md)。
### 阶段 3 — 去重和语言过滤(`Clean_duplicated/`)
读取阶段 2 的输出(将 `Conversion_TXT/pdf_processed/` 作为已转换报告的参考列表,与 `ReportsX/` 和 `txt_out_X/` 文件夹进行交叉引用),按内容 hash 对报告进行分组以检测重复项,仅保留每个唯一报告的一份副本,并使用 `langdetect` 过滤掉非英文报告。在 `PDF_dedup/` 和 `TXT_dedup/` 中生成去重后的、仅包含英文的 PDF/TXT 配对。
有关设置和使用详情,请参阅 [`Clean_duplicated/README.md`](Clean_duplicated/README.md)。
### 阶段 4、5 和 6 — TTP 提取、IoC 提取、数据集构建(`extracts_ttps/`)
读取 `Clean_duplicated/TXT_dedup/` 中的每个 `.txt` 文件,并且对于每份报告:
- **阶段 4:** 在每个句子上运行 TTPXHunter 模型以检测 MITRE ATT&CK 技术,仅保留置信度阈值在 0.9 以上的预测结果。
- **阶段 5:** 使用正则表达式扫描相同的文本以提取 IoC(IPv4/IPv6 地址、MD5/SHA1/SHA256 哈希、URL)。
- **阶段 6:** 将阶段 4 和阶段 5 的结果合并为每个报告一个结构化的 JSON 记录,保存到 `dataset_completo.json`。一个可选的清理步骤(`clean_dataset.py`)会移除那些上下文是失败/空的图像 OCR 转录而不是真实报告文本的 TTP 条目,从而生成 `dataset_completo_limpio.json`。
此阶段需要来自 TTPXHunter 项目的 `label_dict.pkl` 和 `ttp_id_name.pkl`,并手动将它们复制到 `extracts_ttps/` 中 — 有关详细信息,请参阅 [`extracts_ttps/README.md`](extracts_ttps/README.md)。
### 统计分析(`dataset_analysis/`)
读取由 `extracts_ttps/dataset_completo_limpio.json` 构建的 CSV 文件,并生成描述性图表和摘要:TTP 频率、每个文档的 TTP 数量、IoC 频率和类型、IoC/TTP 共现情况等。
**注意:** 本仓库目前不包含将 `dataset_completo_limpio.json` 转换为此阶段所使用的 CSV 文件(`output_dataset_limpio_v2.csv`)的脚本。在运行此阶段之前,必须手动生成它(例如使用 `pandas.json_normalize`) — 有关基础示例,请参阅 [`dataset_analysis/README.md`](dataset_analysis/README.md)。
## 前置条件摘要
- Conda 或 Miniconda,Python 3.10+
- [LM Studio](https://lmstudio.ai/) 在本地运行,加载了 `lmstudio-community/Qwen2-VL-7B-Instruct-GGUF` 模型,并在 `http://localhost:1234/v1` 上提供兼容 OpenAI 的 API(阶段 2 必需)
- 来自 [TTPXHunter](https://github.com/dessertlab/TTPXHunter) 项目的 `label_dict.pkl` 和 `ttp_id_name.pkl`,手动放置到 `extracts_ttps/` 中(阶段 4 必需)
- 建议为阶段 4 配备支持 CUDA 的 GPU(但非必须)— 它会自动回退到 CPU
- 每个阶段文件夹都有其自己的 conda `environment.yml`(或者对于 `Conversion_TXT/`,是 `conversion_txt.yml`),其中包含该阶段的确切依赖项;请参阅每个文件夹的 `README.md`
## 运行完整 pipeline
1. 将 PDF 报告收集到 `Conversion_TXT/ReportsA|B|C|CTI_HAL/` 中(阶段 1)。
2. 在 LM Studio 运行的情况下,每批运行一次 `Conversion_TXT/main.py`(阶段 2)。
3. 运行 `Clean_duplicated/audit_files.py`(阶段 3)。
4. 将 `label_dict.pkl`/`ttp_id_name.pkl` 放入 `extracts_ttps/`,然后运行 `extracts_ttps/process_files.py`,接着运行 `extracts_ttps/clean_dataset.py`(阶段 4、5、6)。
5. 从 `extracts_ttps/dataset_completo_limpio.json` 生成 `output_dataset_limpio_v2.csv` 并将其放入 `extracts_ttps/`,然后运行 `dataset_analysis/analisis_ttp_dataset.py`(统计分析)。
每个步骤的详细说明、输入和输出都记录在该文件夹自己的 `README.md` 中。
标签:OCR, Vectored Exception Handling, 威胁情报, 开发者工具, 文本提取, 自动化流水线, 逆向工具