
Renseignement OSINT sur toute IP, domaine ou ASN
Si ce projet vous aide dans votre travail, soutenez la maintenance continue et les nouvelles fonctionnalités.
Portefeuille de don ETH
0x11282eE5726B3370c8B480e321b3B2aA13686582
Scannez le code QR ou copiez l'adresse du portefeuille ci-dessus.
Renseignement unifié sur les hôtes à travers 15 sources — Interrogez n'importe quelle IP, domaine ou ASN pour obtenir instantanément la posture de sécurité, les détails de l'infrastructure et les corrélations de menaces. Fonctionne entièrement sur le niveau gratuit de Cloudflare.
Disponible sur : swiy.co/seekyou``` $ curl "https://seekyou.seekyou.workers.dev/api/lookup?q=1.1.1.1"
{ "query": { "raw": "1.1.1.1", "type": "ip", "normalised": "1.1.1.1" }, "core": { "internetdb": { "status": "ok", "data": { "ports": [80,443], "vulns": [] } }, "geo": { "status": "cached", "data": { "country": "US", "org": "AS13335 Cloudflare" } }, "bgp": { "status": "ok", "data": { "name": "CLOUDFLARENET", "rir": "ARIN" } }, ... }, "meta": { "durationMs": 312, "cacheHits": 4, "sourcesQueried": 15, "sourcesFailed": 0 } }
## Captures d'écran
<div align="center">
### Page d'accueil
<img src="https://assets.kitploit.com/production/public/readmes/7467/e00ec4ba8b3e5460ae1e03360cf6540e58d92acc5522c8693445512b591fed29.png" alt="Page de résultats SeekYou" width="800" />
### Page de résultats
<img src="https://assets.kitploit.com/production/public/readmes/7467/09b165feca9927ad4cd50c3ebd28c72e09a0355d72b9ca14d795bf1d04448c92.png" alt="Page d'accueil SeekYou" width="800" />
### Démo
<a href="https://www.youtube.com/watch?v=b86tAUUqd34">
<img src="https://assets.kitploit.com/production/public/readmes/7467/8762e8b464816b9a69d929514441f8c7ee9f9ee9719f95b9c5e33ac1672575f8.jpg" alt="Démo SeekYou" width="800" />
</a>
</div>
---
## Table des matières
- [SeekYou](#seekyou)
- [Captures d'écran](#screenshots)
- [Page d'accueil](#landing-page)
- [Page de résultats](#results-page)
- [Démo](#demo)
- [Table des matières](#table-of-contents)
- [Ce que fait SeekYou](#what-seekyou-does)
- [Cas d'utilisation](#use-cases)
- [Politique d'utilisation licite](#lawful-use-policy)
- [Outils connexes](#related-tools)
- [Aperçu de l'architecture](#architecture-overview)
- [Modèle d'exécution](#execution-model)
- [Sources de données](#data-sources)
- [Structure du projet](#project-structure)
- [Décisions de conception clés](#key-design-decisions)
- [Edge-first, pas de Node.js](#edge-first-no-nodejs)
- [Exécution parallèle en couches](#layered-parallel-execution)
- [Dégradation gracieuse](#graceful-degradation)
- [Stockage fractionné D1 + KV](#split-d1--kv-storage)
- [Optimisation du niveau gratuit](#free-tier-optimization)
- [Écritures D1 en fire-and-forget](#fire-and-forget-d1-writes)
- [Stratégie de cache](#caching-strategy)
- [Limitation de débit](#rate-limiting)
- [Disjoncteurs](#circuit-breakers)
- [Rotation de clés — GrayHatWarfare](#key-rotation--grayhatwarfare)
- [Persistance D1](#d1-persistence)
- [Schéma (`schema.sql`)](#schema-schemasql)
- [Appliquer le schéma](#apply-schema)
- [Fonctions auxiliaires](#helper-functions)
- [Worker cron](#cron-worker)
- [Diff typé (`lib/diff.ts`)](#typed-diff-libdiffts)
- [Charge utile du webhook](#webhook-payload)
- [Configuration de développement](#development-setup)
- [Prérequis](#prerequisites)
- [Développement local](#local-development)
- [Créer des ressources Cloudflare (première fois)](#create-cloudflare-resources-first-time)
- [Déploiement](#deployment)
- [Construire et déployer](#build-and-deploy)
- [Configuration Wrangler (`wrangler.toml`)](#wrangler-configuration-wranglertoml)
- [Secrets et variables d'environnement](#secrets-and-environment-variables)
- [Secrets requis](#required-secrets)
- [`.env.example` (développement local uniquement)](#envexample-local-dev-only)
- [Licence](#license)
- [Auteur](#author)
- [Remerciements](#acknowledgments)
---
## Ce que fait SeekYou
SeekYou est un **outil de renseignement sur les hôtes** — collez une adresse IP, un nom de domaine ou un ASN et obtenez un rapport unifié couvrant :
| Catégorie | Ce que vous obtenez |
|---|---|
| Réseau | Ports ouverts, CPEs, préfixes BGP, upstreams, pairs, RIR |
| Identité | Enregistrement RDAP, contacts, bureau d'enregistrement, serveurs de noms |
| Géo | Pays, ville, FAI, indicateurs proxy / hébergement / mobile |
| Certificats | Historique crt.sh, SANs, chaîne d'émetteur |
| DNS | Enregistrements DNS passifs, DNS inversé/direct Robtex |
| Menaces | URLhaus, ThreatFox, MalwareBazaar, Feodo, SSLBL |
| CVE | Enrichissement NVD + CIRCL pour chaque ID CVE rapporté par InternetDB |
| Reconnaissance | Buckets exposés GrayHatWarfare, instantanés CDX Wayback |
Chaque source est interrogée en parallèle. Une source défaillante se dégrade en un badge « indisponible » — elle ne casse jamais la page.
---
## Cas d'utilisation
**Opérations de sécurité** — Profiler rapidement les IP suspectes à partir des logs, corréler les IOCs, identifier les services exposés et les CVE, tracer les domaines malveillants.
**Opérations réseau** — Inspecter le routage BGP, les données d'allocation RDAP/WHOIS, les enregistrements DNS historiques, les changements de certificats SSL.
**Tests d'intrusion** — Énumérer les ports/services/CPE, découvrir les buckets exposés, les pages archivées, les sous-domaines et les relations ASN.
**Renseignement sur les menaces** — Vérifier l'infrastructure C2 contre cinq flux de menaces en une seule requête.
**Conformité et risque** — Profiler l'infrastructure des fournisseurs, détecter le stockage cloud exposé, identifier l'IT fantôme.
---
## Politique d'utilisation licite
SeekYou est conçu pour **la recherche en sécurité licite, les opérations réseau et le renseignement sur les menaces**. En utilisant cet outil, vous acceptez :
**Utilisations autorisées :**
- Opérations de sécurité et réponse aux incidents sur les réseaux que vous possédez ou que vous êtes autorisé à surveiller
- Recherche en renseignement sur les menaces et corrélation d'IOC
- Dépannage réseau et audit d'infrastructure au sein de votre organisation
- Tests d'intrusion avec autorisation écrite explicite de l'organisation cible
- Recherche académique et éducation en cybersécurité
- Audits de conformité et évaluations des risques fournisseurs avec autorisation appropriée
**Utilisations interdites :**
- Accès non autorisé, reconnaissance ou attaques contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation explicite de tester
- Harcèlement, traque ou violations de la vie privée contre des individus ou des organisations
- Faciliter des activités illégales, y compris la fraude, le vol d'identité ou la cybercriminalité
- Contourner les contrôles de sécurité ou les restrictions d'accès sans autorisation
- Violer les lois applicables, y compris le CFAA (États-Unis), le Computer Misuse Act (Royaume-Uni), le GDPR (UE), ou la législation équivalente dans votre juridiction
**Vos responsabilités :**
- Assurez-vous d'avoir l'autorisation appropriée avant d'interroger une infrastructure que vous ne possédez pas
- Respectez les limites de débit et n'abusez pas du service ou des sources de données en amont
- Conformez-vous à toutes les lois et réglementations applicables dans votre juridiction
- Utilisez les données de manière responsable et ne transformez pas les résultats en arme sans divulgation coordonnée
- Comprenez qu'interroger un hôte n'accorde pas la permission d'y accéder ou de l'exploiter
**Avertissement :**
L'auteur et les contributeurs déclinent toute responsabilité en cas d'utilisation abusive de cet outil. Les utilisateurs sont seuls responsables de s'assurer que leurs activités sont conformes aux lois applicables. Les données agrégées à partir de sources publiques peuvent être incomplètes, obsolètes ou inexactes — vérifiez toujours les résultats via des canaux faisant autorité avant d'agir.
Si vous découvrez une vulnérabilité via SeekYou, suivez les pratiques de divulgation responsable et informez la partie concernée avant toute divulgation publique.
---
## Outils connexes
SeekYou fait partie d'une boîte à outils de sécurité axée sur la confidentialité. Explorez l'ensemble de la suite :
| Outil | Description | URL en direct |
|---|---|---|
| **TimeSeal** | Service d'horodatage cryptographique — prouver l'existence d'un document à un moment précis sans révéler son contenu | [timeseal.online](https://timeseal.online) |
| **SanctumVault** | Coffre-fort crypté à connaissance nulle — chiffrement côté client pour le stockage de données sensibles | [sanctumvault.online](https://sanctumvault.online) |
| **GhostChat** | Messagerie cryptée éphémère — conversations autodestructrices sans logs serveur | [ghost-chat.pages.dev](https://ghost-chat.pages.dev) |
| **XMRProof** | Vérification de paiement Monero — générer des preuves cryptographiques de transactions XMR | [xmrproof.pages.dev](https://xmrproof.pages.dev) |
| **GhostReceipt** | Génération de reçus anonymes — créer des enregistrements de transactions vérifiables sans exposition d'identité | [ghostreceipt.pages.dev](https://ghostreceipt.pages.dev) |
| **SeekYou** | Aggrégateur de renseignements sur les hôtes — OSINT unifié sur 15 sources pour les IP, domaines et ASN | [seekyou.seekyou.workers.dev](https://seekyou.seekyou.workers.dev) |
| **HoneypotScan** | Service de détection de honeypots — identifier les systèmes leurres et éviter les faux positifs dans la recherche en sécurité | [honeypotscan.pages.dev](https://honeypotscan.pages.dev) |
Tous les outils fonctionnent sur le réseau edge de Cloudflare avec des principes de conception axés sur la confidentialité.
---
## Aperçu de l'architecture```
Browser / curl
│
▼
┌─────────────────────────────────────┐
│ Cloudflare Pages │
│ Next.js App Router (SSR) │
│ │
│ app/page.tsx search form │
│ app/host/[query]/page.tsx │
│ └─ streams /api/stream?q=… │
│ app/api/recent/route.ts │
│ └─ recent searches for homepage │
│ app/targets/page.tsx │
│ └─ monitoring dashboard │
│ app/api/targets/route.ts │
│ └─ saved targets CRUD │
│ returns riskScore + lastDiff │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ app/api/lookup/route.ts │
│ (Workers runtime via opennextjs) │
│ • input validation │
│ • per-IP rate limiting (KV) │
│ • ctx.waitUntil(recordSearch()) │
└──────────────┬──────────────────────┘
│ runLookup()
▼
┌─────────────────────────────────────┐
│ worker/lookup.ts — orchestrator │
│ 4-layer Promise.allSettled │
└──┬──────────────────────────────────┘
│
├─► Layer 1+2 (parallel, 12 sources):
│ InternetDB · IPinfo · RIPE stat · RDAP · crt.sh · HackerTarget · Robtex
│ URLhaus · ThreatFox · MalwareBazaar · Feodo · SSLBL
├─► Layer 3 (after L1): NVD CVE enrichment (only if vulns found, batched 10-at-a-time)
└─► Layer 4 (parallel): GrayHatWarfare · Wayback (domain queries only)
│
▼
┌──────────────────────┐ ┌──────────────────────┐
│ D1 │ │ KV │
│ source response cache│ │ rate limiting │
│ (TTL per source) │ │ circuit breakers │
│ searches │ │ concurrency counters │
│ saved_targets │ │ │
└──────────────────────┘ └──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ seekyou-cron (Worker) │
│ wrangler.cron.toml │
│ • hourly blocklist refresh │
│ • hourly saved-target re-query │
│ + typed diff (lib/diff.ts) │
│ + webhook on hasChanges │
└─────────────────────────────────────┘
Les couches 1 et 2 sont déclenchées simultanément (12 sources dans un seul Promise.allSettled). La couche 3 démarre après la fin de la couche 1 — les ID CVE d'InternetDB déclenchent l'enrichissement NVD, regroupés par lot de 10 pour éviter de surcharger l'API. La couche 4 s'exécute en parallèle avec la couche 3 mais uniquement pour les requêtes de domaine ; les IP/ASN l'ignorent complètement. Temps total écoulé ≈ max(Couche 1+2) + max(Couche 3+4).
Forcez l'actualisation de toute requête avec ?refresh=1 pour contourner le cache D1 et récupérer les données en direct de chaque source.
Feodo et SSLBL sont récupérés sous forme de listes de blocage en masse et actualisés toutes les heures par le worker cron — aucun appel upstream par requête.
SeekYou/ ├── app/ │ ├── page.tsx # Homepage — search form + recent searches │ ├── layout.tsx # Root layout │ ├── globals.css │ ├── about/ # About page │ ├── faq/ # FAQ page │ ├── targets/ │ │ └── page.tsx # /targets — monitoring dashboard (risk + diffs) │ ├── host/[query]/ │ │ └── page.tsx # SSR host report page (streams via /api/stream) │ ├── api/ │ │ ├── lookup/route.ts # GET /api/lookup?q=&refresh=1 │ │ ├── stream/route.ts # GET /api/stream?q= (SSE streaming) │ │ ├── recent/route.ts # GET /api/recent?limit=5 │ │ ├── batch/route.ts # POST /api/batch (multi-query) │ │ ├── targets/route.ts # GET /api/targets (+ riskScore, lastDiff) · POST │ │ ├── targets/[id]/route.ts # DELETE /api/targets/:id │ │ └── admin/reset-breaker/ # POST — manual circuit-breaker reset │ └── components/ │ ├── AnimatedTagline.tsx │ ├── Card.tsx │ ├── CopyButton.tsx │ ├── CveDrawer.tsx │ ├── DecryptedText.tsx │ ├── ExportButton.tsx # JSON export (client, zero backend) │ ├── Footer.tsx │ ├── RecentSearches.tsx # Recent queries from D1 (client) │ ├── RiskBadge.tsx # Risk score pill with breakdown tooltip │ ├── SaveButton.tsx # Save/unsave target │ ├── ScrollProgress.tsx │ ├── ShareButton.tsx │ ├── VulnsStream.tsx # Streaming CVE results │ └── ui/ # Shared UI primitives ├── worker/ │ ├── lookup.ts # 4-layer orchestrator │ ├── cron.ts # Hourly blocklist refresh + target sweep w/ typed diff │ ├── index.ts │ └── sources/ │ ├── internetdb.ts │ ├── ipapi.ts │ ├── bgpview.ts │ ├── rdap.ts │ ├── crtsh.ts │ ├── passivedns.ts │ ├── robtex.ts │ ├── abusech.ts # URLhaus + ThreatFox + MalwareBazaar │ ├── nvd.ts # NVD + CIRCL CVE enrichment │ ├── osv.ts # OSV.dev re-export (via nvd.ts) │ ├── grayhatwarfare.ts │ └── wayback.ts ├── lib/ │ ├── types.ts # All TypeScript interfaces │ ├── cache.ts # D1 cache wrapper (cacheGet/cachePut, bypass on forceRefresh) │ ├── config.ts # All magic numbers: TTLs, timeouts, limits │ ├── diff.ts # TargetDiff — typed change detection between snapshots │ ├── errors.ts # Unified error format + ErrorCode enum │ ├── hooks.ts # Shared React hooks │ ├── keyring.ts # GHW 18-key rotation │ ├── logger.ts # Structured logging │ ├── merge.ts # Result merging │ ├── normalize.ts # Threat indicator normalization │ ├── ratelimit.ts # KV-based per-IP rate limiter + circuit breakers │ ├── results.ts # SourceResult helpers │ ├── risk.ts # computeRiskScore — scored 0–100 with breakdown │ ├── searches.ts # D1 helpers: recordSearch, getRecentSearches │ ├── targets.ts # D1 helpers: saveTarget, listTargets, removeTarget │ ├── textAnimation.ts # Text animation utility │ ├── useHostStream.ts # SSE streaming hook for host results │ ├── validate.ts # Query parsing (IPv4/v6/domain/ASN) │ └── utils.ts ├── test/ │ ├── cache.test.ts │ ├── diff.test.ts # Tests for diffHostResults + summariseDiff │ ├── keyring.test.ts │ ├── logger.test.ts │ ├── merge.test.ts │ ├── normalize.test.ts │ ├── results.test.ts │ ├── risk.test.ts │ ├── validate.test.ts │ └── sources/ ├── docs/ │ ├── ROADMAP.md │ ├── Spec.md │ └── LICENSE.md ├── public/ │ └── publiceth.svg # Donation QR code ├── schema.sql # D1 schema (apply with wrangler d1 execute) ├── wrangler.toml # Pages build config (KV + D1 bindings) ├── wrangler.cron.toml # Cron worker config (separate deploy) ├── next.config.ts ├── open-next.config.ts └── vitest.config.ts
## Décisions de conception clés
### Edge-first, pas de Node.js
Exécution des workers via `@opennextjs/cloudflare` — pas besoin d'export `runtime = 'edge'`. API Web pures partout. Démarrages à froid sous 50 ms à l'échelle mondiale.
### Exécution parallèle en couches
Les couches 1+2 se déclenchent ensemble (12 sources). La couche 3 (enrichissement CVE) ne s'exécute que si InternetDB trouve des vulnérabilités, par lots de 10 à la fois. La couche 4 (GHW + Wayback) s'exécute en parallèle de la couche 3, mais est totalement ignorée pour les requêtes IP/ASN. Temps total ≈ source la plus lente dans chaque vague, pas la somme de toutes les sources.
### Dégradation gracieuse
Chaque source est encapsulée dans un circuit breaker + try/catch. Une source défaillante devient un badge `{ status: 'error' }`. La page s'affiche toujours.
### Stockage D1 et KV séparés
Les caches de réponse des sources résident dans **D1** (pas KV) — les valeurs sont écrites une fois, lues occasionnellement, et sont suffisamment grandes pour que le coût du quota d'écriture de KV s'accumule rapidement. **KV** est réservé exclusivement aux compteurs de chemin chaud : limitation de débit, circuit breakers, et suivi de concurrence en vol. Chaque source a son propre TTL (30 jours pour les CVE, 24h pour BGP/RDAP, 1h pour geo/ports de base, 30m pour abuse.ch). `?refresh=1` transmet `forceRefresh: true` à chaque récupérateur pour contourner le cache D1 à la demande.
### Optimisation pour le niveau gratuit
GrayHatWarfare a une rotation de 18 clés (1 800 req/jour). NVD utilise le regroupement de requêtes (10 max en concurrence). Feodo/SSLBL sont récupérés sous forme de listes groupées par le cron worker et mis en cache dans KV — zéro coût amont par requête.
### Écritures D1 de type 'fire-and-forget'
`recordSearch()` est appelée dans `ctx.waitUntil()` — cela n'ajoute aucune latence à la réponse API. Les écritures D1 se produisent après que la réponse a été vidée.
---
## Stratégie de mise en cache
Les réponses des sources sont mises en cache dans **D1** avec un TTL manuel appliqué via une colonne `expires_at`. KV n'est pas utilisé pour la mise en cache des réponses — il est réservé à la limitation de débit, aux circuit breakers, et aux compteurs de concurrence en vol où des incréments atomiques à faible latence sont importants.```typescript
// lib/cache.ts
export async function cacheGet<T>(
db: D1Database,
key: string,
bypass?: boolean, // true when ?refresh=1
): Promise<T | null>
export async function cachePut<T>(
db: D1Database,
key: string,
value: T,
ttl: number, // seconds
): Promise<void>
Cache keys follow the pattern source:normalised_query — e.g. internetdb:1.1.1.1, crtsh:example.com.
TTLs par source (from lib/cache.ts) :
Les erreurs ne sont jamais mises en cache — un échec de récupération relance toujours la requête suivante. Les lignes expirées sont renvoyées comme un échec et écrasées paresseusement ; aucun nettoyage en arrière-plan n'est nécessaire.
Fenêtre glissante basée sur KV : 100 requêtes par IP par heure. Implémenté dans lib/ratelimit.ts, appliqué dans app/api/lookup/route.ts avant que toute recherche ne soit exécutée.
Les en-têtes de limitation de débit sont renvoyés sur chaque réponse :``` X-RateLimit-Limit: 100 X-RateLimit-Remaining: 87 X-RateLimit-Reset: 1716912000
En cas d'épuisement, l'API renvoie `429` avec `Retry-After`.
---
## Disjoncteurs
Chaque source possède un disjoncteur suivi dans KV. Si une source dépasse **50% de taux d'échec** dans une fenêtre de 5 minutes (minimum 4 requêtes), le disjoncteur s'ouvre et la source est ignorée (renvoie `{ status: 'skipped' }`) pendant **15 minutes**, puis se rétablit automatiquement.
L'état actuel de chaque disjoncteur est inclus dans `meta.circuitBreakers` dans chaque réponse API.
Pour réinitialiser manuellement un disjoncteur en production :```bash
curl -X POST https://seekyou.seekyou.workers.dev/api/admin/reset-breaker \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"source": "nvd"}'
GrayHatWarfare autorise 100 requêtes/jour par clé API. SeekYou alterne entre jusqu'à 18 clés pour un total effectif de 1 800 requêtes/jour :```typescript // lib/keyring.ts — round-robin across keys with remaining quota const key = await keyRing.next(env, 'GRAYHATWARFARE_API_KEY')
Les clés sont nommées `GRAYHATWARFARE_API_KEY_1` à `GRAYHATWARFARE_API_KEY_18` et stockées en tant que secrets Wrangler.
---
## Persistance D1
### Schéma (`schema.sql`)```sql
CREATE TABLE IF NOT EXISTS searches (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
query TEXT NOT NULL,
query_type TEXT NOT NULL CHECK (query_type IN ('ip','domain','asn')),
result_json TEXT NOT NULL,
duration_ms INTEGER,
created_at INTEGER NOT NULL DEFAULT (unixepoch())
);
CREATE INDEX IF NOT EXISTS idx_searches_query
ON searches (query, created_at DESC);
CREATE TABLE IF NOT EXISTS saved_targets (
id TEXT PRIMARY KEY DEFAULT (lower(hex(randomblob(8)))),
query TEXT NOT NULL UNIQUE,
label TEXT,
notes TEXT,
result_json TEXT, -- snapshot of last cron lookup
checked_at INTEGER, -- unix seconds — when cron last re-queried
created_at INTEGER NOT NULL DEFAULT (unixepoch())
);
CREATE INDEX IF NOT EXISTS idx_saved_targets_created
ON saved_targets (created_at DESC);
wrangler d1 execute seekyou --file=schema.sql
### Fonctions utilitaires
**`lib/searches.ts`** — historique de recherche :```typescript
// Write a search row (fire-and-forget safe)
await recordSearch(db, query, queryType, resultJson, durationMs)
// Read last N distinct queries for the homepage (default 5)
const recent = await getRecentSearches(db, 5)
// → [{ query: '1.1.1.1', query_type: 'ip', created_at: 1716912000 }, ...]
lib/targets.ts — cibles sauvegardées :```typescript
// Upsert a target (idempotent on query)
const id = await saveTarget(db, query, label, notes)
// List all saved targets const targets = await listTargets(db)
// Remove by id await removeTarget(db, id)
// Fetch one (used by cron before re-querying) const target = await getTarget(db, id)
// Write latest snapshot after cron re-query await updateTargetSnapshot(db, id, resultJson)
---
## Worker Cron
Un Worker autonome (`worker/cron.ts`) est déployé séparément via `wrangler.cron.toml`. Il s'exécute sur une **déclencheur horaire** et effectue deux tâches :
1. **Rafraîchissement des listes de blocage** — vérifie si les listes groupées Feodo/SSLBL sont obsolètes et les télécharge à nouveau si nécessaire.
2. **Balayage des cibles sauvegardées** — interroge à nouveau chaque cible sauvegardée, calcule un `TargetDiff` typé, persiste l'instantané frais dans D1 et envoie une charge utile webhook par POST lorsque des modifications sont détectées.
### Différence typée (`lib/diff.ts`)
Après chaque nouvelle interrogation, `diffHostResults(prev, next)` produit un `TargetDiff` structuré couvrant :
| Signal | Ce qu'il détecte |
|---|---|
| `ports` | Ports ouverts / fermés (direction par port) |
| `cves` | CVE apparues / résolues, avec sévérité et score CVSS |
| `threats` | Modifications des flux URLhaus, Feodo, SSLBL, ThreatFox |
| `geo` | Changements de pays, d'ASN ou de nom d'hôte principal |
| `certExpiry` | Certificats expirant dans les 30 jours ou récemment expirés (se déclenche une fois par certificat) |
| `risk` | Delta du score de risque — n'apparaît dans `hasChanges` que lorsque Δ ≥ 5 points |
`summariseDiff(diff, query)` convertit la structure en une chaîne lisible pour les logs et le relais webhook.
### Charge utile webhook
Lorsque `diff.hasChanges` est vrai et que `WEBHOOK_URL` est défini, le cron envoie par POST :```json
{
"sentAt": 1716912000,
"events": [
{
"targetId": "abc123",
"query": "1.2.3.4",
"checkedAt": 1716912000,
"summary": "1.2.3.4:\n port 3389 opened\n CVE-2021-44228 appeared [CRITICAL 10]",
"diff": {
"diffedAt": 1716912000,
"hasChanges": true,
"ports": [{ "port": 3389, "direction": "opened" }],
"cves": [{ "id": "CVE-2021-44228", "direction": "appeared", "severity": "CRITICAL", "score": 10 }],
"threats": [],
"geo": [],
"certExpiry": [],
"risk": { "prev": 20, "next": 55, "delta": 35 }
}
}
]
}
Le champ diff est entièrement structuré — les consommateurs peuvent se brancher sur des types de changements spécifiques sans avoir à analyser des lignes de chaînes. Le champ summary est pré-formaté pour les relais Slack/Discord.
Déployez le worker cron :```bash wrangler deploy --config wrangler.cron.toml
Les secrets pour le worker cron sont définis séparément :```bash
wrangler secret put NVD_KEY --config wrangler.cron.toml
wrangler secret put ABUSECH_KEY --config wrangler.cron.toml
wrangler secret put WEBHOOK_URL --config wrangler.cron.toml # optional — fires on any hasChanges
npm i -g wrangler)git clone https://github.com/Teycir/SeekYou cd SeekYou npm install
cp .env.example .env
npm run dev
L'application est disponible à l'adresse `http://localhost:3000`. En développement local, KV et D1 utilisent l'émulation locale basée sur SQLite de Wrangler — aucun accès au compte Cloudflare nécessaire pour les tests de base.
### Créer des ressources Cloudflare (première fois)```bash
# Create KV namespace — copy the ID into wrangler.toml
wrangler kv namespace create KV
# Create D1 database — copy the ID into wrangler.toml
wrangler d1 create seekyou
# Apply schema
wrangler d1 execute seekyou --file=schema.sql
bash scripts/deploy.sh
Le script exécute `opennextjs-cloudflare build`, prépare le répertoire de sortie Pages, et appelle `wrangler pages deploy .open-next`. **Ne pas** utiliser `npm run deploy` ou `wrangler deploy` seul — ces commandes ciblent le runtime Workers (non Pages) et échoueront.
Pour déployer le worker cron séparément :```bash
wrangler deploy --config wrangler.cron.toml
wrangler.toml)```tomlname = "seekyou" pages_build_output_dir = ".open-next" compatibility_date = "2025-05-01" compatibility_flags = ["nodejs_compat"]
[[kv_namespaces]] binding = "KV" id = ""
[[d1_databases]] binding = "DB" database_name = "seekyou" database_id = ""
---
## Secrets et variables d'environnement
Tous les secrets sont stockés en tant que secrets Wrangler — jamais dans le code source ou .env.
### Secrets requis```bash
wrangler secret put NVD_KEY # NVD API key (optional — higher rate limits)
wrangler secret put ABUSECH_KEY # abuse.ch API key (URLhaus/ThreatFox/MalwareBazaar)
wrangler secret put ADMIN_TOKEN # Bearer token for /api/admin/* endpoints
# GrayHatWarfare — repeat for each key you have (1–18)
wrangler secret put GRAYHATWARFARE_API_KEY_1
wrangler secret put GRAYHATWARFARE_API_KEY_2
# ... up to GRAYHATWARFARE_API_KEY_18
.env.example (uniquement pour le développement local)```bashNVD_KEY=your_nvd_key_here ABUSECH_KEY=your_abusech_key_here ADMIN_TOKEN=change_me GRAYHATWARFARE_API_KEY_1=your_ghw_key_here
> **Note de sécurité :** Ne jamais commiter `.env`. Il est dans `.gitignore`. Si des secrets ont été commités, faites tourner toutes les clés et nettoyez l'historique git avec BFG (`bfg --delete-files .env`).
---
## Licence
**Business Source License 1.1 (BSL)**
Copyright © 2026 Teycir Ben Soltane <[email protected]>
Autorisé : usage personnel, recherche, éducation, projets non commerciaux, outils internes d'entreprise.
Restreint : offres SaaS commerciales, revente en tant que service, produits concurrents.
Après 4 ans à compter de la date de publication, ce logiciel passe sous licence Apache 2.0.
Voir [docs/LICENSE.md](https://github.com/teycir/seekyou/blob/master/docs/LICENSE.md) pour les conditions complètes.
---
## Auteur
**Teycir Ben Soltane**
Email: [email protected]
GitHub: [@Teycir](https://github.com/Teycir)
---
## Remerciements
- [InternetDB](https://internetdb.shodan.io) (Shodan)
- [IPinfo](https://ipinfo.io)
- [RIPE stat](https://stat.ripe.net)
- [RDAP](https://rdap.org)
- [crt.sh](https://crt.sh)
- [HackerTarget](https://hackertarget.com)
- [Robtex](https://www.robtex.com)
- [abuse.ch](https://abuse.ch) — URLhaus, ThreatFox, MalwareBazaar, Feodo, SSLBL
- [NVD](https://nvd.nist.gov) (NIST)
- [CIRCL](https://www.circl.lu/services/cve-search/)
- [OSV.dev](https://osv.dev)
- [GrayHatWarfare](https://grayhatwarfare.com)
- [Internet Archive](https://web.archive.org) (Wayback Machine)
---
## 🌐 Projets connexes
Découvrez d'autres outils axés sur la confidentialité et la sécurité :
### Confidentialité et chiffrement
- **[Timeseal](https://github.com/Teycir/Timeseal)** - Coffre de chiffrement à verrouillage temporel avec Dead Man's Switch. Cryptographie AES-256 à clé fractionnée, sceaux éphémères.
- **[Sanctum](https://github.com/Teycir/Sanctum)** - Coffre chiffré zero-trust avec déni plausible cryptographique. XChaCha20-Poly1305, Argon2id.
- **[GhostChat](https://github.com/Teycir/GhostChat)** - Véritable chat chiffré P2P via WebRTC. Aucun serveur, aucun stockage, messages autodestructeurs.
- **[xmrproof](https://github.com/Teycir/xmrproof)** - Vérification de paiement Monero, 100 % côté client.
- **[GhostReceipt](https://github.com/Teycir/GhostReceipt)** - Génération de reçus anonymes avec preuves à connaissance nulle.
### Outils de sécurité
- **[BurpAPISecuritySuite](https://github.com/Teycir/BurpAPISecuritySuite)** - Extension Burp Suite pour les tests de sécurité d'API. 15 types d'attaques, 108+ payloads, détection BOLA/IDOR.
- **[Mcpwn](https://github.com/Teycir/Mcpwn)** - Scanner de sécurité automatisé pour les serveurs Model Context Protocol. Détecte RCE, path traversal, injection de prompt.
- **[DiffCatcher](https://github.com/Teycir/DiffCatcher)** - Découverte de dépôts Git, capture de diff, extraction d'éléments de code.
- **[HoneypotScan](https://github.com/Teycir/HoneypotScan)** - Service de détection de honeypots pour la recherche en sécurité.
- **[CheckAPI](https://github.com/Teycir/CheckAPI)** - Validateur de clés API LLM pour plusieurs fournisseurs. Validation axée sur la confidentialité, côté client.
### Serveurs de sécurité MCP
- **[burp-mcp-server](https://github.com/Teycir/burp-mcp-server)** - Serveur MCP pour Burp Suite Professional. Scan de vulnérabilités via des assistants IA.
- **[nuclei-mcp](https://github.com/Teycir/nuclei-mcp)** - Serveur MCP pour Nuclei. Scan multi-cibles, filtrage par sévérité.
- **[nmap-mcp](https://github.com/Teycir/nmap-mcp)** - Serveur MCP pour Nmap. Reconnaissance furtive, scan de vulnérabilités/NSE.
- **[frida-mcp](https://github.com/Teycir/frida-mcp)** - Serveur MCP pour Frida. Instrumentation dynamique, contournement du SSL pinning.
---
## 💼 Services proposés
- 🔒 **Développement axé sur la confidentialité** - Applications P2P, communication chiffrée, systèmes à connaissance nulle
- 🚀 **Développement d'applications web** - Développement full-stack avec Next.js, React, TypeScript
- 🔧 **Solutions Edge Computing** - Cloudflare Workers, Pages, D1, KV, Durable Objects
- 🛡️ **Développement d'outils de sécurité** - Extensions Burp, outils de test d'intrusion, frameworks d'automatisation
- 🤖 **Intégration IA** - Applications basées sur LLM, automatisation intelligente, solutions IA personnalisées
- 🔍 **OSINT et Threat Intelligence** - Outils de reconnaissance personnalisés, agrégation de flux de menaces, corrélation d'IOC
**Contactez-moi** : [teycirbensoltane.tn](https://teycirbensoltane.tn) | Disponible pour des projets freelance et du conseil
---
<div align="center">
**Construit avec 💚 par [Teycir Ben Soltane](https://teycirbensoltane.tn)**
</div>
| Couche | Source | Ce qu'elle fournit | Authentification requise |
|---|
| 1 | InternetDB | Ports ouverts, CPE, ID CVE | Non |
| 1 | IPinfo | Géo, FAI, ASN, indicateur anycast | Non |
| 1 | RIPE stat | Préfixes BGP, titulaire ASN, RIR | Non |
| 1 | RDAP | Enregistrement, contacts, serveurs de noms, CIDR | Non |
| 2 | crt.sh | Historique des certificats, SAN, chaîne de l'émetteur | Non |
| 2 | HackerTarget | DNS passif — IP inversé et recherche d'hôte | Non |
| 2 | Robtex | DNS inverse/direct, info AS | Non |
| 2 | URLhaus | URL de distribution de malwares | ABUSECH_KEY |
| 2 | ThreatFox | Base de données IOC | ABUSECH_KEY |
| 2 | MalwareBazaar | Métadonnées d'échantillons de malwares | ABUSECH_KEY |
| 2 | Feodo Tracker | IP C2 de botnets | Non (téléchargement en masse) |
| 2 | SSLBL | Certificats SSL malveillants | Non (téléchargement en masse) |
| 3 | NVD + CIRCL | Détails CVE, scores CVSS v2/v3 | NVD_KEY (facultatif) |
| 4 | GrayHatWarfare | Buckets S3/Azure/GCS exposés | GRAYHATWARFARE_API_KEY_1..18 |
| 4 | Wayback | Instantanés CDX historiques | Non |
| Source(s) | TTL |
|---|
| CVE (NVD/CIRCL) | 30 jours |
| Wayback | 7 jours |
| BGP, RDAP, Robtex | 24 heures |
| crt.sh, HackerTarget passive DNS | 12 heures |
| GrayHatWarfare | 6 heures |
| InternetDB, IPinfo | 1 heure |
| Feodo, SSLBL (bulk) | 1 heure |
| URLhaus, ThreatFox, MalwareBazaar | 30 minutes |