AMFeedlyCustomerScripts/Feedly_Threat_Actor_IOC_Extractor

GitHub: AMFeedlyCustomerScripts/Feedly_Threat_Actor_IOC_Extractor

该脚本从 Feedly 威胁情报平台按威胁行为者名称自动提取并分类导出全部关联 IOC,解决安全运营中手工收集妥协指标效率低下的问题。

Stars: 0 | Forks: 0

# Feedly 威胁行为者 IOC 提取器 直接从命令行提取与 Feedly 威胁情报跟踪的任何威胁行为者相关的妥协指标(IP、域名、文件哈希、URL)。 ## 概述 此工具实现了从 Feedly 威胁行为者洞察卡片到完整 IOC 列表的可重复的两步工作流程: 1. **解析** — 按名称(例如 `"Lazarus Group"`、`"APT28"`)搜索威胁行为者,通过自动补全端点检索其 Feedly NLP 实体 ID。 2. **提取** — 调用威胁行为者关系端点以拉取所有关联的 IOC 实体并按类型对它们进行分类。 ### 用例 - **SIEM / SOAR 摄取** — 以 JSON 或 CSV 格式将 IOC 输入到 Splunk、Sentinel 或 XSOAR - **防火墙 / EDR 黑名单** — 导出 IP 和域名列表以进行策略更新 - **威胁狩猎准备** — 在狩猎前提取哈希值以预填充检测工具 - **事件响应** — 在活跃事件期间快速枚举行为者的所有已知 IOC - **定时自动化** — 在 cron/计划任务上针对固定的行为者 ID 运行以进行持续刷新 ## 要求 - Python 3.8+ - Feedly Enterprise API token - `requests` 库(`pip install requests`) - 用于配置文件支持的 `PyYAML` 库(`pip install pyyaml`) — 可选 ## 安装 ``` # 克隆仓库 git clone https://github.com/AMFeedlyCustomerScripts/Feedly_Threat_Actor_IOC_Extractor.git cd Feedly_Threat_Actor_IOC_Extractor # 安装依赖 pip install -r requirements.txt # 配置凭据(选择一种方法) ``` ### 凭据选项 **选项 A — 环境变量(推荐用于自动化)** ``` export FEEDLY_API_KEY="your_feedly_api_token" ``` **选项 B — .env 文件** ``` echo 'FEEDLY_API_KEY="your_feedly_api_token"' > .env ``` **选项 C — 配置文件** ``` cp config.yaml.template config.yaml # 编辑 config.yaml 并设置 feedly.api_token ``` ## 用法 ### 基础用法 — 按名称搜索 ``` python feedly_threat_actor_ioc.py --actor "Lazarus Group" ``` 如果多个行为者匹配,脚本会以交互方式将名称解析为实体 ID,然后获取所有时间段内的所有关联 IOC。 ### 跳过名称解析 — 直接使用实体 ID ``` python feedly_threat_actor_ioc.py \ --actor-id "nlp/f/entity/gz:ta:68391641-859f-4a9a-9a1e-3e5cf71ec376" ``` 在已知实体 ID(例如从先前的 `--dry-run` 中存储)的自动化中非常有用。 ### 限制时间窗口 ``` python feedly_threat_actor_ioc.py --actor "APT28" --interval LAST_30_DAYS ``` ### 按 IOC 类型过滤 ``` # 仅 IPs 和 domains python feedly_threat_actor_ioc.py --actor "Lazarus" --type ip,domain # 仅 hashes python feedly_threat_actor_ioc.py --actor "Lazarus" --type hash ``` ### 将输出保存到文件 ``` # 纯文本 — 按类型分组,每行一个值 python feedly_threat_actor_ioc.py --actor "Lazarus" --output lazarus_iocs.txt --format txt # JSON — 每个 IOC 包含完整元数据 python feedly_threat_actor_ioc.py --actor "Lazarus" --output lazarus_iocs.json --format json # CSV — 每个 IOC 一行,可直接导入 Excel 或 SIEM python feedly_threat_actor_ioc.py --actor "Lazarus" --output lazarus_iocs.csv --format csv ``` ### 演练 — 仅解析名称,跳过 IOC 获取 ``` python feedly_threat_actor_ioc.py --actor "Sandworm" --dry-run ``` 打印实体 ID 而不发起关系调用。在脚本中用于预验证行为者名称非常有用。 ### 使用配置文件 ``` cp config.yaml.template config.yaml # 编辑 config.yaml python feedly_threat_actor_ioc.py --actor "Lazarus" --config config.yaml ``` ### 调试原始 API 响应 ``` python feedly_threat_actor_ioc.py --actor "APT29" --dump-raw --verbose ``` 将来自关系端点的完整 JSON 响应打印到 stderr — 在首次针对新行为者或 API 版本运行时非常有帮助。 ## 命令行参考 | 选项 | 简写 | 描述 | |--------|-------|-------------| | `--actor NAME` | `-a` | 要搜索的威胁行为者名称(与 `--actor-id` 互斥) | | `--actor-id ID` | `-i` | 跳过名称解析;直接使用此实体 ID | | `--interval WINDOW` | | 时间窗口:`LAST_7_DAYS`, `LAST_30_DAYS`, `LAST_3_MONTHS`, `LAST_6_MONTHS`, `LAST_1_YEAR`, `FOREVER`(默认:`FOREVER`) | | `--type TYPES` | `-t` | 逗号分隔的过滤器:`ip`, `domain`, `hash`, `url`, `email`, `other`, `all`(默认:`all`) | | `--format FORMAT` | `-f` | 输出格式:`txt`, `json`, `csv`(默认:`txt`) | | `--output FILE` | `-o` | 写入文件而不是 stdout | | `--config FILE` | `-c` | YAML 配置文件的路径(默认:当前/脚本目录中的 `config.yaml`) | | `--api-key KEY` | | 覆盖来自环境/配置的 API key | | `--search-count N` | | 搜索步骤中返回的最大行为者候选数(默认:`10`) | | `--dry-run` | | 仅解析行为者名称并打印实体 ID | | `--dump-raw` | | 将原始关系 JSON 打印到 stderr | | `--verbose` | `-v` | 启用调试输出 | ## 输出格式 ### 文本 (`--format txt`) 纯文本,按 IOC 类型分组。每行一个值 — 便于粘贴到工单或黑名单配置中。 ``` # Feedly Threat Actor IOC Export # Actor : Lazarus Group # ID : nlp/f/entity/gz:ta:68391641-859f-4a9a-9a1e-3e5cf71ec376 # Window : FOREVER # Date : 2026-05-29T14:30:00Z # Total : 42 IOC(s) ## DOMAIN (18) cdn-apple.com download-node.com ... ## HASH (14) 3a4b5c6d7e8f... ... ## IP (10) 185.220.101.45 ... ``` ### JSON (`--format json`) 包含每个 IOC 的文章提及计数和 Feedly 实体 ID 的完整元数据。 ``` { "meta": { "actor_name": "Lazarus Group", "actor_id": "nlp/f/entity/gz:ta:68391641-859f-4a9a-9a1e-3e5cf71ec376", "interval": "FOREVER", "exported_at": "2026-05-29T14:30:00+00:00", "total_iocs": 42 }, "iocs": [ { "value": "185.220.101.45", "ioc_type": "ip", "ioc_group": "ip", "article_count": 7, "entity_id": "nlp/f/entity/ioc:..." }, { "value": "cdn-apple.com", "ioc_type": "domain", "ioc_group": "domain", "article_count": 3, "entity_id": "nlp/f/entity/ioc:..." } ] } ``` ### CSV (`--format csv`) 每个 IOC 一行,带有行为者上下文列 — 可直接用于 Excel、Splunk 查找表或 SIEM 摄取。 ``` value,ioc_type,ioc_group,article_count,entity_id,actor_name,actor_id,interval 185.220.101.45,ip,ip,7,nlp/f/entity/ioc:...,Lazarus Group,nlp/f/entity/gz:ta:...,FOREVER cdn-apple.com,domain,domain,3,nlp/f/entity/ioc:...,Lazarus Group,nlp/f/entity/gz:ta:...,FOREVER ``` ## IOC 类型分类 脚本使用正则表达式自动对每个 IOC 值进行分类: | 分组 | 细粒度类型 | 示例 | |-------|--------------------|---------| | `ip` | `ip` (IPv4/CIDR), `ipv6` | `185.220.101.45`, `2001:db8::1` | | `domain` | `domain` | `cdn-apple.com`, `update-service.net` | | `hash` | `hash_md5`, `hash_sha1`, `hash_sha256`, `hash_sha512` | 32/40/64/128 位十六进制字符 | | `url` | `url` | `https://malicious.example/payload` | | `email` | `email` | `attacker@protonmail.com` | | `other` | `unknown` | 任何与上述内容不匹配的项 | 消除危险性的 IOC(例如 `hxxps://`, `[.]`)在分类前会被标准化。 ## 配置文件 将 `config.yaml.template` 复制到 `config.yaml` 并根据需要进行编辑: ``` feedly: api_token: "YOUR_FEEDLY_API_TOKEN_HERE" defaults: interval: "FOREVER" # Default time window format: "json" # Default output format ioc_types: "all" # Default IOC type filter output_dir: "./output" # Auto-save timestamped files here (optional) ``` CLI 参数始终覆盖配置文件中的值。 ## 自动化示例 ``` #!/bin/bash # 已知 actor 的每日 IOC 刷新 export FEEDLY_API_KEY="..." python feedly_threat_actor_ioc.py \ --actor-id "nlp/f/entity/gz:ta:68391641-859f-4a9a-9a1e-3e5cf71ec376" \ --interval LAST_7_DAYS \ --type ip,domain \ --format csv \ --output /var/threat-intel/lazarus_$(date +%Y%m%d).csv ``` ## 故障排除 **未返回 IOC** 关系端点会显示 Feedly 已明确链接到该行为者的 IOC 实体。如果结果为空: - 尝试使用 `--interval FOREVER` 扩大时间窗口。 - 使用 `--dump-raw --verbose` 检查原始响应结构。 - 使用 `--dry-run` 验证实体 ID — 错误的 ID 会返回 404。 - 某些行为者的关系可能仅被分类为恶意软件/TTP,而没有链接的 IOC 实体。 **身份验证错误** 验证您的 token 是否已设置:`echo $FEEDLY_API_KEY`。可以在 `https://feedly.com/v3/auth/dev` 生成 token。 **匹配到多个行为者** 搜索最多返回 `--search-count`(默认为 10)个候选者。使用交互式菜单选择正确的候选者,或者在知道实体 ID 后使用 `--actor-id` 完全绕过搜索。 ## 使用的 API 端点 | 步骤 | 方法 | 端点 | |------|--------|----------| | 名称解析 | `GET` | `/v3/search/entities?query={name}&count={n}` | | IOC 提取 | `GET` | `/v3/ml/relationships/actor/{id}?intervalType={window}` | ## 许可证 © 2025 Feedly, Inc. 保留所有权利。有关完整的免责声明,请参阅脚本头部。
标签:字符串匹配, 恶意代码分类, 逆向工具