🌐 DarkPoolScanner – Analyse OSINT des Dark Pools

Un outil éducatif pour explorer les services cachés sur le réseau Tor via des techniques OSINT, en respectant une éthique stricte. Simulez le scraping de pages onion et l’analyse de données publiques.

Réalisé par Platon-y pour PCTamalou

⚠️ Attention : Cadre légal ⚠️

L’exploration des services onion via Tor est légale si elle se limite à des sites publics et non illicites. Toute tentative d’accès à des contenus illégaux ou d’exploitation non autorisée est un délit (articles 323-1 à 323-7 du Code pénal), passible de 7 ans de prison et 100 000 € d’amende. Ce tuto utilise des données simulées pour l’éducation. NE SCRAPEZ QUE DES SITES LÉGAUX ET AUTORISÉS.

Objectifs

Salut, Apache ! Ce projet vise à vous initier aux techniques OSINT appliquées au réseau Tor, en simulant l’analyse de services cachés (dark pools) de manière éthique. DarkPoolScanner est une démo statique qui montre comment scraper des pages onion publiques (ex. : moteurs de recherche comme Ahmia) et extraire des informations comme les liens ou les titres. L’objectif est éducatif : comprendre le deep web sans franchir les limites légales.

Pourquoi ce projet ? Pour démystifier le deep web et enseigner l’OSINT responsable.

À qui s’adresse-t-il ? Aux passionnés de cybersécurité, aux chercheurs, et aux curieux avertis, dans un cadre légal.

Théorie OSINT

L’OSINT, c’est comme être un détective cyber : tu collectes des indices publics sans laisser de traces. Sur Tor, ça veut dire explorer des sites onion légaux avec une éthique en béton.

Qu’est-ce que l’OSINT ? ℹ️Open-Source Intelligence : collecte de données publiques pour analyse.

L’OSINT (Open-Source Intelligence) récupère des données publiques pour construire un puzzle d’infos. Exemple : scraper le moteur Ahmia pour trouver des blogs onion, sans jamais toucher à des trucs louches comme les dark pools illégaux.

Réseau Tor ℹ️The Onion Router : réseau d’anonymisation via nœuds relais.

Tor, c’est ta cape d’invisibilité : il cache ton IP en faisant rebondir ta connexion via trois nœuds. Les sites onion (.onion) sont des services cachés, allant de bibliothèques libres à… des trucs qu’on ne touche pas. Ce tuto reste sur des sites clean comme Ahmia.

Méthodologie OSINT

Voici comment un Apache OSINT bosse sur le deep web :

  1. Identification des sources : Moteurs comme Ahmia, Torch, ou forums légaux (ex. : Reddit onion).
  2. Collecte passive : Scraper sans cliquer ni s’authentifier. Ex. : extraire les liens d’une page d’accueil.
  3. Analyse : Chercher des patterns (ex. : URLs admin, mots-clés). Exemple : un site avec “/login” peut indiquer une zone privée.
  4. Documentation : Sauvegarder tout avec horodatage. Ex. : captures d’écran via Tor Browser.

Outils complémentaires

Pour aller plus loin (toujours éthique) :

  • OnionScan : Vérifie les fuites de config des services onion.
  • Maltego : Dessine des graphes pour lier des données (ex. : URLs → domaines).
  • SpiderFoot : Automatise l’OSINT multi-source.

Légalité

En France, naviguer sur Tor est 100 % légal, mais scraper sans permission peut enfreindre les CGU d’un site, et toucher à des contenus illicites (ex. : marchés noirs) = jusqu’à 7 ans de taule. Ce tuto simule tout en local pour rester clean.

Spécifications

Caractéristiques techniques de DarkPoolScanner :

  • Plateforme : Navigateur web (Chrome, Firefox) avec Tor Browser configuré manuellement.
  • Technologies : HTML5, CSS3, JavaScript (ES6).
  • Fonctionnalités : Simulation de scraping de pages onion, extraction de liens et titres, visualisation en graphe, export JSON, rapport PDF.
  • Interface : Champ de saisie pour l’URL onion, sélection de profondeur et nœud Tor, bouton d’analyse, graphe de liens, logs d’activité.
  • Données : Mockées (simulées) pour rester statique.
  • Sécurité : Aucune requête réelle, respect des lois françaises.

Mise en œuvre

Étapes pour utiliser DarkPoolScanner :

Étape 1 : Installer Tor Browser

Téléchargez et installez Tor Browser depuis torproject.org. Lancez-le et configurez-le pour naviguer anonymement. Testez : accédez à Ahmia pour vérifier la connexion.

Étape 2 : Créer le fichier HTML

Utilisez ce fichier HTML comme base. Enregistrez-le sous darkpoolscanner.html dans votre répertoire de site statique. Testez : ouvrez-le dans un navigateur classique pour voir l’interface.

Étape 3 : Simuler le scraping

Entrez une URL onion fictive (ex. : http://example.onion), choisissez la profondeur et le nœud Tor, et cliquez sur « Analyser ». Le JavaScript simule le scraping et affiche un graphe des liens. Testez : les résultats (liens, titre, graphe) s’affichent.

Étape 4 : Générer un rapport

Cliquez sur « Générer un rapport OSINT » pour obtenir un PDF des résultats. Exportez en JSON pour une analyse hors ligne.

Interface Utilisateur

Console de scanning OSINT :

  • URL : Saisir une URL onion fictive.
  • Profondeur : Niveau de scan (1 à 3).
  • Nœud Tor : Simulation de connexion.
  • Analyse : Lancer le scan simulé.
  • Graphe : Visualisation des liens (clic pour détails).
ℹ️ URL onion valide (ex. : http://example.onion)
ℹ️ Profondeur du scan : surface (pages principales), profonds (liens secondaires), complet (tous niveaux).
ℹ️ Nœud Tor : point de connexion simulé dans le réseau Tor (entrée, relais, sortie).

Logs d’activité :

    Code

    Code JavaScript pour la simulation OSINT :

    const mockData = {
        "http://example.onion": {
            status: 200,
            title: "Exemple de Service Onion",
            description: "Blog anonyme sur la cybersécurité (EN)",
            links: ["http://example.onion/about", "http://example.onion/contact", "http://example.onion/blog"],
            metadata: { server: "Apache/2.4.41", lastModified: new Date().toLocaleDateString(), contentType: "text/html", size: "12.5 KB" },
            latency: 2000
        },
        "http://testnet.onion": {
            status: 200,
            title: "TestNet Archive",
            description: "Archive de documents publics (FR)",
            links: ["http://testnet.onion/docs", "http://testnet.onion/search", "http://testnet.onion/faq"],
            metadata: { server: "Nginx/1.18.0", lastModified: new Date(Date.now() - 86400000).toLocaleDateString(), contentType: "text/html", size: "8.2 KB" },
            latency: 3000
        },
        "http://securehub.onion": {
            status: 200,
            title: "SecureHub Forum",
            description: "Forum de discussion anonyme (EN)",
            links: ["http://securehub.onion/login", "http://securehub.onion/threads", "http://securehub.onion/profile"],
            metadata: { server: "LiteSpeed/6.0", lastModified: new Date().toLocaleDateString(), contentType: "text/html", size: "15.7 KB" },
            latency: 5000
        },
        "http://hiddenlib.onion": {
            status: 404,
            title: "Bibliothèque Cachée",
            description: "Page introuvable (ES)",
            links: [],
            metadata: { server: "Inconnu", lastModified: "N/A", contentType: "N/A", size: "0 KB" },
            latency: 7000,
            error: "404 - Page non trouvée"
        },
        "http://blocked.onion": {
            status: 403,
            title: "Service Bloqué",
            description: "Accès refusé par le nœud Tor (DE)",
            links: [],
            metadata: { server: "Inconnu", lastModified: "N/A", contentType: "N/A", size: "0 KB" },
            latency: 10000,
            error: "403 - Nœud Tor bloqué"
        }
    };
    
    const logs = [];
    function logAction(action) {
        const logEntry = \`[\${new Date().toISOString()}] \${action}\`;
        logs.push(logEntry);
        const logList = document.getElementById("log-list");
        if (logList) {
            logList.innerHTML = logs.map(log => \`
  • \${log}
  • \`).join(""); } } function showLoadingScreen() { console.log("Affichage loading screen"); document.getElementById("loading-screen").style.display = "flex"; } function hideLoadingScreen() { console.log("Masquage loading screen"); document.getElementById("loading-screen").style.display = "none"; } function detectSensitiveKeywords(links) { const sensitiveKeywords = ["admin", "login", "dashboard"]; links.forEach(link => { if (sensitiveKeywords.some(kw => link.includes(kw))) { logAction(\`Lien sensible détecté : \${link}\`); } }); } function analyzeOnion() { const urlInput = document.getElementById("onion-url").value; const scanDepth = parseInt(document.getElementById("scan-depth").value); const expertMode = document.getElementById("expert-mode").checked; const torNode = document.getElementById("tor-node").value; const resultsDiv = document.getElementById("results"); console.log("Démarrage analyse:", urlInput); const onionRegex = /^(http:\/\/|https:\/\/)[a-z2-7]{16,56}\.onion(\/.*)?$/; if (!onionRegex.test(urlInput)) { resultsDiv.innerHTML = \`

    Erreur : URL onion invalide. Format attendu : http://exemple56chars.onion

    \`; logAction(\`Erreur : URL invalide (\${urlInput})\`); return; } const siteData = mockData[urlInput] || { status: 503, title: "Service Inaccessible", description: "Timeout ou nœud Tor défaillant", links: [], metadata: { server: "Inconnu", lastModified: "N/A", contentType: "N/A", size: "0 KB" }, latency: 8000, error: "503 - Timeout réseau Tor" }; logAction(\`Scan de \${urlInput} (Profondeur \${scanDepth}, Nœud \${torNode})\`); showLoadingScreen(); setTimeout(() => { hideLoadingScreen(); if (siteData.error) { resultsDiv.innerHTML = \`

    \${siteData.error}

    \`; logAction(\`Erreur détectée : \${siteData.error}\`); drawLinkGraph([], urlInput); return; } let simulatedLinks = [...siteData.links]; let metadata = expertMode ? [ \`Server: \${siteData.metadata.server}\`, \`Last-Modified: \${siteData.metadata.lastModified}\`, \`Content-Type: \${siteData.metadata.contentType}\`, \`Size: \${siteData.metadata.size}\` ] : []; if (scanDepth >= 2) { simulatedLinks.push(\`\${urlInput}/login\`, \`\${urlInput}/dashboard\`); } if (scanDepth >= 3) { simulatedLinks.push(\`\${urlInput}/admin\`, \`\${urlInput}/users\`); } resultsDiv.innerHTML = \`

    Analyse de \${urlInput}

    Niveau \${scanDepth} | Nœud : \${torNode} | \${new Date().toLocaleString()}

    \`; const resultsContent = document.createElement("div"); resultsContent.className = "scan-results"; resultsContent.innerHTML = \`

    Statut : \${siteData.status} OK

    Titre : \${siteData.title}

    Description : \${siteData.description}

    Liens (\${simulatedLinks.length}) :

      \${simulatedLinks.map(link => \`
    • \${link} \${link.includes('admin') ? '[ADMIN]' : link.includes('login') ? '[AUTH]' : '[PAGE]'}
    • \`).join("")}
    \${expertMode ? \`

    Métadonnées :

      \${metadata.map(meta => \`
    • \${meta}
    • \`).join("")}
    \` : ""}

    Timeline :

    • \${new Date().toLocaleTimeString()} : Connexion au nœud \${torNode}
    • \${new Date().toLocaleTimeString()} : Scan de \${urlInput} (Niveau \${scanDepth})
    • \${new Date().toLocaleTimeString()} : \${simulatedLinks.length} liens détectés
    \`; resultsDiv.appendChild(resultsContent); resultsDiv.scrollTop = resultsDiv.scrollHeight; drawLinkGraph(simulatedLinks, urlInput); detectSensitiveKeywords(simulatedLinks); console.log("Analyse terminée:", urlInput); }, siteData.latency); } function drawLinkGraph(links, baseUrl) { console.log("Dessin graphe:", links); const canvas = document.getElementById('link-graph'); const ctx = canvas.getContext('2d'); ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = 'rgba(0, 0, 0, 0.3)'; ctx.fillRect(0, 0, canvas.width, canvas.height); const centerX = canvas.width / 2; const centerY = canvas.height / 2; const nodes = [{ x: centerX, y: centerY, label: 'Site', type: 'root' }]; if (links.length === 0) { ctx.fillStyle = 'var(--glow-white)'; ctx.font = '14px Courier New'; ctx.fillText('Aucun lien trouvé', centerX - 50, centerY); return; } links.forEach((link, index) => { const angle = (index / links.length) * 2 * Math.PI; const nodeX = centerX + 120 * Math.cos(angle); const nodeY = centerY + 120 * Math.sin(angle); const type = link.includes('admin') ? 'admin' : link.includes('login') ? 'auth' : 'page'; nodes.push({ x: nodeX, y: nodeY, label: link.split('/').pop(), type }); ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.lineTo(nodeX, nodeY); ctx.strokeStyle = 'var(--neon-cyan)'; ctx.lineWidth = 2; ctx.stroke(); ctx.beginPath(); ctx.arc(nodeX, nodeY, type === 'admin' ? 15 : 12, 0, 2 * Math.PI); ctx.fillStyle = type === 'admin' ? 'var(--alert-red)' : type === 'auth' ? 'var(--deep-violet)' : 'var(--tor-green)'; ctx.fill(); ctx.strokeStyle = 'var(--glow-white)'; ctx.stroke(); ctx.fillStyle = 'var(--glow-white)'; ctx.font = '12px Courier New'; ctx.fillText(link.split('/').pop(), nodeX - 25, nodeY + 20); }); ctx.beginPath(); ctx.arc(centerX, centerY, 15, 0, 2 * Math.PI); ctx.fillStyle = 'var(--tor-green)'; ctx.fill(); ctx.strokeStyle = 'var(--glow-white)'; ctx.stroke(); ctx.fillStyle = 'var(--glow-white)'; ctx.font = '14px Courier New'; ctx.fillText('Site', centerX - 15, centerY + 5); canvas.onclick = (event) => { const rect = canvas.getBoundingClientRect(); const x = event.clientX - rect.left; const y = event.clientY - rect.top; nodes.forEach(node => { const distance = Math.sqrt((x - node.x) ** 2 + (y - node.y) ** 2); if (distance < 15) { alert(\`Nœud : \${node.label} (\${node.type.toUpperCase()})\`); } }); }; console.log("Graphe dessiné"); } function generateReport() { console.log("Génération rapport"); const reportDiv = document.getElementById("report-output"); const currentDate = new Date(); const urlInput = document.getElementById("onion-url").value || "Non spécifiée"; reportDiv.style.display = "block"; reportDiv.innerHTML = \`

    Rapport OSINT Simulé - \${currentDate.toLocaleDateString()}

    Métadonnées

    • Date : \${currentDate.toLocaleString()}
    • URL : \${urlInput}
    • Outil : DarkPoolScanner (simulation)
    • Profondeur : Niveau \${document.getElementById("scan-depth").value}
    • Nœud Tor : \${document.getElementById("tor-node").value}

    Résultats

    Simulation de collecte OSINT. En conditions réelles :

    • Structure du site : pages principales, authentification.
    • Patterns : URLs sensibles (ex. : /admin).
    • Métadonnées : headers, dates, tailles.

    Recommandations

    1. Vérifier la légalité des actions.
    2. Documenter avec captures datées.
    3. Signaler tout contenu illicite.
    \`; logAction("Rapport OSINT généré"); } function printReport() { console.log("Export PDF"); const reportContent = document.getElementById("report-output"); const opt = { margin: 1, filename: \`darkpoolscanner_report_\${new Date().toISOString().replace(/[:.]/g, "-")}.pdf\`, image: { type: 'jpeg', quality: 0.98 }, html2canvas: { scale: 2 }, jsPDF: { unit: 'in', format: 'letter', orientation: 'portrait' } }; html2pdf().from(reportContent).set(opt).toPdf().get('pdf').then(pdf => { pdf.setProperties({ title: 'Rapport OSINT DarkPoolScanner' }); pdf.setFontSize(8); pdf.setTextColor(150); pdf.text('Simulation OSINT - À des fins éducatives', 0.5, pdf.internal.pageSize.height - 0.5); }).save(); logAction("Export PDF généré"); } function exportToJSON() { console.log("Export JSON"); const urlInput = document.getElementById("onion-url").value; const siteData = mockData[urlInput] || { status: 503, title: "Service Inaccessible", description: "Timeout ou nœud Tor défaillant", links: [], metadata: { server: "Inconnu", lastModified: "N/A", contentType: "N/A", size: "0 KB" } }; const exportData = { url: urlInput, date: new Date().toISOString(), results: siteData }; const blob = new Blob([JSON.stringify(exportData, null, 2)], { type: "application/json" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = \`darkpoolscanner_\${urlInput.replace(/[:/]/g, "_")}.json\`; a.click(); URL.revokeObjectURL(url); logAction(\`Export JSON pour \${urlInput}\`); } document.getElementById("menu-toggle").addEventListener("click", () => { console.log("Toggle menu"); document.querySelector("nav").classList.toggle("active"); });

    Explication : Le script utilise des données mockées pour simuler une page onion, affiche les résultats avec des métadonnées réalistes, et dessine un graphe interactif des liens.

    Sécurité & Légalité

    DarkPoolScanner est conçu pour être un bouclier éthique :

    • Anonymat : Tor Browser masque ton IP. Ne te connecte jamais à un site onion via un navigateur classique.
    • Légalité : OK pour visiter Ahmia ou des blogs publics, mais scraper sans autorisation peut violer les CGU, et les sites illicites sont un délit (articles 323-1 à 323-7).
    • Éthique : On simule ici avec des données mockées. En vrai, demande la permission du proprio du site.
    • Protection : Pas de téléchargements depuis des onions inconnus. Un antivirus comme ClamAV te couvre.

    Bonnes pratiques opérationnelles

    Pour OSINT comme un pro :

    • Isolation : Lance Tor dans une VM (ex. : VirtualBox avec Tails OS).
    • Protection d’identité : Crée un email jetable pour les recherches, jamais d’infos persos.
    • Journalisation : Note tout (ex. : “Visité Ahmia le 17/04/2025 à 14h”).
    • Conteneurisation : Utilise Docker pour tester des outils OSINT (ex. : Maltego en conteneur).

    Exemple : Si tu scrapes Ahmia sans permission, tu risques un ban. Avec autorisation, tu peux collecter des liens publics pour une étude. Teste dans un lab sécurisé !

    Recommandation : Va sur torproject.org et legifrance.gouv.fr pour les règles.

    Tests

    Tests pour valider DarkPoolScanner :

    1. Interface : Ouvre la page dans un navigateur et vérifie l’affichage (contenu, graphe, logs).
    2. Saisie : Entre une URL fictive (ex. : http://example.onion) et clique sur « Analyser ».
    3. Résultats : Vérifie que les données mockées (titre, liens, graphe, timeline) s’affichent.
    4. Erreur : Teste une URL invalide (ex. : http://test.com) pour le message d’erreur.
    5. Rapport : Génère un rapport PDF et vérifie son contenu.
    6. Export JSON : Vérifie le téléchargement du fichier JSON.
    7. Tor (optionnel) : Visite un site onion légal (ex. : Ahmia) via Tor Browser pour comparer.

    Avertissement : Ne teste que des sites légaux et publics.

    Bonus : OSINT Surface Web – Projet Simple

    Merci d’avoir suivi ce tuto, Apache ! DarkPoolScanner est une plongée dans le deep web, mais voici un projet plus simple : un Analyseur OSINT Surface Web. Il simule le scraping de sites publics (ex. : blogs, forums) pour extraire des liens, sans Tor ni risques légaux.

    Pourquoi ce projet ?

    Un moyen sûr d’apprendre l’OSINT, parfait pour les débutants ou les Apaches qui restent en surface.

    Spécifications

    • Technologies : HTML5, CSS3, JavaScript.
    • Fonctionnalités : Saisie d’une URL fictive, affichage de liens/titre mockés.
    • Sécurité : 100 % statique, aucun risque légal.

    Code

    Exemple de code JS pour l’analyseur surface web :

    const surfaceMock = {
        url: "https://example.com",
        title: "Exemple de Blog",
        links: [
            "https://example.com/about",
            "https://example.com/posts",
            "https://example.com/contact"
        ]
    };
    
    function analyzeSurface() {
        const resultsDiv = document.createElement("div");
        resultsDiv.className = "demo-output";
        document.body.appendChild(resultsDiv);
        
        resultsDiv.innerHTML = \`
            

    Titre de la page : \${surfaceMock.title}

    Liens trouvés :

      \${surfaceMock.links.map(link => \`
    • \${link}
    • \`).join("")}
    \`; }

    Sécurité

    Aucun risque : code statique avec données simulées. Respecte les CGU des sites réels si adapté.

    Résultats

    Un outil éducatif pour apprendre l’OSINT sans plonger dans le deep web. Testez-le et amusez-vous !

    CTF OSINT Immersif

    Prêt pour un défi, Apache ? Décode cette URL onion en base64 : aHR0cDovL2V4YW1wbGUub25pb24=. Ensuite, trouve l’URL cachée correspondant au regex /[a-z]{5}\\.onion/ dans les résultats d’analyse! Indice : utilise un décodeur en ligne ou base64.b64decode. 😈