AlexPGAO/cybermap-attack-globe
GitHub: AlexPGAO/cybermap-attack-globe
一个基于Three.js构建的3D威胁地图,通过点阵地球仪和动画攻击弧线实时可视化SANS ISC/DShield蜜罐网络收集的全球攻击源数据。
Stars: 0 | Forks: 0
# CyberMap 攻击地球仪 🌐
一个使用 Three.js 构建的 3D 交互式威胁地图 —— 一个旋转的点阵地球仪,其动画攻击弧线由 **来自 SANS Internet Storm Center (DShield) 的真实攻击者数据** 驱动。纯粹的视觉享受,背后有着真实可靠的数据管道。
**在线演示:** [overnighthacker.com](https://overnighthacker.com) · **作者:** [AlexPGAO](https://github.com/AlexPGAO)



## 功能介绍
- 🌍 **点阵地球仪** — 大陆由约一万个发光点渲染而成,这些点是在运行时通过点在多边形内测试(point-in-polygon tests),利用手工构建的海岸线多边形生成的。不需要地图纹理,不需要外部资源,完全离线工作。
- 🔴 **真实的威胁源** — 通过 [SANS ISC API](https://isc.sans.edu/api/) 获取过去 24 小时内被报告次数最多的前 30 个攻击者 IP,使用 [GeoJS](https://www.geojs.io/) 对它们进行地理定位,并将它们绘制为脉冲式的红色标记。将鼠标悬停在标记上即可看到真实的 IP 及其报告次数。
- ⚡ **动画攻击弧线** — 大圆弧线(真正的球面插值,而非直线),带有发光的数据包头、渐隐的轨迹、发射时的闪光,以及在目的地扩张的冲击波纹。
- 🏷️ **实时端口标签** — 流量使用 ISC 上被扫描最频繁的端口进行标记,因此弧线会显示为 `445/SMB EXPLOIT` 或 `22/SSH BRUTE`,而不是虚构的分类。图例会根据实时数据自动重建。
- 📟 **侦察控制台 HUD** — 带有时间戳和 IP 的拦截日志、每分钟事件计数器、顶级威胁来源排行榜、CRT 扫描线等一应俱全。
- 🛟 **优雅降级** — 如果实时数据源无法访问,它会切换到带有明确标签的模拟流量,而不是直接崩溃。标题处的徽章会随时告诉你当前处于哪种模式。
## 真实数据免责声明
ISC/DShield 告诉你的是**谁在发起攻击**(由全球蜜罐传感器报告的真实 IP),而不是**他们在攻击谁**。因此,在这张地图上:
- ✅ 源标记、IP、报告次数和端口活动都是**真实的**
- ⚠️ 目的地中心和弧线路径是**示意性的** — 为了可视化效果,攻击会被绘制为指向主要的互联网中心
UI 中明确说明了这一点。如果某个威胁地图没有告诉你这一点,请对它保持怀疑。
## 运行方式
无需构建步骤,无需依赖,无需服务器逻辑。它仅仅是一个 HTML 文件。
```
git clone https://github.com/AlexPGAO/cybermap-attack-globe.git
cd cybermap-attack-globe
# 在 browser 中打开 index.html,或者将其 serve:
python3 -m http.server 8000
```
然后访问 `http://localhost:8000`。
**控制方式:** 拖动以旋转 · 滚动以缩放 · 悬停在标记上查看详情 · 点击 `[ PAUSE FEED ]` 冻结流量
## 如果实时数据源显示 "SIMULATED"
这通常意味着 ISC API 拦截了浏览器的跨域请求 (CORS)。解决方法是使用一个微型代理 — 如果你使用的是 Cloudflare,一个只需五行的 Worker 就能搞定:
```
export default {
async fetch(req) {
const url = new URL(req.url);
const upstream = await fetch('https://isc.sans.edu/api' + url.pathname + url.search);
const res = new Response(upstream.body, upstream);
res.headers.set('Access-Control-Allow-Origin', '*');
return res;
}
}
```
部署它,然后将 `ISC_IPS` 和 `ISC_PORTS` 常量指向你的 worker URL。GeoJS 本身就支持 CORS,因此地理定位不需要代理。
## 工作原理(有趣的部分)
**无需纹理的大陆。** 每块陆地都是由经纬度坐标组成的粗略多边形。加载时,脚本会在球体上遍历一个约 1.35° 的网格(经度步长根据 `1/cos(lat)` 放大,以使点密度在接近极点时保持均匀),对每块陆地运行射线法点在多边形内测试,并在碰到陆地的位置放置一个发光点。黑海是通过博斯普鲁斯海峡的一个多边形“钥匙孔”镂空出来的;哈德逊湾和里海则是作为明确的水域多边形被减去的。
**紧贴地球的弧线。** 每条弧线都是在源向量和目标向量之间通过球面线性插值 (slerp) 构建的,其离地高度与角距离成正比 — 短途跳跃保持低空,跨大陆的弧线则高耸入云。动画仅仅是 `setDrawRange()` 沿着预计算的点滑动一个窗口:成本低廉、平滑,且易于资源回收。
**数据管道。**
```
SANS ISC topips ──► strip zero-padded octets ──► GeoJS geolocation (batched ×6)
│
SANS ISC topports ──► port → label/color map ──► weighted attack spawner
│
arcs + log + leaderboard
```
数据源的权重根据 `√(report count)` 计算,因此最恶劣的攻击者会更频繁地出现,但又不会完全淹没其他数据。数据源每 15-30 分钟刷新一次,每个请求都有超时限制,任何失败都会回退到模拟模式,而不是显示空白屏幕。
## 技术栈
| 组成部分 | 选择 |
|---|---|
| 渲染 | Three.js r128 (WebGL) |
| 语言 | 原生 JS — 无框架,无打包工具 |
| 威胁数据 | [SANS Internet Storm Center / DShield API](https://isc.sans.edu/api/) |
| IP 地理定位 | [GeoJS](https://www.geojs.io/)(免费,无需密钥,启用 CORS)|
| 字体 | Share Tech Mono |
| 构建系统 | 无 — 它是一个单一的 HTML 文件 |
## 鸣谢
- 攻击数据由 [SANS Internet Storm Center](https://isc.sans.edu/) 和 DShield 传感器网络提供 — 可以考虑[贡献一个传感器](https://isc.sans.edu/howto.html)
- 地理定位由 [GeoJS](https://www.geojs.io/) 提供
- [OvernightHacker](https://overnighthacker.com) 项目家族的一部分,与 [ReconHound](https://github.com/AlexPGAO) 和 OSINT 工具目录同级
## 许可证
MIT — 随你怎么用,如果请注明出处则不胜感激。
标签:CMS安全, JavaScript, Three.js, 后端开发, 威胁情报展示, 数据可视化