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, 边缘计算, 隐私保护