Teycir/SeekOSINT

GitHub: Teycir/SeekOSINT

一款基于 Cloudflare 免费套餐的 OSINT 主机情报聚合工具,整合 16 个免费数据源,一次查询即可获取 IP、域名或 ASN 的网络、身份、威胁和漏洞等多维度信息。

Stars: 0 | Forks: 0

# SeekOSINT **在线地址:** https://seekosint.pages.dev ``` $ seek 1.1.1.1 ✓ internetdb 80, 443, 8080 open · 1 CVE ✓ geo Cloudflare · San Francisco · US · AS13335 ✓ bgp CLOUDFLARENET · ARIN · 4 upstreams ✓ rdap 1.1.1.0/24 · CLOUDFLARENET ✓ passivedns one.one.one.one (A, last 2024-06-01) ✓ urlhaus no results ✓ feodo not listed ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 12 sources queried · 8 cache hits · 340 ms ``` ## 目录 - [SeekOSINT](#seekosint) - [目录](#table-of-contents) - [Seek 的功能](#what-seek-does) - [架构概览](#architecture-overview) - [执行模型](#execution-model) - [数据源](#data-sources) - [项目结构](#project-structure) - [关键设计决策](#key-design-decisions) - [1. 边缘优先架构](#1-edge-first-architecture) - [2. 分层执行](#2-layered-execution) - [3. 优雅降级](#3-graceful-degradation) - [4. 激进的缓存策略](#4-aggressive-caching) - [5. 免费套餐优化](#5-free-tier-optimization) - [TypeScript 类型](#typescript-types) - [缓存策略](#caching-strategy) - [KV 缓存结构](#kv-cache-structure) - [缓存失效](#cache-invalidation) - [密钥轮换](#key-rotation) - [GrayHatWarfare (18 个密钥)](#grayhatwarfare-18-keys) - [D1 持久化](#d1-persistence) - [Schema](#schema) - [用法](#usage) - [开发设置](#development-setup) - [前置条件](#prerequisites) - [本地开发](#local-development) - [环境设置](#environment-setup) - [部署](#deployment) - [Cloudflare Pages](#cloudflare-pages) - [Wrangler 配置](#wrangler-configuration) - [运行测试](#running-tests) - [Cloudflare 免费套餐限制](#cloudflare-free-tier-limits) - [环境变量](#environment-variables) - [必填项](#required) - [可选项](#optional) - [许可证](#license) - [作者](#author) - [致谢](#acknowledgments) ## SeekOSINT 的功能 SeekOSINT 是一款**主机情报工具** —— 粘贴 IP 地址、域名或 ASN,即可获得一份涵盖以下内容的综合报告: | 类别 | 获取内容 | |---|---| | 网络 | 开放端口、CPE、BGP 前缀、上游、对等体、RIR | | 身份 | RDAP 注册信息、WHOIS 联系人、注册商、域名服务器 | | 地理位置 | 国家、城市、ISP、代理/托管/移动标志 | | 证书 | crt.sh 证书历史记录、SANs、颁发者链 | | DNS | 被动 DNS 记录、Robtex 反向/正向 DNS | | 威胁 | URLhaus、ThreatFox、MalwareBazaar、Feodo、SSLBL | | CVE | 针对 InternetDB 报告的每个 CVE ID 进行 NVD + CIRCL 富化 | | 侦察 | GrayHatWarfare 暴露的存储桶、Wayback CDX 快照 | 每个数据源均并行查询。失败或响应慢的数据源会降级显示为“数据源不可用”徽章 —— 绝不会导致页面崩溃。 ## 架构概览 ``` Browser / curl │ ▼ ┌─────────────────────────────────┐ │ Cloudflare Pages │ │ Next.js App Router (SSR) │ │ │ │ app/page.tsx ──search form──► │ │ app/host/[query]/page.tsx │ │ └─ fetches /api/lookup?q=… │ └────────────┬────────────────────┘ │ edge request ▼ ┌─────────────────────────────────┐ │ app/api/lookup/route.ts │ │ (Cloudflare Workers runtime) │ │ runtime = 'edge' │ └────────────┬────────────────────┘ │ runLookup() ▼ ┌─────────────────────────────────┐ │ worker/lookup.ts │ ◄─── orchestrator │ 4-layer Promise.allSettled │ └──┬──────┬──────┬────────────────┘ │ │ │ │ │ └─► Layer 4: GHW + Wayback │ └────────► Layer 3: CVE enrichment (conditional) └───────────────► Layers 1+2: 12 sources in parallel │ ▼ ┌─────────────────┐ ┌──────────────────┐ │ Cloudflare KV │ │ Cloudflare D1 │ │ (response cache)│ │ (search history) │ └─────────────────┘ └──────────────────┘ ``` ## 执行模型 第 1 层和第 2 层在单个 `Promise.allSettled` 批处理中**同时**运行。第 3 层和第 4 层在第 1 层处理完成后触发,因为它们依赖于第 1 层的输出(第 3 层需要来自 InternetDB 的 CVE ID;第 4 层需要查询类型)。 ## 数据源 | 层级 | 数据源 | 提供内容 | 免费套餐 | |---|---|---|---| | 1 | InternetDB | 开放端口、CPEs、CVE IDs | ✅ 无限制 | | 1 | IPinfo | 地理位置、ISP、ASN、托管/代理标志 | ✅ 5万次/月 | | 1 | BGPView | BGP 前缀、上游、对等体、RIR | ✅ 无限制 | | 1 | RDAP | 注册数据、联系人、域名服务器 | ✅ 无限制 | | 2 | crt.sh | 证书历史记录、SANs、颁发者链 | ✅ 无限制 | | 2 | PassiveDNS | 历史 DNS 记录 | ✅ 无限制 | | 2 | Robtex | 反向/正向 DNS | ✅ 无限制 | | 2 | URLhaus | 恶意软件分发 URL | ✅ 无限制 | | 2 | ThreatFox | IOC 数据库 | ✅ 无限制 | | 2 | MalwareBazaar | 恶意软件样本 | ✅ 无限制 | | 2 | Feodo Tracker | 僵尸网络 C2 追踪器 | ✅ 无限制 | | 2 | SSLBL | SSL 黑名单 | ✅ 无限制 | | 3 | NVD | CVE 详情、CVSS 评分 | ✅ 5次请求/30秒 | | 3 | CIRCL | CVE 富化 | ✅ 无限制 | | 4 | GrayHatWarfare | 暴露的 S3/Azure/GCS 存储桶 | ✅ 100次请求/天 | | 4 | Wayback | 历史快照 | ✅ 限速 | ## 项目结构 ``` seek/ ├── app/ │ ├── page.tsx # Landing page with search form │ ├── host/[query]/page.tsx # SSR host report page │ ├── api/lookup/route.ts # Edge API route │ └── layout.tsx # Root layout ├── worker/ │ ├── lookup.ts # Main orchestrator │ ├── sources/ # Individual source fetchers │ │ ├── internetdb.ts │ │ ├── ipinfo.ts │ │ ├── bgpview.ts │ │ ├── rdap.ts │ │ ├── crtsh.ts │ │ ├── passivedns.ts │ │ ├── robtex.ts │ │ ├── urlhaus.ts │ │ ├── threatfox.ts │ │ ├── malwarebazaar.ts │ │ ├── feodo.ts │ │ ├── sslbl.ts │ │ ├── nvd.ts │ │ ├── circl.ts │ │ ├── grayhatwarfare.ts │ │ └── wayback.ts │ ├── cache.ts # KV cache wrapper │ ├── db.ts # D1 search history │ └── types.ts # TypeScript types ├── components/ │ ├── SearchForm.tsx │ ├── HostReport.tsx │ └── SourceBadge.tsx ├── lib/ │ └── utils.ts └── public/ └── publiceth.svg # Donation QR code ``` ## 关键设计决策 ### 1. 边缘优先架构 - Next.js App Router 结合 `runtime = 'edge'` 实现低于 50ms 的冷启动 - Cloudflare Workers 运行时实现全球分发 - 无 Node.js 依赖 —— 纯 Web API ### 2. 分层执行 - 第 1 层:关键数据源(InternetDB、IPinfo、BGPView、RDAP) - 第 2 层:富化数据源(证书、DNS、威胁) - 第 3 层:CVE 富化(取决于第 1 层结果) - 第 4 层:侦察数据源(GHW、Wayback) ### 3. 优雅降级 - 每个数据源都包裹在 try/catch 中 - 超时机制可防止响应慢的数据源造成阻塞 - 失败的数据源显示“不可用”徽章 - 即使所有数据源都失败,页面也始终能渲染 ### 4. 激进的缓存策略 - 所有数据源均采用 24 小时 TTL 的 KV 缓存 - 缓存键包含数据源名称 + 查询内容 - 缓存命中可完全绕过外部 API 调用 - D1 存储搜索历史记录用于分析 ### 5. 免费套餐优化 - GrayHatWarfare:18 个密钥轮换(1,800 次请求/天) - NVD:请求批处理 + 调用间隔 6 秒 - Wayback:达到速率限制时进行指数退避 - IPinfo:每月 5 万次请求由所有用户共享 ## TypeScript 类型 ``` export interface LookupResult { query: string; queryType: 'ip' | 'domain' | 'asn'; timestamp: number; sources: SourceResult[]; cacheHits: number; totalTime: number; } export interface SourceResult { name: string; status: 'success' | 'error' | 'unavailable'; data?: any; error?: string; cached?: boolean; time?: number; } export interface Env { SEEK_CACHE: KVNamespace; SEEK_DB: D1Database; GRAYHATWARFARE_API_KEY_1: string; GRAYHATWARFARE_API_KEY_2: string; // ... 16 keys total NVD_API_KEY: string; ABUSECH_KEY: string; } ``` ## 缓存策略 ### KV 缓存结构 ``` const cacheKey = `${sourceName}:${query}`; const cachedData = await env.SEEK_CACHE.get(cacheKey, 'json'); if (cachedData) { return { ...cachedData, cached: true }; } const freshData = await fetchSource(query); await env.SEEK_CACHE.put(cacheKey, JSON.stringify(freshData), { expirationTtl: 86400 // 24 hours }); ``` ### 缓存失效 - 24 小时后自动过期 - 可通过 Cloudflare 仪表板手动清除 - 错误不缓存(始终重试) ## 密钥轮换 ### GrayHatWarfare (18 个密钥) ``` const keyIndex = Math.floor(Math.random() * 18) + 1; const apiKey = env[`GRAYHATWARFARE_API_KEY_${keyIndex}`]; const username = env[`GRAYHATWARFARE_USERNAME_${keyIndex}`]; ``` **日容量**:18 个密钥 × 100 次请求/天 = 1,800 次请求/天 ## D1 持久化 ### Schema ``` CREATE TABLE searches ( id INTEGER PRIMARY KEY AUTOINCREMENT, query TEXT NOT NULL, query_type TEXT NOT NULL, timestamp INTEGER NOT NULL, cache_hits INTEGER, total_time INTEGER ); CREATE INDEX idx_timestamp ON searches(timestamp); CREATE INDEX idx_query ON searches(query); ``` ### 用法 ``` await env.SEEK_DB.prepare( 'INSERT INTO searches (query, query_type, timestamp, cache_hits, total_time) VALUES (?, ?, ?, ?, ?)' ).bind(query, queryType, Date.now(), cacheHits, totalTime).run(); ``` ## 开发设置 ### 前置条件 - Node.js 18+ - Cloudflare 账户(免费套餐) - Wrangler CLI ### 本地开发 ``` # 安装依赖 npm install # 为本地 secrets 创建 .dev.vars cp .env .dev.vars # 运行 dev server npm run dev ``` ### 环境设置 ``` # 创建 KV namespace wrangler kv:namespace create SEEK_CACHE # 创建 D1 database wrangler d1 create seek-db wrangler d1 execute seek-db --file=schema.sql # 添加 secrets wrangler secret put GRAYHATWARFARE_API_KEY_1 wrangler secret put NVD_API_KEY wrangler secret put ABUSECH_KEY ``` ## 部署 ### Cloudflare Pages ``` # Build npm run build # Deploy wrangler pages deploy .next ``` ### Wrangler 配置 ``` name = "seek" compatibility_date = "2024-01-01" [[kv_namespaces]] binding = "SEEK_CACHE" id = "your-kv-id" [[d1_databases]] binding = "SEEK_DB" database_name = "seek-db" database_id = "your-d1-id" ``` ## 运行测试 ``` # Unit tests npm test # Integration tests (需要 .dev.vars) npm run test:integration # 测试特定 source npm test -- worker/sources/internetdb.test.ts ``` ## Cloudflare 免费套餐限制 | 服务 | 免费套餐 | Seek 使用量 | |---|---|---| | Pages | 500 次构建/月 | 约 10 次部署/月 | | Workers | 10万次请求/天 | 约 5千次请求/天 | | KV | 10万次读取/天 | 约 3千次读取/天 | | KV | 1千次写入/天 | 约 500 次写入/天 | | D1 | 500万行读取/天 | 约 5千行/天 | | D1 | 10万行写入/天 | 约 500 行/天 | **预估容量**:免费套餐每天可支持 5,000 次唯一查询 ## 环境变量 ### 必填项 ``` # GrayHatWarfare (16 个 key pairs) GRAYHATWARFARE_API_KEY_1=... GRAYHATWARFARE_USERNAME_1=... # ... 为 keys 2-16 重复此操作 # NVD API NVD_API_KEY=... # abuse.ch (URLhaus, ThreatFox, MalwareBazaar) ABUSECH_KEY=... ``` ### 可选项 ``` # IPinfo (默认为 free tier) IPINFO_TOKEN=... ``` ## 许可证 **商业源码许可证 1.1 (BSL)** 版权所有 © 2025 Teycir Ben Soltane 允许的用途: - 个人使用 - 研究与教育 - 非商业项目 - 内部业务工具 限制的用途: - 商业 SaaS 产品 - 作为服务转售 - 竞争性产品 自发布之日起 4 年后,本软件将转为 Apache 2.0 许可证。 完整条款请参见[许可证](LICENSE)。 ## 作者 **Teycir Ben Soltane** 电子邮件: teycir@pxdmail.net GitHub: [@Teycir](https://github.com/Teycir) ## 致谢 - InternetDB (Shodan) - IPinfo - BGPView - RDAP - crt.sh - PassiveDNS - Robtex - abuse.ch (URLhaus、ThreatFox、MalwareBazaar、Feodo、SSLBL) - NVD (NIST) - CIRCL - GrayHatWarfare - Internet Archive (Wayback Machine)
标签:API, ASN查询, BGP路由, Cloudflare, CVE, D1数据库, Edge Computing, ESC4, GitHub, IP查询, MITRE ATT&CK, OSINT, RDAP, TypeScript, Workers, 地理定位, 域名查询, 威胁情报, 安全插件, 实时处理, 开发者工具, 数字签名, 无线安全, 程序员工具, 网络安全, 自动化攻击, 被动DNS, 边缘计算, 隐私保护