hsa555/IOC-Hunting

GitHub: hsa555/IOC-Hunting

Stars: 6 | Forks: 0

.·¨'`; ,.·´¨;\ ,. -, ,., ' .----------. '; ;'\ '; ;::\ ,.·'´, ,'\ ;´ '· ., / / ; ;::'\ ,' ;::'; ,·'´ .·´'´-·'´::::\' .´ .-, ';\ / ______.' ; ;::_';,. ,.' ;:::';° ; ';:::\::\::;:' / /:\:'; ;:'\' / /_ .' ,. -·~-·, ;:::'; ' \·. `·;:'-·'´ ,' ,'::::'\'; ;::'; / '''--. '; ;'\::::::::; '/::::; \:`·. '`·, ' ,.-·' '·~^*'´¨, ';::; '___ `. ; ';:;\;::-··; ;::::; `·:'`·, \' ':, ,·:²*´¨¯'`; ;::'; `'. | ':,.·´\;' ;' ,' :::/ ' ,.'-:;' ,·\ ,' / \::::::::'; ;::'; ) | \:::::\ \·.'::::; ,·'´ ,.·´:::'\ ,' ,'::::\·²*'´¨¯':,'\:; ......-' / \;:·´ \:\::'; \`*'´\::::::::;·'' \`¨\:::/ \::\' \ _..'` `·\;' \::::\:;:·´ '\::\;' '\;' ' '------''' ' '`*'´' `¨' # IOC Hunting **Made by hsa5** Outil de threat hunting en ligne de commande qui corrèle automatiquement plusieurs sources OSINT pour analyser des **IPs, URLs et hashes** malveillants. Toutes les sources utilisées sont gratuites. ## Fonctionnalités - **Deux modes d'analyse** : - **Mode IP / URL / Domaine** : corrélation multi-sources (AbuseIPDB · VirusTotal · Shodan · Censys · URLhaus · GreyNoise) - **Mode Hash** : analyse de fichiers via VirusTotal + URLhaus + MalwareBazaar (MD5, SHA1, SHA256) - **Auto-détection** du type de cible passé en argument (IPv4, IPv6, URL, domaine ou hash) - **Score de menace agrégé** (0–100) avec niveau FAIBLE / MODÉRÉ / ÉLEVÉ / CRITIQUE - **Analyse VirusTotal approfondie** : - Détections moteurs AV - Crowdsourced YARA Rules - Crowdsourced Sigma Rules - Crowdsourced IDS Rules - Dynamic Analysis - Sandbox Verdicts - Crowdsourced Context - Communicating Files & Referrer Files (mode IP) - **Ports ouverts et services** via Shodan (fallback InternetDB sans clé) et Censys - **GreyNoise** : détecte si une IP scanne activement internet - sans clé requise (plan communautaire) - **MalwareBazaar** : famille malware, tags comportementaux (`stealer`, `loader`, `ransomware`...), méthode de livraison et vendor intel sur les hashes - même clé qu'URLhaus - **Barre de progression** en bas du terminal lors de l'analyse de listes de cibles - **Hachage local de fichiers** : calcule le SHA256 de fichiers/répertoires locaux, puis les interroge - **Scan de répertoire** : si un répertoire est fourni à la place d'un fichier, tous les fichiers sont traités - **Cache des résultats** : évite de reconsommer du quota API - durée configurable via `setup.py` (24h par défaut), purgé automatiquement au lancement. Option `--nocache` pour forcer des requêtes fraîches - **Google Dorks** (`--dorks` / prompt interactif) : recherche Google via SerpAPI des mentions d'une IP sur le web ouvert (forums, listes GitHub, rapports CTI) - résultats triés par pertinence CTI (botnet, malware, phishing, APT…), exclusion automatique des scanners/blacklists connus - **Interface web locale** (`--web`) : UI dark-theme dans le navigateur, bind uniquement sur 127.0.0.1, protection CSRF, une carte de résultat par cible, nav cliquable pour multi-cibles, téléchargement JSON - **Chiffrement des clés API** : Fernet/AES-128-CBC + PBKDF2-HMAC-SHA256 (480 000 itérations) - **Export JSON et CSV** : `--export rapport.json` ou `--export rapport.csv` (détecté à l'extension) - **Mode silencieux** : `--quiet` supprime toute sortie, code retour `1` si score ≥ seuil (`--threshold N`, défaut 40) - idéal pour les scripts et pipelines - **Lecture stdin** : `--file -` lit les cibles depuis stdin (`cat targets.txt | python3 main.py --file -`) - **Déduplication automatique** des cibles - les doublons dans un fichier ne sont traités qu'une fois - **Mise à jour automatique** : `update.py` vérifie et applique les mises à jour depuis GitHub, avec rollback possible - **Ctrl+C propre** : message d'arrêt au lieu d'une traceback - Scripts standalone par source pour un usage indépendant ## Installation cd IOCHunting pip install -r requirements.txt python3 setup.py `setup.py` configure les clés API et la durée du cache (24h par défaut). Au premier lancement, il propose de **chiffrer ou non** les clés (Fernet/AES - optionnel). Le chiffrement peut être activé ou désactivé à tout moment depuis le menu. À relancer pour modifier une valeur. ## Sources et clés API (toutes gratuites) | Source | Utilité | Clé requise | Lien | |--------|---------|-------------|------| | AbuseIPDB | Score d'abus, rapports communautaires | Oui | https://www.abuseipdb.com/account/api | | VirusTotal | Scan multi-AV, YARA, Sigma, IDS, Sandbox | Oui | https://www.virustotal.com/gui/my-apikey | | Shodan | Ports ouverts, CVEs, services | Optionnelle* | https://account.shodan.io/ | | Censys | Ports ouverts, services détaillés | Oui | https://app.censys.io/user/tokens | | URLhaus | URLs malveillantes, hashes malwares | Oui | https://auth.abuse.ch/ | | SerpAPI | Google Dorks - mentions web (forums, GitHub, rapports CTI) | Optionnelle | https://serpapi.com/ | | GreyNoise | Scan internet - scanner légitime, malveillant ou trafic ciblé | Aucune* | https://www.greynoise.io/ | | MalwareBazaar | Famille, tags, vendor intel sur les hashes | Même clé qu'URLhaus | https://auth.abuse.ch/ | *Sans clé Shodan, l'outil utilise automatiquement **Shodan InternetDB** (gratuit, sans clé, ports/vulns/hostnames). *GreyNoise fonctionne sans clé via l'endpoint communautaire public. ## Usage ### Analyse principale (corrélation multi-sources) # Analyser une IP - auto-détectée python3 main.py 1.2.3.4 # Analyser une URL - auto-détectée python3 main.py https://malicious.example.com/payload # Analyser un hash - auto-détecté (MD5 / SHA1 / SHA256) python3 main.py d41d8cd98f00b204e9800998ecf8427e # Analyser plusieurs cibles (mélange IP/URL accepté) python3 main.py 1.2.3.4 5.6.7.8 https://example.com # Analyser un domaine - auto-détecté python3 main.py evil.com # Depuis un fichier texte (une cible par ligne, # = commentaire) python3 main.py --file targets.txt # Depuis stdin cat targets.txt | python3 main.py --file - # Forcer le mode hash python3 main.py --type hash abc123... # Forcer le mode IP/URL python3 main.py --type ip 1.2.3.4 # Filtrer les fichiers VirusTotal par année python3 main.py 1.2.3.4 --year 2025 python3 main.py 1.2.3.4 --year 2024,2025 # Exporter le rapport en JSON ou CSV python3 main.py 1.2.3.4 --export rapport.json python3 main.py 1.2.3.4 --export rapport.csv # Mode silencieux (code retour 1 si score ≥ 40) python3 main.py --quiet 1.2.3.4 python3 main.py --quiet --threshold 70 1.2.3.4 # Sortie JSON brute (machine-readable) python3 main.py 1.2.3.4 --json # Forcer les requêtes API (ignore le cache) python3 main.py 1.2.3.4 --nocache # Afficher aussi les payloads URLhaus offline (online-only par défaut) python3 main.py 1.2.3.4 --offline # Lancer l'interface web locale python3 main.py --web # Google Dorks (standalone) python3 modules/googledorks_lookup.py 1.2.3.4 ### Interface web locale (`--web`) Lance un serveur Flask **uniquement accessible depuis la machine locale** (127.0.0.1). Ouvre ensuite `http://127.0.0.1:` dans le navigateur. python3 main.py --web # → Propose le port (5000 par défaut, configurable via setup.py) # → Démarre le serveur et affiche l'URL - Bind sur 127.0.0.1 uniquement - jamais exposé sur le réseau - Protection CSRF sur chaque soumission (token généré au lancement) - Résultats colorés (ANSI → HTML), identiques au terminal - **Multi-cibles** : textarea multi-lignes (une cible par ligne) ou chargement d'un fichier `.txt` - Une carte de résultat par cible, avec nav cliquable pour scroller directement à une carte - Bouton `↓ JSON` pour télécharger tous les résultats au format JSON - Bouton scroll-to-top fixe en bas à gauche (apparaît après 300px de scroll) - Historique des 10 dernières analyses dans `localStorage` - Options "Ignorer le cache" et filtre année disponibles - Validation : erreur si plusieurs cibles sur une même ligne (séparées par espace) ### Google Dorks (mentions web) Lance une recherche Google via **SerpAPI** pour trouver les mentions de l'IP sur le web ouvert : forums, listes GitHub, rapports CTI, write-ups, etc. - **Mode interactif** : au début d'une session multi-cibles, le script demande une fois `Lancer Google Dorks ?`. Si `o`, les Dorks tournent automatiquement après chaque analyse sans redemander. - **Standalone** : python3 modules/googledorks_lookup.py 1.2.3.4 python3 modules/googledorks_lookup.py 1.2.3.4 --num 20 - **Clé SerpAPI** : plan gratuit = **100 requêtes/mois** (5 req par analyse, lancées en parallèle : IP exacte pages 1-2 + IP sans exclusions + filetype:txt pages 1-2). Configure via `python setup.py`. - **Filtrage** : les scanners d'IP (ipinfo, AbuseIPDB, Shodan…) et blacklists sont exclus automatiquement. Les résultats contenant des mots-clés CTI (botnet, malware, phishing, APT…) remontent en premier. ### Hachage de fichiers locaux (mode hash) Le mode hash peut analyser directement des **fichiers locaux** - il calcule leur SHA256, puis interroge VirusTotal et URLhaus. # Via le menu interactif → choix "2 - Analyser un hash" → option "2 - Hasher un fichier/répertoire" python3 main.py --type hash Si un **répertoire** est fourni, tous les fichiers qu'il contient sont hashés et analysés. ### Menu interactif (sans argument) python3 main.py Affiche un menu principal avec trois modes : - **1 - IP / URL** : saisie directe, fichier ou répertoire - **2 - Hash** : saisie de hash ou hachage de fichiers - **w - Interface web** : lance le serveur local dans le navigateur - **r - Retour** disponible dans chaque sous-menu pour revenir au menu principal ### Configuration des clés API # Configuration initiale (à faire une seule fois) python3 setup.py Les clés sont stockées chiffrées dans `~/.config/ioc_hunting/keys.json`. La passphrase de déchiffrement peut être fournie de trois façons : #### Option 1 - Prompt interactif (recommandé) python3 main.py 1.2.3.4 Demandée à chaque lancement, jamais stockée. ✔ Aucune passphrase exposée. ✘ À saisir à chaque nouveau lancement. #### Option 2 - Variable inline (pratique, risque limité) THREAT_HUNTING_PASSPHRASE='passphrase' python3 main.py 1.2.3.4 ✔ Pas besoin de saisie dans la même session. ✘ Visible dans `/proc//environ` - risque négligeable en local. #### Option 3 - Variable exportée (le plus pratique) export THREAT_HUNTING_PASSPHRASE='passphrase' python3 main.py 1.2.3.4 python3 main.py 5.6.7.8 # pas besoin de la remettre ✔ Aucune saisie répétée. ✘ Héritée par tous les process du terminal - à éviter sur serveur partagé. ## Modes de détection automatique (CLI) Quand des cibles sont passées en argument, `main.py` les identifie automatiquement : | Format | Détection | |--------|-----------| | `1.2.3.4` | IPv4 → AbuseIPDB · VT · Shodan · Censys · URLhaus · GreyNoise | | `2001:db8::1` | IPv6 → idem | | `evil.com` | Domaine → VT + URLhaus | | `https://...` | URL → VT + URLhaus + AbuseIPDB (sur l'IP du host si applicable) | | 32 hex chars (MD5) | Hash → VT + URLhaus | | 40 hex chars (SHA1) | Hash → VT + URLhaus | | 64 hex chars (SHA256) | Hash → VT + URLhaus | Si toutes les cibles sont des hashes, le mode hash est activé automatiquement. Sinon, le mode IP/URL/Domaine est utilisé. ## Scripts standalone (modules/) Chaque source dispose d'un script indépendant utilisable séparément : python3 modules/abuseipdb_lookup.py 1.2.3.4 python3 modules/virustotal_lookup.py 1.2.3.4 python3 modules/virustotal_lookup.py https://example.com --full python3 modules/virustotal_lookup.py d41d8cd98f00b204e9800998ecf8427e python3 modules/shodan_lookup.py 1.2.3.4 python3 modules/censys_lookup.py 1.2.3.4 python3 modules/urlhaus_lookup.py https://malicious.example.com Tous supportent : `--file`, `--json`, `--export`, `--key`. `virustotal_lookup.py` supporte en plus `--full` pour les relations (communicating files, etc.). ## Structure du projet IOC Hunting/ ├── main.py ← point d'entrée principal (corrélation + hash) ├── setup.py ← configuration et chiffrement des clés API ├── update.py ← mise à jour automatique depuis GitHub (avec rollback) ├── requirements.txt ← dépendances Python (pip install -r requirements.txt) ├── README.md ├── .internal/ │ └── config_loader.py ← chiffrement Fernet, lecture/écriture des clés └── modules/ ├── abuseipdb_lookup.py ← AbuseIPDB standalone ├── censys_lookup.py ← Censys standalone ├── googledorks_lookup.py ← Google Dorks via SerpAPI standalone ├── shodan_lookup.py ← Shodan standalone (+ InternetDB fallback) ├── urlhaus_lookup.py ← URLhaus standalone └── virustotal_lookup.py ← VirusTotal standalone (IP / URL / Hash / --full) ## Exemple de sortie - mode IP Si la cible a déjà été analysée dans la durée du cache configurée (24h par défaut), le résultat est chargé depuis le cache (sans appel API) : IOC Hunting › 1.2.3.4 (cache) ════════════════════════════════════════════════════════════════════════ IOC Hunting › 1.2.3.4 Score de menace ████████████████░░░░ 80/100 [CRITIQUE] Signaux détectés · AbuseIPDB 100% · VT 8 détections · URLhaus online (2) ──────────────────────────────────────────────────────────────────────── Détails par source AbuseIPDB score 100% | 121 rapports | APNIC (UA) VirusTotal 8/91 moteurs | 1 suspects | Tags : scanner, vpn Shodan 3 ports | 0 CVE(s) Censys 6 ports URLhaus is_host | online: 2 | botnet_cc ## Exemple de sortie - mode Hash ════════════════════════════════════════════════════════════════════════ IOC Hunting - Hash › db349b97c37d22f5ea1d1841e3c89eb4 Score de menace ████████████████████ 95/100 [CRITIQUE] Signaux détectés · VT 67 détections · YARA 5 match(es) · Sandbox malicious (3) · URLhaus référencé (offline) · Famille: WannaCry ──────────────────────────────────────────────────────────────────────── URLhaus - Payload Famille / Signature WannaCry Type fichier exe Taille 3723264 bytes SHA256 ed01ebfbc9eb5bbea545af4d01bf5f1071661840... ──────────────────────────────────────────────────────────────────────── VirusTotal - Fichier Détections 67/72 moteurs ... Crowdsourced YARA Rules (5 matches) Crowdsourced Sigma Rules critical: 2 high: 3 Dynamic Analysis Sandbox → malicious (WannaCry.Ransomware) ## Limitations - **VirusTotal plan gratuit** : 4 requêtes/minute, 500/jour. Le script attend automatiquement sur rate limit (429). L'analyse de plusieurs hashes consécutifs prend ~16 secondes entre chaque. - Ce délai est **configurable via `python3 setup.py`** (option *Délai VirusTotal*). Valeur par défaut : `16` secondes. - Avec une **clé API VirusTotal payante** (Premium), il faut le réduire - le mettre à `0` pour supprimer complètement les pauses entre requêtes. Le backoff automatique sur 429 reste actif dans tous les cas. - **Shodan plan gratuit** : accès limité aux données indexées via `/shodan/host/{ip}`. Sans clé, fallback automatique sur InternetDB. - **AbuseIPDB** : 1 000 requêtes/jour (plan gratuit). - **Censys** : 250 requêtes/mois (plan gratuit). - **URLhaus** : pas de limite officielle sur le plan gratuit, mais un usage raisonnable est recommandé. ## Dépendances - **Python 3.10+** (requis pour la syntaxe `set | None` dans les annotations de type) - `cryptography >= 41.0.0` (chiffrement Fernet des clés API) Toutes les autres dépendances (`urllib`, `json`, `argparse`, `hashlib`, `concurrent.futures`, `base64`, `re`, `getpass`) font partie de la bibliothèque standard Python. ## Désinstallation Supprime le dossier du projet, puis les données locales générées par le script : rm -rf ~/.config/ioc_hunting/ Ce dossier contient les clés API (chiffrées ou non), le cache des résultats et les paramètres (port web, durée du cache, délai VirusTotal). *Made by hsa5*