
Agrège plus de 99 sources OSINT gratuites en parallèle, résout les entités dans un graphe de connaissances et exporte en STIX 2.1, MISP ou GraphML avec une analyse assistée par LLM.
Des créateurs de LazyOwn Redteam Framework arrive un agrégateur et moteur de corrélation de renseignement (OSINT) libre et open-source, inspiré des workflows de Palantir, Bellingcat, Maltego et Citizen Lab.
Une réinterprétation entièrement open-source de la chaîne d'outils originale fucklantir /
osint_palantir, avec un catalogue de sources bien plus vaste, un véritable graphe de connaissances, des parseurs structurés et un analyste LLM multi-backend.
Aucune charge utile. Aucun scan actif. Juste plus de 99 sources OSINT publiques et gratuites, déployées en parallèle et fusionnées en une seule image du renseignement.
+--------------------------+
query "example.com" | Estorides Orchestrator | -> STIX 2.1 bundle
---------------------> | - async fanout | -> MISP event JSON
| - 99+ free sources | -> GraphML for Gephi
| - structured parsers | -> JSONL for training
| - entity resolution |
| - knowledge graph |
| - ontology engine | <- OFAC SDN cross-check
| - MITRE ATT&CK mapper | <- technique auto-tagging
| - SSRF guard | <- blocklist at egress
| - audit log + RL | <- per-IP trail
| - multi-LLM analyst | <- BLUF / tactical / system
+--------------------------+
|
v
Web UI: map / graph / bundles / timeline / results
pip install estorides
estorides serve --port 5050
(Depuis une copie de travail, l'équivalent est python3 estorides_cli.py serve --port 5050
ou python3 -m estorides_cli serve --port 5050.)
Estorides est structuré autour de petits registres à responsabilité unique afin que l'ajout d'une nouvelle source, d'un backend, d'un inféreur ou d'un flux ne nécessite jamais de toucher à l'orchestrateur central. Les cinq surfaces de plug-in sont :
| Surface | Décorateur | Fichier | Utilisé pour |
|---|---|---|---|
| Analyseurs de sources | @register_parser("name") | estorides_core/parsers.py | Traduire le HTTP brut en dictionnaires structurés |
| Backends LLM | @register("name") | estorides_llm/manager.py | Ajouter un fournisseur LLM (ollama, openai, …) |
| Inféreurs de relations | @register_inferer("source") | estorides_core/relationship_inference.py | Source -> arêtes du graphe |
| Flux temps réel | sous-classe Feed | estorides_core/feeds.py | Couches cartographiques (séismes, incendies, actualités, aéronefs, satellites, lancements) |
| Exportateurs chiffrés | estorides_export.encryption | estorides_export/encryption.py | STIX/MISP + chiffrement age |
| Capacité | Original | Estorides |
|---|---|---|
| Nombre de sources OSINT gratuites | ~20 | 99 |
| Catégories de renseignement | 6 | 12 |
| Modèle de distribution HTTP | séquentiel | asynchrone |
| Réessais + backoff + disjoncteur | basique | oui |
| Cache de réponses (SQLite) | aucun | oui |
| Analyseurs par source | aucun | 50+ |
| Extraction d'entités (IP, domaine, CVE…) | regex uniquement | structurée + déduplication |
| Graphe de connaissances | aucun | NetworkX + GraphML |
| Export STIX 2.1 / MISP | aucun | oui |
| Multi-LLM (Ollama / OpenAI / Anthropic) | Ollama uniquement | 4 backends + stub |
| Carte (résultats de géolocalisation) | PyVista 3D | Leaflet 2D |
| Vue graphe force-directed | aucun | D3.js |
| Gestion des clés API | aucun | variables d'env par source |
| Prise en charge des sources payantes | aucun | opt-in par indicateur |
| Vérification croisée des sanctions OFAC SDN | aucun | moteur d'ontologie |
| Étiquetage automatique des techniques MITRE ATT&CK | aucun | ~40 techniques |
| Garde de sortie SSRF / réseau privé | aucun | RFC1918 + IMDS cloud bloqués |
| Journal d'audit (par requête, en ajout seul) | aucun | JSONL avec IP+requête+latence |
| Limite de débit par IP (fenêtre glissante) | aucun | 30/min par défaut, ajustable par env |
| Export chiffré (age) | aucun | opt-in via ?key=age1… |
| Couches de flux temps réel | aucun | séismes + incendies + actualités |
| Export chiffré (age) | aucun | opt-in via ?key=age1… |
| Capacité | v1.0 | v1.1 (cette version) |
|---|---|---|
| Graphe persistant (requêtes Cypher) | vidage NetworkX | BD embarquée Kùzu, jointures inter-exécutions |
| Persistance des exécutions | ajout JSONL | cas SQLite avec observations/entités en FK |
| Résolveur d'entités inter-flux | aucun | Wikidata + OFAC + IP-API + NVD via intel_resolver |
| Regroupement flou d'entités | déduplication exacte | difflib SequenceMatcher, seuil 0,85, alias exposés |
| Points de terminaison OSINT supplémentaires (sans clé) | 99 sources YAML | +7 (BGP, MAC, téléphone, GitHub, fuites, CISA KEV, C2 malware) |
| Point de terminaison Cypher en lecture seule | aucun | /api/intel/graph?q=... avec garde sur les mots-clés d'écriture |
| Interface d'historique des cas | aucun | onglet Cases + inspecteur d'entités complet |
Le moteur d'origine était un collecteur de données : un fan-out, des parseurs, un graphe, un LLM qui résume. Le sprint v1.4 introduit la couche information : chaque observation porte désormais un score de confiance ancré ; l'orchestrateur et les consommateurs en aval (moteur d'hypothèses, détection de changements, analyste LLM) cessent d'utiliser leurs propres heuristiques ad hoc et s'appuient sur cette source unique de vérité.