infosecbhanu/adversary-intel
GitHub: infosecbhanu/adversary-intel
一个独立的主动威胁情报平台,通过多层指纹识别和数据枢纽分析,在公开情报源之前追踪并构建对手 C2 基础设施图谱。
Stars: 1 | Forks: 0
# adversary-intel
用于主动追踪对手基础设施的独立威胁情报平台。
灵感来自 [ThreatSignal — Tracking Adversary Infrastructure: Beyond the IoC](https://www.threatsignal.in/post/tracking-adversary-infrastructure) 中的方法论。
与其被动地接收公开的威胁情报源,这个平台让你能够**生产**威胁情报——在任何公开情报源出现之前,构建出对手 C2 集群的内部基础设施图谱。
## 架构
```
adversary-intel/
├── adversary_intel/
│ ├── core/ # Active fingerprinting (JARM, favicon, TLS, HTTP, pDNS)
│ ├── scanning/ # Internet-wide scan pivots (Shodan, Censys, crt.sh)
│ ├── intel/ # Enrichment (WHOIS, ASN, VirusTotal)
│ ├── feeds/ # Threat feed integrations
│ │ ├── anomali.py # Anomali ThreatStream (commercial)
│ │ ├── misp.py # MISP (open source)
│ │ ├── opencti.py # OpenCTI (open source)
│ │ ├── otx.py # AlienVault OTX (free)
│ │ ├── securitytrails.py # SecurityTrails pDNS + WHOIS pivot (free tier)
│ │ └── abusech.py # MalwareBazaar, URLhaus, Feodo, ThreatFox, SSLBL (free)
│ ├── graph/ # NetworkX infrastructure graph
│ ├── detection/ # Sigma rule + Nuclei template generation
│ ├── reporting/ # IOC export (JSON, CSV, MISP, STIX 2.1, TXT)
│ ├── workflows/ # End-to-end C2 hunt workflow
│ └── api/ # FastAPI REST API
├── output/
│ ├── hunts/ # Per-hunt session reports + IOC exports
│ │ └── 45_142_212_31/ # Live hunt: vpnplus.ru operator cluster
│ └── rules/ # Generated Sigma + Nuclei rules
├── templates/
│ ├── sigma/ # Built-in Sigma detection rules
│ └── nuclei/ # Built-in Nuclei templates
└── tests/
```
## 它的功能
### 指纹识别
| 模块 | 技术 | 扩展追踪 |
|--------|-----------|-------|
| `core/jarm.py` | 主动 TLS 指纹识别(10 个探测 → 62 字符哈希) | Shodan/Censys 上的 `ssl.jarm:` |
| `core/tls_cert.py` | X.509 证书提取(CN, SANs, serial, fingerprint) | Shodan 上的 `ssl.cert.fingerprint:` |
| `core/favicon.py` | MurmurHash3 favicon 哈希 | Shodan/FOFA 上的 `http.favicon.hash:` |
| `core/http_fp.py` | HTTP 响应指纹识别(headers, body hash, title) | 复合 Shodan 查询 |
| `core/passive_dns.py` | pDNS 历史记录 + 批量激活检测 | Validin, SecurityTrails, VirusTotal |
### 情报
| 模块 | 来源 | 费用 |
|--------|--------|------|
| `intel/whois.py` | WHOIS + SecurityTrails 枢纽分析 | 提供免费层级 |
| `intel/asn.py` | ASN/托管集群 + 无敌 ASN 标记 | 免费 (BGP.tools) |
| `intel/virustotal.py` | VT 沙箱 C2 提取、JARM、pDNS、信誉度 | 免费层级 |
| `scanning/crtsh.py` | 用于钓鱼基础设施的 CT 日志监控 | 免费 |
### 威胁情报源(无密钥情报源始终活跃)
| 情报源 | 是否需要密钥 | 覆盖范围 |
|------|-------------|--------|
| MalwareBazaar | 否 | 恶意软件样本 + C2 配置 |
| URLhaus | 否 | 恶意 URL |
| Feodo Tracker | 否 | 僵尸网络 C2 IP(Emotet, QakBot, IcedID) |
| ThreatFox | 否 | IOC 数据库 |
| SSLBL | 否 | 恶意 TLS 证书黑名单 |
| AlienVault OTX | 是(免费) | 社区威胁脉冲 |
| VirusTotal | 是(免费) | 文件/IP/域名信誉度 |
| Anomali ThreatStream | 是(商业) | 企业威胁情报 |
| MISP | 是(自托管) | 共享平台 |
| OpenCTI | 是(自托管) | STIX 2.1 CTI 平台 |
## 快速开始
```
git clone https://github.com/YOUR_USERNAME/adversary-intel
cd adversary-intel
pip install -e ".[dev]"
cp .env.example .env
# 使用您的 API keys 编辑 .env(基本使用仅需 Shodan + VT)
```
### CLI 用法
```
# 从 seed IP 进行完整的端到端 hunt
adversary-intel hunt 45.142.212.31
# 从 malware hash 进行 hunt(首先通过 VT sandbox 提取 C2)
adversary-intel hunt abc123...sha256hash --seed-type hash
# 对主机进行 JARM fingerprint
adversary-intel jarm 45.142.212.31
# 分析 TLS certificate
adversary-intel cert malicious-c2.example.com
# Passive DNS 历史 + 批量激活
adversary-intel pdns 45.142.212.31
adversary-intel pdns evil-domain.com
# WHOIS pivot
adversary-intel whois evil-domain.com
# 用于 Shodan pivot 的 Favicon hash
adversary-intel favicon https://target.com
# CT log 监控(在首次 phish 之前发现 phishing infra)
adversary-intel ct-monitor targetorg.com
# 检查所有 feeds 中的 indicator
adversary-intel feeds check 45.142.212.31
adversary-intel feeds recent
# 生成 Sigma rules
adversary-intel sigma --jarm 07d14d16d21d21d00042d41d00041de5fb3038104f457d92ba02e9311512c2
adversary-intel sigma --ips "1.2.3.4,5.6.7.8"
# 启动 REST API
adversary-intel serve
```
### REST API
```
adversary-intel serve
# → http://localhost:8000/docs
```
核心端点:
```
POST /jarm { "host": "45.142.212.31" }
POST /cert { "host": "evil.com" }
POST /favicon { "target": "https://evil.com" }
POST /pdns { "query": "45.142.212.31" }
POST /whois ?domain=evil.com
POST /ct-monitor { "query": "%.targetorg.com" }
POST /feeds/check { "indicator": "45.142.212.31" }
POST /shodan/jarm ?jarm=07d14d...
POST /sigma/jarm { "jarm": "07d14d...", "title": "Cobalt Strike" }
POST /hunt { "seed": "45.142.212.31" } ← full async hunt
GET /hunt/{job_id} ← poll for results
```
### Python API
```
from adversary_intel.workflows.c2_hunt import C2Hunter
from adversary_intel.models import NodeType
hunter = C2Hunter(output_dir="./output")
result = hunter.hunt("45.142.212.31", NodeType.IP)
print(f"Nodes discovered: {result.nodes_discovered}")
print(f"Previously unreported: {result.unreported_nodes}")
print(f"JARM clusters: {result.jarm_clusters}")
print(f"Sigma rules: {len(result.sigma_rules)}")
```
## 狩猎方法论
此工具实现了 ThreatSignal 文章中的扩展追踪链:
```
Seed IP / Domain / Hash
│
├─ JARM fingerprint → "probably Cobalt Strike/Sliver"
│
├─ Shodan JARM pivot → 34 IPs sharing fingerprint
│ └─ filter CDN ASNs → 19 candidates
│
├─ VirusTotal cross-ref → 6 known, 13 UNREPORTED
│
├─ TLS cert pivot → 11/19 share cert template
│ └─ confirms single → deployment cluster
│
├─ Passive DNS → 9 domains activated same 48h window
│ └─ batch activation → operator fingerprint
│
├─ WHOIS clustering → same registrar + nameserver pair
│ └─ confirmed: → same operator as known campaign
│
├─ ASN analysis → bulletproof hosting flagged
│
└─ Rule generation
├─ Sigma rules → SIEM detection
└─ Nuclei templates → automated scanning
```
**输出:** 基础设施图谱(JSON/GEXF/HTML),Sigma 规则,Nuclei 模板。
在任何 IP 出现在公开情报源之前,所有 13 个未报告的 IP 都已加入检测。
## API 密钥
| 平台 | 密钥 | 获取方式 |
|----------|-----|--------|
| Shodan | `SHODAN_API_KEY` | [shodan.io](https://shodan.io) — $49/月或免费开发者版 |
| Censys | `CENSYS_API_ID` + `CENSYS_API_SECRET` | [censys.io](https://censys.io) — 免费研究员层级 |
| VirusTotal | `VIRUSTOTAL_API_KEY` | [virustotal.com](https://virustotal.com) — 免费 4 次请求/分钟 |
| OTX | `OTX_API_KEY` | [otx.alienvault.com](https://otx.alienvault.com) — 免费 |
| SecurityTrails | `SECURITYTRAILS_API_KEY` | [securitytrails.com](https://securitytrails.com) — 免费层级 |
| Validin | `VALIDIN_API_KEY` | [validin.com](https://validin.com) |
| Anomali | `ANOMALI_USERNAME` + `ANOMALI_API_KEY` | [anomali.com](https://anomali.com) — 提供试用 |
| MISP | `MISP_URL` + `MISP_KEY` | 自托管:[github.com/MISP/MISP](https://github.com/MISP/MISP) |
| OpenCTI | `OPENCTI_URL` + `OPENCTI_TOKEN` | 自托管或 [filigran.io](https://filigran.io) |
无密钥情报源(始终活跃):MalwareBazaar, URLhaus, Feodo Tracker, ThreatFox, SSLBL, crt.sh
## 内置检测模板
### Sigma 规则 (`templates/sigma/`)
- `cobalt_strike_jarm.yml` — CS 默认 JARM 检测
- `ja3_c2_detection.yml` — 针对 CS/Sliver/Metasploit 的 JA3 指纹匹配
### Nuclei 模板 (`templates/nuclei/`)
- `cobalt_strike_multi_signal.yaml` — JARM + HTTP 404 模式(低误报率)
- `sliver_c2_detection.yaml` — Sliver C2 JARM 检测
## MITRE ATT&CK 覆盖范围
| 技术 | ID | 追踪方法 |
|-----------|----|--------------------|
| 通过 HTTP/S 的 C2 | T1071.001 | JARM + HTTP 响应指纹识别 |
| 加密 C2 | T1573.002 | JA3/JA3S + TLS 证书分析 |
| 获取基础设施 | T1583 | WHOIS 批量注册检测 |
| 损害基础设施 | T1584 | pDNS 历史记录 + 激活集群 |
| 动态解析 | T1568 | 被动 DNS 枢纽链 |
| 协议隧道 | T1572 | JARM TLS 协议栈指纹识别 |
## 示例:实战狩猎 — 45.142.212.31(vpnplus.ru 操作者集群)
```
adversary-intel hunt 45.142.212.31
```
**调查结果摘要**(狩猎 `HUNT-20260614-001`):
| 指标 | 类型 | 置信度 | 备注 |
|-----------|------|-----------|-------|
| `45.142.212.31` | IP | 高 | 种子;Aeza Group AS210644;CN=invalid2.invalid;SNI 规避 |
| `194.87.27.217` | IP | 高 | Timeweb CZ;被 MalwareURL + SOCRadar 标记 |
| `77.73.132.40` | IP | 高 | Timeweb KZ;Yahoo 证书欺骗;rocshers.cloud, onypy.com |
| `194.67.71.147` | IP | 中 | REG.RU RU;被 ESET 标记;Sliver JARM 前缀匹配 |
| `vpnplus.ru` | 域名 | 高 | 10-IP 轮换集群;REGRU-RU / ns1.reg.ru 指纹 |
| `panel.vpnplus.ru` | 域名 | 高 | OVH FR 上的 C2/VPN 管理面板 |
| `tgbot.vpnplus.ru` | 域名 | 中 | 疑似 Telegram C2 频道 |
| `80E5CABDF41B68E0BA718F4A1224EFA3` | 证书序列号 | 高 | CN=invalid2.invalid 自签名 |
| `onypy.com` | 域名 | 中 | 在两个集群 IP 间共享 — 跨集群链接 |
**操作者指纹:**
- 注册商:**REGRU-RU**,域名服务器:**ns1.reg.ru / ns2.reg.ru**
- 控制平面:**135.125.181.208** (OVH FR) — 托管所有 vpnplus.ru 面板/机器人子域名 + mantpartners.com
- Telegram 机器人基础设施:`tgbot.vpnplus.ru`, `bot.vpnplus.ru`
- 规避手段:端口 443 在明文 HTTP 上呈现 Google HTTP 重定向;TLS 层显示自签名 `invalid2.invalid` 证书(SNI 路由伪装)
完整的狩猎输出位于 `output/hunts/45_142_212_31/`:JSON 报告、CSV IOC 列表、MISP 事件、STIX 2.1 包、Sigma 规则、Nuclei 模板。
### 报告 API
```
from adversary_intel.reporting import HuntReport, IOCExporter
from pathlib import Path
report = HuntReport(
hunt_id="HUNT-001",
seed="45.142.212.31",
seed_type="ip",
started_at="2026-06-14T00:00:00Z",
cluster_name="vpnplus.ru Operator Cluster",
)
report.add_ip("194.87.27.217", malicious=True, tags=["timeweb", "socradar"])
report.add_domain("vpnplus.ru", malicious=True, tags=["pivot-domain"])
report.add_cert_serial("80E5CABDF41B68E0BA718F4A1224EFA3", cn="invalid2.invalid")
exporter = IOCExporter(report)
paths = exporter.save_all(Path("./output/hunts/my_hunt"))
# 写入:report.json, iocs.csv, iocs_malicious.txt, misp_event.json, stix_bundle.json
```
## 测试
```
pytest tests/ -v
```
## 许可证
MIT
标签:AV绕过, FastAPI, GitHub, IP 地址批量处理, 图谱分析, 基础设施追踪, 威胁情报, 开发者工具, 攻击面测绘, 特征指纹, 特权检测, 网络测绘, 逆向工具