v3nomtech/V3nom-Intel
GitHub: v3nomtech/V3nom-Intel
纯前端的威胁情报聚合仪表盘,无需后端即可在单一暗色界面中整合并可视化展示全球实时漏洞、恶意指标与安全新闻。
Stars: 1 | Forks: 0
# VENOM/INTEL
**签名:** `CYbErXV3nOm`
## 目录
- [它是什么](#what-it-is)
- [功能概览](#feature-tour)
- [实时数据源](#live-data-sources)
- [架构](#architecture)
- [工作原理 — 请求流程](#how-it-works--request-flow)
- [文件结构(每个文件的作用)](#file-map-what-every-file-does)
- [本地预览](#local-preview)
- [刷新本地快照](#refreshing-local-snapshots)
- [部署到 Netlify](#deploy-to-netlify)
- [CORS 的处理方式](#how-cors-is-handled)
- [缓存策略](#caching-strategy)
- [自定义](#customization)
- [隐私与法律声明](#privacy--legal)
- [技术栈](#tech-stack)
## 它是什么
VENOM/INTEL 是一个**静态威胁情报仪表盘**。它没有后端数据库,没有用户账户,也没有追踪。页面在浏览器中加载后,会调用一些公开的 API 和 RSS 订阅源,将响应标准化,并渲染:
- 最新的 CVE 及其 EPSS 漏洞利用概率评分
- CISA 已知被利用漏洞 (KEV) 目录
- 一个派生的**活跃漏洞利用追踪器**,使用 KEV ∩ EPSS ∩ 勒索软件使用情况来对“优先修补此漏洞”进行排名
- 一个动画版的**全球威胁地图**,在 Leaflet 地图上绘制活跃的 C2 服务器
- 最近的恶意软件 IOC、恶意 URL、活跃的僵尸网络 C2 IP
- 最近的公开数据泄露事件
- 汇总的信息安全新闻 + 漏洞利用发布订阅源
- 一个 **IOC 信誉查询**(粘贴 IP、域名、URL、哈希值或 CVE-ID)
- 一个精心策划的 OSINT 目录(值得关注的研究人员和组织)
- 实时图表:严重程度分布、随时间变化的 KEV、顶级供应商、恶意软件家族、按国家/地区划分的 C2、EPSS 前 15 名
所有内容每 15 分钟自动更新一次(也可以通过每个部分的刷新按钮或顶部的**全部刷新**按钮按需更新)。
## 功能概览
| 部分 | 展示内容 | 构建方式 |
|---|---|---|
| **Hero / 数据条** | 8 个实时计数器:CVE (7天)、KEV 总数、严重 (7天)、KEV (30天)、C2 国家/地区、活跃 IOC、活跃 C2、新闻 (24小时) | `updateStats()` + `countUp()` 缓出动画 |
| **🎯 活跃漏洞利用追踪器** | 通过优先级评分对每个 KEV CVE 进行排名:勒索软件 = +100,逾期 = +60,新鲜度 ≤ 30天 = +40,EPSS ≥ 0.5 = +30。标签可按勒索软件 / 逾期 / 新鲜 / 高 EPSS 筛选 | `buildExploitList()` 关联 KEV + EPSS,按得分排序 |
| **🌐 全球威胁地图** | Leaflet 深色切片地图 (CARTO)。按国家质心绘制 Feodo Tracker C2 IP。脉冲标记(低/中/高层级),实时攻击源(动画曲线弧),包含各国顶级恶意软件的弹窗 | `renderThreatMap()` + `COUNTRY_CENTROIDS` 查找表 + `curvedPath()` 贝塞尔辅助函数 |
| **快捷工具 — IOC 查询** | 粘贴 IPv4/v6、域名、URL、MD5/SHA1/SHA256 或 CVE-ID。自动检测类型,交叉比对内存中的威胁源,对 CVE 调用 CIRCL,对域名/IP 调用 URLhaus 主机 API | `IOC.detect()` + `IOC.lookup()` |
| **威胁指标图表** | CVE 严重程度甜甜圈图、按月统计的 KEV 条形图 (12个月)、顶级供应商、顶级恶意软件家族 (ThreatFox)、按国家/地区划分的 C2 | Chart.js 4 |
| **CISA KEV** | 所有 KEV 漏洞的可排序表格;包含筛选框 | `fetchKEV()` → 本地快照 → 实时 → 代理链 |
| **最新 CVE (NVD)** | 过去 7 天 NVD CVE 的卡片网格,带有 EPSS 徽章和产品标签。按严重程度和产品/供应商筛选 | `fetchCVEs()` + `enrichEPSS()` |
| **ThreatFox IOCs** | 来自 abuse.ch 的最新恶意软件 IOC | `fetchThreatFox()` |
| **URLhaus URLs** | 最近的恶意 URL(网络钓鱼、有效载荷分发、C2 面板),带有指向 VirusTotal 和 MalwareBazaar 的交叉检查链接 | `fetchURLhaus()` |
| **Feodo Tracker C2** | 活跃僵尸网络 C2 IP 表格(IP:端口、恶意软件家族、国家/地区、ASN、首次发现时间、状态) | `fetchFeodo()` |
| **最近的数据泄露** | XposedOrNot 泄露订阅源:名称、记录数、行业、日期 | `fetchBreaches()` |
| **信息安全新闻专线** | 汇总来自 Krebs、Bleeping、The Hacker News、SANS ISC、Dark Reading、The Register、Schneier 的 RSS | `fetchRssSet()` + `parseRss()` |
| **漏洞利用源** | Exploit-DB、PacketStorm、GitHub 安全公告 | 相同的 RSS 流水线 |
| **OSINT 目录** | 为 CISA、CERT-In、vx-underground、MalwareHunterTeam、Krebs、Beaumont、MSTIC、Google TAG 等精心制作的卡片,包含 X / 博客 / Nitter 链接 | `renderOsint()` 读取 `CONFIG.OSINT_ACCOUNTS` |
| **顶栏全局搜索** | 在一个框中搜索 CVE、KEV、新闻和漏洞利用 | `globalSearch()` |
| **JSON 导出** | ⬇ JSON 按钮将整个内存中的 `STATE` 快照转储以供下载 | `exportAll()` |
| **收藏 / 点赞** | CVE 卡片上的 ★ 会持久化到 `localStorage` | `getStars()` / `toggleStar()` |
| **状态胶囊 + 诊断面板** | 每个部分都有一个胶囊(加载中 / 正常 / 已缓存 / 错误)。点击 **显示诊断** 查看每个订阅源的时间线 | `setStatus()` + `renderDiagnostic()` |
## 实时数据源
所有来源均为公开,无需 API 密钥。
| 来源 | 提供的内容 | Endpoint |
|---|---|---|
| **NIST NVD** | 最新 CVE(7 天窗口) | `services.nvd.nist.gov/rest/json/cves/2.0` |
| **CISA KEV** | 已知被利用漏洞目录 | `cisa.gov/.../known_exploited_vulnerabilities.json` |
| **FIRST EPSS** | 漏洞利用预测评分系统 — CVE 在未来 30 天内被利用的概率 | `api.first.org/data/v1/epss` |
| **CIRCL CVE-Search** | CVE 详情查询(对 CORS 友好) | `cve.circl.lu/api/cve/...` |
| **URLhaus (abuse.ch)** | 恶意 URL | `urlhaus.abuse.ch/downloads/json_online/` |
| **ThreatFox (abuse.ch)** | 最近的恶意软件 IOC | `threatfox.abuse.ch/export/json/recent/` |
| **Feodo Tracker (abuse.ch)** | 活跃僵尸网络 C2 IP(Emotet、Dridex、TrickBot、QakBot 等) | `feodotracker.abuse.ch/downloads/ipblocklist.json` |
| **XposedOrNot** | 数据泄露目录 | `api.xposedornot.com/v1/breaches` |
| **RSS 订阅源** | 新闻和漏洞利用发布 | Krebs、Bleeping、THN、SANS、Dark Reading、Register、Schneier、Exploit-DB、PacketStorm、GitHub Advisories |
## 架构
```
┌─────────────────────────────────────────────────────────────────────┐
│ BROWSER (index.html) │
│ │
│ ┌─────────────────────────────────────────────────────────────┐ │
│ │ js/app.js (IIFE — single ~1670-line module) │ │
│ │ │ │
│ │ CONFIG ─── URLs, RSS list, OSINT accounts, TTLs │ │
│ │ STATE ─── { cves, kev, news, exploits, urlhaus, │ │
│ │ threatfox, feodo, breach, exploitItems } │ │
│ │ │ │
│ │ fetch layer: timedFetch → proxyFetch → cache │ │
│ │ render layer: renderXxx() + Chart.js + Leaflet │ │
│ │ orchestration: refreshAll() → critical path + onIdle() │ │
│ └─────────────────────────────────────────────────────────────┘ │
└────────────┬────────────────────────────────────────────────────────┘
│
┌─────────┼────────────────────────────────────────────┐
▼ ▼ ▼
[CORS-OK] [Same-origin snapshots] [Proxy chain]
NVD, EPSS, /data/kev.json 1. /.netlify/functions/proxy (whitelisted hosts)
CIRCL /data/feodo.json 2. api.allorigins.win/raw
/data/urlhaus.json 3. corsproxy.io
/data/threatfox.json 4. api.codetabs.com/v1/proxy
/data/breaches.json
(refreshed by update-data.sh)
```
本站在**运行时刻意保持零依赖**,仅引入了三个带有 SRI 哈希的 CDN 托管库:
- **Chart.js 4.4.1** — 所有图表
- **Leaflet 1.9.4** — 全球威胁地图
- **Google Fonts**(Inter + JetBrains Mono)— 排版
没有 npm install 步骤,没有打包工具,也没有框架。`js/app.js` 是一个独立的 IIFE。
## 工作原理 — 请求流程
当页面加载时,会运行 `init()`:
1. 设置年份 + 一个随机构建 ID。
2. 连接基于 IntersectionObserver 的滚动显示动画。
3. 启动 UTC 时钟。
4. 渲染 OSINT 卡片(同步执行,来自 `CONFIG.OSINT_ACCOUNTS`)。
5. 绑定事件(筛选器、搜索、刷新按钮、IOC 查询、星标切换)。
6. 调用 `refreshAll()`。
7. 安排 `refreshAll()` 每 15 分钟重新运行一次。
`refreshAll()` 是核心调度器:
```
// 1. Hydrate from localStorage cache (instant first paint)
['cves','kev','news','exploits','urlhaus','threatfox','feodo','breach']
.forEach(k => { const c = cache.get(k); if (c) STATE[k] = c; });
// 2. Re-render everything we have cached
// 3. Critical path (above-the-fold): KEV + Feodo + CVE in parallel
const critical = Promise.all([refreshKEV(), refreshFeodo(), refreshCVE()]);
// 4. Below-the-fold deferred to requestIdleCallback
onIdle(() => {
refreshNews(); refreshExploits();
refreshURLhaus(); refreshThreatFox(); refreshBreaches();
});
```
每个 `fetchXxx()` 都遵循三级回退机制(`tryLocalThenRemote()`):
1. **本地快照**(`data/*.json`)— 同源,无 CORS 问题,始终有效。
2. **直接请求远程** — 适用于对 CORS 友好的 endpoint(NVD、EPSS、CIRCL)。
3. **代理链**(`proxyFetch`)— 先尝试 Netlify 函数,然后依次尝试三个公开的 CORS 代理。
每次获取都通过 `timedFetch()` 进行包装,设置了 20 秒的 AbortController 超时时间,并且每个成功的响应都会被写入 `localStorage`,TTL(生存时间)为 30 分钟。诊断面板(快捷工具中的“显示诊断”按钮)显示每个订阅源的状态胶囊、来源(“实时” / “本地快照” / “实时(通过代理)” / “已缓存”)以及距上次更新的时间。
### 活跃漏洞利用追踪器评分
`buildExploitList()` 将 KEV 目录与来自 CVE 源的 EPSS 分数相结合,并计算每个漏洞的优先级分数:
```
score = 0
if knownRansomwareCampaignUse === "Known" → score += 100
if dueDate is past → score += 60
if dateAdded within last 30 days → score += 40
if EPSS >= 0.5 → score += 30 + round(epss * 30)
score += max(0, 30 - ageDays) // freshness boost
```
卡片按降序排序,并带有触发的标签标记(🦠 勒索软件,⏰ 逾期,🆕 新鲜,📈 EPSS%)。顶部的四个摘要卡片计算每个桶中的项目数量。
### 全球威胁地图
基于 Leaflet 和 CARTO 深色无标签切片集构建。`COUNTRY_CENTROIDS` 表将 ISO-2 国家代码映射到 `[lat, lon]` 质心。对于每个有活跃 C2 的国家:
- 分层放置一个脉冲式的 `divIcon` 以提供视觉心跳效果(CSS 动画,大小由 `sqrt(count)` 决定)。
- 一个可点击的 `circleMarker` 在其弹窗中显示数量、顶级恶意软件家族和 ASN 样本。
- “实时攻击源”侧边栏(`curvedPath()`)绘制从随机起点到 C2 endpoint 的动画弯曲贝塞尔弧线,并将每个事件前置添加到源中。
### IOC 信誉查询
`IOC.detect()` 是一个正则表达式交换机,用于对输入进行分类:
```
^[a-f0-9]{32}$ → md5
^[a-f0-9]{40}$ → sha1
^[a-f0-9]{64}$ → sha256
^\d{1,3}(\.\d{1,3}){3}$ → ipv4
^[a-fA-F0-9:]+$ with ":" → ipv6
^https?:// → url
^[\w.-]+\.[a-z]{2,}$ → domain
^CVE-\d{4}-\d{4,}$ → cve
```
然后 `IOC.lookup()`:
- 对于 CVE:直接访问 CIRCL CVE-Search(对 CORS 友好)。
- 对于其他所有内容:交叉引用内存中已加载的 URLhaus / ThreatFox / Feodo 数组(零成本本地匹配),然后通过 Netlify 代理向 URLhaus 主机 endpoint 发出实时的 POST 请求。
- 渲染一个判定卡片,以及指向 AbuseIPDB、VirusTotal、Shodan、OTX、urlscan.io、MalwareBazaar 等的快捷交叉检查链接。
## 文件结构(每个文件的作用)
```
threat-intel-site/
├── index.html # Single-page HTML shell
├── css/
│ └── style.css # ~1500 lines of dark-mode UI (CSS vars, no framework)
├── js/
│ └── app.js # ~1670 lines — all logic, all rendering
├── data/ # Same-origin JSON snapshots (CORS bypass)
│ ├── kev.json # CISA KEV catalog (~1.5 MB)
│ ├── feodo.json # Feodo Tracker C2 list (~2 KB)
│ ├── threatfox.json # Recent ThreatFox IOCs (~2 MB)
│ ├── urlhaus.json # Recent URLhaus URLs (~70 KB)
│ └── breaches.json # XposedOrNot breach catalog (~575 KB)
├── netlify/
│ └── functions/
│ └── proxy.js # Whitelisted CORS proxy (Netlify function)
├── netlify.toml # Netlify build + headers + cache rules
├── _redirects # SPA fallback (/* → /index.html 200)
├── update-data.sh # Cron-able script to refresh data/*.json
└── README.md # You are here
```
### `index.html`
HTML 外壳。约 420 行。定义了所有部分以及随后由 `js/app.js` 填充的每个空容器:
- `` 顶栏 — 品牌、全局搜索输入框、锚点导航、UTC 时钟、**全部刷新**、**⬇ JSON** 按钮。
- `` — 标题、标签胶囊、CTA 按钮、8 项数据条。
- `` — 活跃漏洞利用追踪器,包含摘要卡片、筛选标签、网格和 3 个图表。
- `` — Leaflet 容器、顶部攻击来源侧边栏、实时攻击源。
- `` — IOC 查询表单、诊断面板。
- `` — 5 个图表 canvas。
- `` — KEV 表格。
- `` — CVE 卡片网格 + 严重程度/产品筛选器。
- `` — URLhaus 网格。
- `` — Feodo Tracker 表格。
- `` — 数据泄露网格。
- `` — 新闻网格。
- `` — 漏洞利用源网格。
- `` — OSINT 目录网格(从 `CONFIG.OSINT_ACCOUNTS` 填充)。
- `` — 每个数据源的归属列表。
- `
标签:ESC4, OSINT, 多模态安全, 威胁情报, 安全仪表盘, 开发者工具, 数据可视化, 漏洞追踪, 静态网站