
Extrae Inteligencia de Amenazas Cibernéticas (CTI) estructurada de documentos PDF, DOCX y TXT mediante LLMs. Genera flujos de ataque MITRE ATT&CK, oportunidades de detección y grafos completos de relaciones entre entidades.
Una herramienta de línea de comandos potente e independiente para extraer Inteligencia de Amenazas Cibernéticas (CTI) de documentos mediante Modelos de Lenguaje de Gran Tamaño con capacidades avanzadas de salida estructurada.
# Clone or download the standalone-tdo folder
cd standalone-tdo
# Create virtual environment (recommended)
python -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
# Install dependencies
pip install -r requirements.txt
La herramienta utiliza variables de entorno cargadas desde un archivo .env para su configuración:
# Copy the example configuration
cp env.example .env
# Edit .env with your settings
# Required variables:
GEMINI_API_KEY=your-google-ai-api-key-here
GEMINI_MODEL=gemini-2.5-flash
Cómo obtener una clave de API de Gemini:
.envModelos disponibles:
gemini-2.5-flash-preview-05-20 (recomendado: rápido y rentable)gemini-2.5-pro-preview-06-05 (más potente, más lento)# Process a single file with all features
python tdo_bulk.py report.pdf --flow --opps
# Process multiple files
python tdo_bulk.py file1.pdf file2.docx file3.txt
# Process all files in a directory with parallel workers
python tdo_bulk.py reports/ -j 4
# Generate comprehensive analysis with evaluation
python tdo_bulk.py report.pdf --flow --opps --eval-opps
usage: tdo_bulk.py [options] FILE [FILE ...]
Positional Arguments:
FILE One or more files or directories to process
Core Options:
-o, --output DIR Output directory (default: ./extracted_data)
--csv FILE Export summary to CSV file
-j, --jobs N Number of parallel workers (default: 1)
--retries N LLM retry count (default: 2)
--backoff SEC Exponential back-off base (default: 1.5)
Analysis Features:
--flow Generate Attack-Flow JSON
--opps Generate Threat Detection Opportunities
--eval-opps Evaluate detection opportunities quality
--debug-opps Show debug information for opportunity generation
Output Control:
-q, --quiet Minimal console output
-v, --verbose Debug-level logging
-h, --help Show help message and exit
# Basic CTI extraction
python tdo_bulk.py threat_report.pdf
# Full analysis with all features
python tdo_bulk.py apt_report.pdf --flow --opps --eval-opps
# Batch processing with parallel workers
python tdo_bulk.py reports_folder/ -j 8 --flow --opps
# Export results to CSV
python tdo_bulk.py *.pdf --csv results.csv
# Quiet mode for automation
python tdo_bulk.py reports/ -q -o /var/soc/cti --opps
Para cada archivo procesado, la herramienta genera:
{filename}_extracted.json: datos CTI estructurados con un esquema integral{filename}_{timestamp}.md: informe Markdown legible con todo el análisis--flow)--opps)| Tipo de entidad | Descripción | Propiedades clave |
|---|---|---|
| ThreatActor | Grupos de amenazas cibernéticas | aliases, primary_motivation, first_seen |
| Tool | Software legítimo | family, capabilities, kill_chain_phases |
| Malware | Software malicioso | family, capabilities, first_seen, last_seen |
| Technique | Técnicas MITRE ATT&CK | id (T1234), description, kill_chain_phases |
| Tactic | Tácticas MITRE ATT&CK | id (TA0001), description |
| Infrastructure | Direcciones IP, dominios, URL | type, tags, first_seen, last_seen |
| Indicator | Hashes de archivos, patrones | value, pattern, valid_from, valid_until |
| Vulnerability | Entradas CVE | id, cvss_score, affected_software |
| Campaign | Campañas de ataque con nombre | objective, status, first_seen |
| Identity | Organizaciones objetivo | type, description |
| CourseOfAction | Mitigaciones, parches | type, description |
| Source | Procedencia del documento | , , |
Relaciones de atribución y de actor:
USES_TOOL, USES_TECHNIQUE, CONDUCTS, ATTRIBUTED_TO, TARGETSRelaciones técnicas:
TOOL_IMPLEMENTS_TECHNIQUE, HOSTS_ON, COMMUNICATES_WITH, VARIANT_OFDROPS, DOWNLOADS, INDICATES, OBSERVED_ON, EXPLOITSRelaciones avanzadas:
MITIGATES, DETECTS, IS_SUBTECHNIQUE_OF, FLOW_CONTAINS_STEPFLOW_USED_BY_ACTOR, OBSERVES, SOURCED_FROMTodas las relaciones admiten propiedades como confidence, source, first_seen, last_seen.
La herramienta genera oportunidades de detección basadas en evidencia con:
{
"id": "opp-001",
"name": "Detect PowerShell Process Injection",
"technique_id": "T1055",
"artefacts": ["powershell.exe with WriteProcessMemory calls"],
"behaviours": ["Process injection into legitimate processes"],
"rationale": "APT groups commonly use PowerShell for process injection",
"confidence": 0.8,
"source": "PowerShell used for process injection (T1055)",
"evidence": [
"• PowerShell executes WriteProcessMemory calls (line 45)",
"• Relationship: ThreatActor USES_TECHNIQUE T1055"
]
}
Los flujos de ataque mejorados proporcionan:
{
"flow": {
"label": "AttackFlow",
"pk": "attack-flow--uuid",
"properties": {
"name": "APT29 Multi-stage Attack",
"description": "Sophisticated spear-phishing to data exfiltration flow"
}
},
"steps": [
{
"order": 1,
"entity": {"label": "Technique", "pk": "T1566.001"},
"description": "Spear-phishing attachment delivery",
"reason": "Initial access method cited in report section 2.1"
}
]
}
tdo_bulk.py).env mediante python-dotenvtdo_bulk_runner.py)tdo_core/extractors/report_processor.py)tdo_core/detection/opportunity_generator.py)tdo_core/flows/attack_flow_synthesizer.py)tdo_core/report/md_export.py)tdo_core/llm/prompts.py)Document Input → Text Extraction → LLM Processing → Structured Output
↓ ↓ ↓ ↓
PDF/DOCX Clean Text Gemini API JSON + Fallback
↓ ↓ ↓ ↓
Multi-format Preprocessing Pydantic Schema Validation
↓ ↓ ↓ ↓
File Support Text Cleaning Structured Data CTI Graph
↓
Post-Processing
↓ ↓
Attack Flows Detection Opps
↓ ↓
Markdown Report Export
| Variable | Obligatoria | Descripción | Ejemplo |
|---|---|---|---|
GEMINI_API_KEY | ✅ | Clave de API de Google AI | AIza... |
GEMINI_MODEL | ✅ | Modelo Gemini a utilizar | gemini-2.5-flash-preview-05-20 |
| Modelo | Velocidad | Calidad | Coste | Caso de uso |
|---|---|---|---|---|
gemini-2.5-flash-preview-05-20 | ⚡ Rápido | 🎯 Buena | 💰 Bajo | Producción, procesamiento masivo |
gemini-2.5-pro-preview-06-05 | 🐌 Lento | 🏆 Excelente | 💸 Alto | Análisis complejo, investigación |
Error: Required environment variables missing: GEMINI_API_KEY, GEMINI_MODEL
Solución: crea un archivo .env con ambas variables obligatorias
Skipping unsupported file: document.rtf
Solución: convierte el archivo a formato PDF, DOCX, TXT o MD
Structured Gemini API error: ...
Soluciones:
--verbose para obtener registros de error detalladosLa herramienta gestiona automáticamente los problemas de análisis JSON mediante:
-j para varios archivos-q para scripts de automatización# Enable verbose logging
python tdo_bulk.py report.pdf -v
# Debug detection opportunities
python tdo_bulk.py report.pdf --opps --debug-opps
# Export detailed logs
python tdo_bulk.py report.pdf -v > processing.log 2>&1
La herramienta requiere Python 3.9+ y estos paquetes clave:
google-generativeai: cliente de la API de Google AI (Gemini) con salida estructuradaPyMuPDF: extracción de texto PDF de alto rendimientopython-docx: procesamiento de documentos de Microsoft Wordpandas: manipulación de datos y exportación a CSVpydantic: validación de esquemas y salida estructuradapython-dotenv: gestión de variables de entornocleantext: utilidades de preprocesamiento de textoEsta versión independiente:
No obstante, incluye todas las capacidades principales de extracción y análisis de CTI necesarias para la mayoría de los casos de uso.
.env con dotenv.env - está excluido por .gitignoreGEMINI_API_KEY de forma segura mediante variables de entornoLos archivos JSON y Markdown extraídos pueden contener:
Revisa siempre las salidas antes de compartirlas públicamente.
Notifica las vulnerabilidades de seguridad de forma responsable. Consulta SECURITY.md para obtener más detalles.
Este proyecto está licenciado bajo la Licencia MIT - consulta LICENSE para obtener más detalles.
¡Las contribuciones son bienvenidas! Lee CONTRIBUTING.md para conocer las directrices.
¿Necesitas ayuda? Ejecuta python tdo_bulk.py --help para una referencia rápida o consulta la sección de solución de problemas anterior.
filenamedocument_titlefile_size_mb