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) ![status](https://img.shields.io/badge/feed-SANS%20ISC%20%2F%20DShield-00ff99?style=flat-square) ![stack](https://img.shields.io/badge/stack-Three.js%20r128%20%2B%20vanilla%20JS-4d9fff?style=flat-square) ![deps](https://img.shields.io/badge/build-none%20required-0a0f1a?style=flat-square) ## 功能介绍 - 🌍 **点阵地球仪** — 大陆由约一万个发光点渲染而成,这些点是在运行时通过点在多边形内测试(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, 后端开发, 威胁情报展示, 数据可视化