bad-antics/vortex
GitHub: bad-antics/vortex
基于 Julia 的高性能威胁情报融合引擎,实时聚合 50+ 源的 IOC 并提供机器学习分析、威胁狩猎和多种检测规则导出能力。
Stars: 3 | Forks: 0
# 🌀 Vortex
**实时威胁情报融合引擎**
[](https://julialang.org/)
[](LICENSE)
[](https://github.com/nullsec-security/vortex)
Vortex 是一个用 Julia 编写的高性能威胁情报融合平台。它实时聚合、关联并分析来自 50 多个威胁情报源的入侵指标 (IOC),为安全团队提供可操作的情报。
## ✨ 功能特性
### 🔍 **多源情报聚合**
- **50+ 预配置源**:AlienVault OTX、Abuse.ch (URLhaus, Feodo, Bazaar)、MISP、VirusTotal、Shodan、Censys、Spamhaus、OpenPhish、PhishTank 等
- **19 种 IOC 类型**:IP、Domain、URL、MD5/SHA1/SHA256、Email、CVE、JA3、CIDR、Bitcoin 地址、YARA 规则等
- **自动去重**:通过置信度评分智能合并来自多个来源的 IOC
- **限速轮询**:通过可配置的轮询间隔遵守 API 限制
### 🧠 **高级分析**
- **威胁关联**:7 条内置关联规则用于识别相关威胁
- **基于 ML 的聚类**:使用 K-means 聚类对相似威胁进行分组
- **异常检测**:使用基于距离的检测方法识别异常 IOC
- **威胁评分**:带有衰减和来源信誉的加权评分模型
- **归属预测**:基于 IOC 特征预测威胁行为者归属
### 🎯 **威胁狩猎**
- **预定义狩猎查询**:C2、勒索软件、APT、钓鱼、挖矿
- **自定义狩猎规则**:创建带有告警的自动化狩猎
- **时间线分析**:随时间追踪威胁活动
- **模式匹配**:基于正则表达式的 IOC 值搜索
### 🔔 **告警系统**
- **基于规则的告警**:为高风险 IOC、特定类别或模式配置告警
- **严重性级别**:严重、高、中、低、信息
- **Webhook 通知**:Slack、Teams、Discord 和自定义 Webhook
- **告警管理**:确认、调查、解决或升级
### 📊 **富化**
- **GeoIP 查询**:位置、ASN、ISP 信息
- **WHOIS 数据**:域名注册详情
- **DNS 解析**:A、AAAA、MX、TXT、NS 记录
- **信誉评分**:VirusTotal、AbuseIPDB、Shodan
### 📤 **导出格式**
- **STIX 2.1**:标准威胁情报格式
- **MISP**:事件和属性导出
- **检测规则**:Snort、Suricata、YARA、Sigma
- **数据格式**:CSV、JSON
## 🚀 快速开始
### 安装
```
using Pkg
Pkg.add(url="https://github.com/nullsec-security/vortex")
```
### 基本用法
```
using Vortex
# 创建威胁情报引擎
engine = create_vortex_engine()
# 添加威胁源
add_feed!(engine, urlhaus_feed())
add_feed!(engine, feodo_tracker_feed())
add_feed!(engine, alienvault_otx_feed("YOUR_API_KEY"))
add_feed!(engine, spamhaus_drop_feed())
# 启动引擎 (开始轮询源)
start!(engine)
# 搜索 IOC
results = search_ioc(engine, "8.8.8.8")
for ioc in results
println("Found: $(ioc.value) - Risk: $(ioc.risk_score)")
end
# 批量检查
iocs_to_check = ["192.168.1.1", "malware.example.com", "suspicious.ru"]
matches = search_bulk(engine, iocs_to_check)
# 检查引擎状态
status(engine)
```
### 威胁狩猎
```
# 快速搜寻
result = threat_hunt(engine, "cobalt")
# 搜寻 C2 基础设施
query = hunt_c2_infrastructure()
c2_result = execute_hunt(engine, query)
# 搜寻近期高风险威胁
query = hunt_recent_threats(24) # Last 24 hours
recent = execute_hunt(engine, query)
# 自定义搜寻查询
custom_query = create_hunt_query(
name="My Hunt",
ioc_types=[IOC_IP, IOC_DOMAIN],
tags=["ransomware", "c2"],
min_risk_score=60.0,
date_from=now() - Day(7)
)
result = execute_hunt(engine, custom_query)
# 生成报告
report = export_hunt_report(result; detailed=true)
println(report)
```
### 告警
```
# 添加默认告警规则
for rule in default_alert_rules()
add_alert_rule!(engine, rule)
end
# 创建自定义告警规则
my_rule = create_alert_rule(
name="Critical Ransomware",
alert_type=ALERT_IOC_MATCH,
severity=ALERT_CRITICAL,
tags=["ransomware", "lockbit", "blackcat"],
min_risk_score=70.0,
notify_webhook=["https://hooks.slack.com/services/..."]
)
add_alert_rule!(engine, my_rule)
# 检查告警
alerts = get_alerts(engine)
for alert in alerts
println("$(alert.severity): $(alert.title)")
end
# 确认告警
acknowledge_alert!(alerts[1]; by="analyst@company.com")
# 解决告警
resolve_alert!(alerts[1];
by="analyst@company.com",
notes="Confirmed false positive - internal testing"
)
```
### 分析
```
# 关联分析
iocs = collect(values(engine.iocs))
correlations = correlate_iocs(iocs[1:100])
for corr in correlations
println("Correlated: $(corr.source_ioc) <-> $(length(corr.related_iocs)) IOCs")
end
# 构建关联图
graph = build_graph(iocs)
components = find_components(graph)
centrality = calculate_centrality(graph)
# 聚类
clusters = cluster_threats(engine; k=10)
for cluster in clusters
println("$(cluster.label): $(cluster.size) IOCs, avg risk: $(cluster.avg_score)")
end
# 异常检测
anomalies = detect_anomalies(engine; contamination=0.1)
for anom in anomalies[1:10]
println("Anomaly score: $(anom.anomaly_score) - $(anom.explanation)")
end
# 威胁评分
model = ScoringModel()
for ioc in iocs[1:10]
score = score_ioc(ioc, model)
println("$(ioc.value): $(score.score) ($(score.risk_level))")
end
```
### 富化
```
# 创建丰富化提供商
providers = [
geoip_provider(),
virustotal_enrichment_provider("YOUR_VT_API_KEY"),
abuseipdb_provider("YOUR_ABUSEIPDB_KEY")
]
# 丰富化 IOC
ioc = get_ioc(engine, "192.168.1.1")
enriched = full_enrich(ioc; providers=providers)
# 访问丰富化数据
if enriched.geoip !== nothing
println("Location: $(enriched.geoip.city), $(enriched.geoip.country_name)")
println("ASN: $(enriched.geoip.asn) - $(enriched.geoip.org)")
end
for rep in enriched.reputation
println("$(rep.source): $(rep.score) ($(rep.detection_count) detections)")
end
```
### 导出
```
# 导出为 STIX 2.1
stix_bundle = export_stix(iocs)
write("threat_intel.stix.json", stix_bundle)
# 导出为 MISP
misp_event = export_misp(iocs; event_info="Weekly IOC Export")
write("threat_intel.misp.json", misp_event)
# 导出为 CSV
csv_data = export_csv(iocs)
write("iocs.csv", csv_data)
# 导出为检测规则
snort_rules = export_snort(iocs)
suricata_rules = export_suricata(iocs)
yara_rules = export_yara(iocs)
sigma_rules = export_sigma(iocs)
# 带过滤导出
config = ExportConfig(
FORMAT_STIX,
true, # include_metadata
false, # include_enrichment
true, # pretty_print
5000, # max_items
true, # stix_bundle
false, # misp_galaxy
',', # csv_delimiter
0.5, # min_confidence
50.0, # min_risk_score
[IOC_IP, IOC_DOMAIN] # ioc_types
)
filtered_export = export_stix(iocs; config=config)
```
### 存储
```
# 创建情报库
store = create_intel_store()
# 存储 IOC
store_ioc!(store, ioc)
store_iocs!(store, iocs)
# 查询库
query = create_query(
ioc_types=[IOC_IP],
min_risk_score=50.0,
tags=["c2", "malware"],
sort_by=:risk_score,
limit=100
)
results = execute_query(store, query)
# 保存到磁盘
save_store(store, "intel_store.json")
# 从磁盘加载
store = load_store("intel_store.json")
# 获取统计数据
stats = store_stats(store)
println("Total IOCs: $(stats["total_iocs"])")
println("Risk distribution: $(stats["risk_distribution"])")
```
## 📋 支持的 IOC 类型
| 类型 | 描述 | 示例 |
|------|-------------|---------|
| `IOC_IP` | IPv4 地址 | `192.168.1.1` |
| `IOC_IP_V6` | IPv6 地址 | `2001:db8::1` |
| `IOC_DOMAIN` | 域名 | `malware.example.com` |
| `IOC_URL` | 完整 URL | `https://evil.com/malware.exe` |
| `IOC_HASH_MD5` | MD5 哈希 | `d41d8cd98f00b204e9800998ecf8427e` |
| `IOC_HASH_SHA1` | SHA1 哈希 | `da39a3ee5e6b4b0d3255bfef95601890afd80709` |
| `IOC_HASH_SHA256` | SHA256 哈希 | `e3b0c44298fc1c149afbf4c8996fb924...` |
| `IOC_EMAIL` | 电子邮件地址 | `attacker@evil.com` |
| `IOC_CVE` | CVE 标识符 | `CVE-2024-1234` |
| `IOC_JA3` | JA3 指纹 | `3b5074b1b5d032e5620f69f9f700ff0e` |
| `IOC_JA3S` | JA3S 指纹 | 服务器 JA3 指纹 |
| `IOC_CIDR` | CIDR 范围 | `192.168.0.0/24` |
| `IOC_BITCOIN` | 比特币地址 | `1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa` |
| `IOC_FILENAME` | 文件名 | `malware.exe` |
| `IOC_FILEPATH` | 文件路径 | `C:\Windows\System32\evil.dll` |
| `IOC_REGISTRY` | 注册表键 | `HKLM\Software\Malware` |
| `IOC_MUTEX` | 互斥体名称 | `Global\EvilMutex` |
| `IOC_USER_AGENT` | User Agent 字符串 | 浏览器/恶意软件签名 |
| `IOC_YARA` | YARA 规则名称 | `rule_malware_family` |
## 🔌 支持的情报源
### 预配置
| 提供商 | 情报源 | 数据 |
|----------|------|------|
| **Abuse.ch** | URLhaus | 恶意 URL |
| **Abuse.ch** | Feodo Tracker | 银行木马 C2 |
| **Abuse.ch** | Malware Bazaar | 恶意软件样本 |
| **Abuse.ch** | SSL Blocklist | 恶意 SSL 证书 |
| **AlienVault** | OTX | 多类型 IOC |
| **Spamhaus** | DROP | IP 黑名单 |
| **Emerging Threats** | IPs | 恶意 IP |
| **Blocklist.de** | IPs | 攻击 IP |
| **OpenPhish** | Phishing | 钓鱼 URL |
| **PhishTank** | Phishing | 已验证钓鱼 |
| **VirusTotal** | API | 文件/URL/IP 分析 |
| **Shodan** | API | 互联网扫描 |
| **Censys** | API | 互联网扫描 |
| **MISP** | Custom | 威胁共享 |
### 添加自定义情报源
```
# 创建自定义源
my_feed = custom_feed(
name="My Internal Feed",
url="https://internal.company.com/iocs.json",
api_key="...",
format="json",
poll_interval=300
)
add_feed!(engine, my_feed)
```
## 🏗️ 架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Vortex Engine │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Feeds │ │ Analysis │ │ Alerting │ │
│ │ │ │ │ │ │ │
│ │ • OTX │ │ • Scoring │ │ • Rule Engine │ │
│ │ • Abuse.ch │ │ • Correlation│ │ • Notifications │ │
│ │ • MISP │ │ • Clustering │ │ • Webhook/Email │ │
│ │ • VirusTotal │ │ • Anomaly │ │ │ │
│ │ • Shodan │ │ • Attribution│ │ │ │
│ │ • Custom │ │ │ │ │ │
│ └──────┬───────┘ └──────┬───────┘ └──────────┬───────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ IOC Store │ │
│ │ • 19 IOC Types • Indexing • Deduplication • Querying │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ Enrichment │ │ Hunting │ │ Export │ │
│ │ │ │ │ │ │ │
│ │ • GeoIP │ │ • Queries │ │ • STIX 2.1 │ │
│ │ • WHOIS │ │ • Rules │ │ • MISP │ │
│ │ • DNS │ │ • Reports │ │ • Snort/Suricata │ │
│ │ • Reputation │ │ │ │ • YARA/Sigma │ │
│ └──────────────┘ └──────────────┘ └──────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
```
## 📈 性能
Vortex 专为高性能威胁情报处理而设计:
- **IOC 摄取**:100,000+ IOC/秒
- **搜索**:通过索引实现亚毫秒级查找
- **关联**:针对大型数据集的并行处理
- **内存**:具有可配置限制的高效存储
- **可扩展性**:支持数百万个 IOC
## 🔒 安全注意事项
- API 密钥仅存储在内存中(不记录日志)
- 支持所有情报源连接的 TLS
- 速率限制防止 API 滥用
- 未加密情况下不会将敏感数据写入磁盘
## 🤝 贡献
欢迎贡献!请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解指南。
## 📄 许可证
MIT 许可证 - 详情请参阅 [LICENSE](LICENSE)。
## 🙏 致谢
- [Abuse.ch](https://abuse.ch/) 提供出色的威胁情报源
- [AlienVault OTX](https://otx.alienvault.com/) 提供威胁情报
- [MISP Project](https://www.misp-project.org/) 提供威胁共享标准
- Julia 社区提供了如此 amazing 的语言
**Vortex** - *将秩序带入混乱的威胁情报世界*
[NullSec Security](https://github.com/nullsec-security) 项目的一部分。
标签:Apex, DAST, HTTP/HTTPS抓包, IOC关联分析, Julia, TIP平台, 入侵指标, 威胁情报, 威胁评分, 安全大数据, 安全运营, 实时威胁检测, 开发者工具, 异常检测, 态势感知, 恶意软件分析, 情报融合, 扫描框架, 攻击归因, 机器学习, 欺诈检测, 网络安全, 隐私保护, 高速数据处理