ahmed-raza-shaikh/Kuro-Strike
GitHub: ahmed-raza-shaikh/Kuro-Strike
Kuro-Strike 是一个基于 FastAPI 的微服务,通过整合多个威胁情报源实时富化 Splunk 安全告警,帮助 SOC 分析师大幅缩短告警分类处理时间。
Stars: 0 | Forks: 0
# Kuro-Strike — Splunk 的 SIEM 告警富化微服务
这是一个生产就绪的 Python 微服务,利用 **VirusTotal**、**Shodan** 和 **AbuseIPDB** 威胁情报实时富化 **Splunk** 安全告警 —— 将分析师的平均分类处理时间从约 8 分钟缩短至每条告警 **90 秒以内**。
```
Splunk Alert ──POST──► /webhook/splunk
│
┌──────────▼──────────┐
│ EnrichmentService │
│ ───────────────── │
│ Extract IOCs │
│ (IPs/domains/hash) │
└──────────┬──────────┘
│ asyncio.gather()
┌─────────────┼─────────────┐
▼ ▼ ▼
VirusTotal Shodan AbuseIPDB
(malicious (open ports, (abuse score,
engines, CVEs, org) reports, TOR)
reputation)
└─────────────┬─────────────┘
│
┌──────────▼──────────┐
│ Risk Score 0–100 │
│ Triage Summary │◄─── Redis Cache
│ EnrichedAlert │ (TTL 1 hr)
└─────────────────────┘
```
## 核心成果
- 利用 VirusTotal、Shodan 和 AbuseIPDB 的威胁情报富化 Splunk 告警,支持 SOC 分析师更快速地进行分类处理。
- 采用并发 API 调用和 Redis 缓存,以降低重复 IOC 的延迟并节省威胁情报 API 配额。
## 功能特性
- **并发富化** — 每个 IOC 并行查询所有三个情报源;延迟约为 `max(source)` 而非 `sum(sources)`
- **Redis 缓存** — 重复的 IOC 在 < 5 ms 内从缓存中读取;避免冗余的 API 调用和速率限制消耗
- **自动 IOC 提取** — 从任何 Splunk 结果字段中解析公网 IP、域名以及 MD5/SHA-1/SHA-256 哈希值
- **综合风险评分** — 采用加权算法(0–100),结合 VT 引擎检测数、AbuseIPDB 置信度、Shodan CVE 及可疑端口
- **人类可读的分类摘要** — 即时可用的摘要,包含国家、ISP、CVE 和检测次数
- **双重 Splunk 集成** — 原生 webhook 接收器 + 自定义告警动作脚本
- **Docker 就绪** — 一条 `docker compose up` 命令即可启动服务及 Redis
## 快速开始
### 1. 获取 API 密钥
| 服务 | 免费额度 | 注册链接 |
|---|---|---|
| VirusTotal | 4 次请求/分钟 | https://www.virustotal.com/gui/join-us |
| Shodan | 100 查询额度 | https://account.shodan.io/register |
| AbuseIPDB | 1000 次检查/天 | https://www.abuseipdb.com/register |
### 2. 配置
```
cp .env.example .env
# 编辑 .env — 填入您的三个 API keys
```
### 3. 运行
```
# Docker(推荐)
make docker-up
# 本地(需要 Python 3.12+ 和 Redis)
make install
make dev
```
服务监听于 **http://localhost:8000** — 交互式文档位于 **/docs**。
## API
### `POST /enrich`
接收标准化的 `SplunkAlert` 主体并返回 `EnrichedAlert`。
```
curl -X POST http://localhost:8000/enrich \
-H "Content-Type: application/json" \
-d '{
"alert_name": "Suspicious Outbound C2 Traffic",
"source_ip": "185.220.101.45",
"destination_ip": "104.21.14.88",
"domain": "malware-c2.xyz",
"file_hash": "44d88612fea8a8f36de82e1278abb02f",
"result": {
"dest_port": "4444",
"process": "powershell.exe"
}
}'
```
**响应**
```
{
"risk_level": "CRITICAL",
"risk_score": 88,
"triage_summary": "🔴 CRITICAL RISK | Score: 88/100\nAlert : Suspicious Outbound C2 Traffic\n\n■ IP: 185.220.101.45\n VirusTotal : 23/90 engines flagged [⚠ MALICIOUS]\n AbuseIPDB : 95% confidence | 847 reports | RU\n ISP : Frantech Solutions\n Shodan ports: [22, 80, 443, 4444]\n CVEs : CVE-2021-44228, CVE-2022-0847\n Org : AS-CHOOPA (Amsterdam NL)\n\n■ Domain: malware-c2.xyz\n VirusTotal : 8/90 engines [⚠ MALICIOUS]\n\n■ Hash: 44d88612fea8a8f...\n VirusTotal : 55/70 engines [⚠ MALICIOUS]",
"enrichment_duration_ms": 1247.3,
"ip_enrichments": { ... },
"domain_enrichments": { ... },
"hash_enrichments": { ... }
}
```
### `POST /webhook/splunk`
即插即用的 Splunk webhook 接收器 — 接收 Splunk 原生告警 payload 格式。
在 Splunk 中配置:**Alert Actions → Webhook → URL: `http://:8000/webhook/splunk`**
### `GET /health`
```
{ "status": "ok", "redis": "connected" }
```
### `DELETE /cache`
清空 Redis 富化缓存(供管理员/调试使用)。
## 风险评分
| 来源 | 信号 | 分值 |
|---|---|---|
| VirusTotal | 恶意引擎数量 | `数量 × 4`(最高 30) |
| VirusTotal | 可疑引擎数量 | `数量 × 1`(最高 5) |
| VirusTotal | 低信誉度 (< -50) | +5 |
| AbuseIPDB | 滥用置信度得分 | `得分 × 0.5`(最高 50) |
| AbuseIPDB | TOR 出口节点 | +10 |
| AbuseIPDB | > 500 份报告 | +5 |
| Shodan | 已知 CVE | `数量 × 8`(最高 20) |
| Shodan | 可疑开放端口 | `数量 × 2` |
| VirusTotal (哈希) | 恶意引擎数量 | `数量 × 6`(最高 80) |
| 风险等级 | 分数 |
|---|---|
| 🟢 低风险 | 0 – 24 |
| 🟡 中风险 | 25 – 49 |
| 🟠 高风险 | 50 – 74 |
| 🔴 严重风险 | 75 – 100 |
## 项目结构
```
siem-alert-enrichment/
├── src/
│ ├── main.py # FastAPI app factory
│ ├── config.py # pydantic-settings config
│ ├── models/
│ │ ├── alert.py # SplunkAlert, IOCBundle, SplunkWebhookPayload
│ │ └── enrichment.py # VirusTotalResult, ShodanResult, AbuseIPDBResult, EnrichedAlert
│ ├── enrichers/
│ │ ├── base.py # Abstract base enricher
│ │ ├── virustotal.py # VT API v3 (IPs, domains, hashes)
│ │ ├── shodan.py # Shodan host lookup
│ │ └── abuseipdb.py # AbuseIPDB check endpoint
│ ├── services/
│ │ ├── enrichment_service.py # Orchestration, scoring, triage summary
│ │ └── cache_service.py # Redis async cache
│ └── api/
│ └── routes.py # FastAPI routes
├── tests/
│ ├── conftest.py # Shared fixtures & mocks
│ ├── test_enrichers.py # Enricher unit tests (respx mocks)
│ ├── test_api.py # API & service integration tests
│ └── fixtures/
│ └── sample_alert.json # Sample Splunk alert payload
├── splunk/
│ ├── alert_action.py # Splunk custom alert action script
│ └── README.md # Splunk integration guide
├── Dockerfile
├── docker-compose.yml
├── Makefile
├── requirements.txt
└── .env.example
```
## 开发
```
make test # pytest with coverage report
make lint # ruff linter
make docker-up # full stack
```
## 安全与隐私
- 仅将 VirusTotal、Shodan、AbuseIPDB 以及可选的 Splunk webhook 凭据存储在环境变量或托管密钥库中——严禁将其提交到代码仓库。
- 将告警 payload 和富化结果视为安全敏感的运营数据;部署时应配备适当的访问控制、日志保留策略和 TLS 终端。
- API 速率限制和第三方威胁情报的覆盖范围可能会影响富化的完整性;请通过您的事件响应流程验证结果。
## 环境变量
| 变量 | 默认值 | 描述 |
|---|---|---|
| `VIRUSTOTAL_API_KEY` | — | **必填** |
| `SHODAN_API_KEY` | — | **必填** |
| `ABUSEIPDB_API_KEY` | — | **必填** |
| `REDIS_URL` | `redis://localhost:6379/0` | Redis 连接 |
| `CACHE_TTL_SECONDS` | `3600` | IOC 缓存生命周期 |
| `ENRICHMENT_TIMEOUT_SECONDS` | `10` | 单个情报源请求超时时间 |
| `SPLUNK_WEBHOOK_TOKEN` | *(空)* | 可选 webhook 认证 token |
| `LOG_LEVEL` | `INFO` | `DEBUG` / `INFO` / `WARNING` |
## 技术栈
- **FastAPI** — 异步 REST 框架
- **httpx** — 用于所有三个 TI API 的异步 HTTP 客户端
- **redis[asyncio]** — 用于缓存的异步 Redis 客户端
- **pydantic v2** — 数据验证与序列化
- **pytest + respx** — 单元测试与集成测试
## 许可证
本项目基于 [MIT 许可证](LICENSE) 发布。
版权所有 (c) 2026 Ahmed Raza Shaikh。
有关规范的许可条款,请参阅 [开源促进会 MIT 许可证](https://opensource.org/license/mit/)。
标签:AV绕过, FastAPI, Python, 威胁情报, 安全规则引擎, 开发者工具, 搜索引擎查询, 无后门, 请求拦截, 运行时操纵, 逆向工具