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. 保留所有权利。有关完整的免责声明,请参阅脚本头部。
标签:字符串匹配, 恶意代码分类, 逆向工具