
Reconnaissance de masse, prise d'empreinte de version, testeur de CVE et framework d'exploitation en direct pour les instances Ollama ouvertes.
Boîte à outils modulaire pour découvrir les serveurs Ollama exposés, identifier les versions et valider l'accès aux modèles.
OllamaHound est une boîte à outils modulaire orientée RedTeam pour découvrir les serveurs Ollama exposés publiquement, identifier les versions, classer l'exposition aux CVE, vérifier si la génération de texte est possible, et (optionnellement) activer une session CLI interactive pour des tests contrôlés.
@@@@@@@@@@@@@@@@@@@@@@@@@@@#*#@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@%.-+-:#@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@+--=%@@@@@@@@-.@@@+ #@@@@@@@@@@@@@@@@@ @@@@@@@@@@@= %%+.=@@@%###-.@@@@= %@@@@@@@@@@@@@@@@ @@@@@@@@@@@-.@@@@..--====-.=@@@@.-@@@@@@@@@@@@@@@@ @@@@@@@@@@@@# +#+-:*%@@@@@@@@@@@@- +@@@@@@@@@@@@@@@ @@*@@@@@#*+=:::.-*%@@@@@@@@@@@@@@%::%@@@@@@@@@@@@@ @+:-@@*----=***+==-=#@@@@@@@@@@@@@@::@@@@@@@@@@@@@ @*+#@=-==+=%@@@@%#=+:*%%%@@@@#++%@@+ %@@@@@@@@@@@@ +:=@#.+-@#=#@%+++%@:* =++==*@- *@@-.@@@@@@@@@@@@@ %=+@+--*@@*=##+++%#.+::=@#%:+@%@@@@%.=@@@@@@@@@@@@ @@@@#.+-@@%=*@@@@@+.* =-:*@-=@@@@@@@* %@@@@@@@@@@@ @@@@@+:==#*=%@@@@*-=.:--+*-=@@@@@@@@+ %@@@@@@@@@@@ @@@@@@#=----+*++=--=**++*#%@@@@@@@@% =@@@@@@@@@@@@ @@@@@@@@%*-:---.+*%@@@@@@@@@@@@@@@@+-:+@@@@@@@@@@@ @@@@@@@@@@# ==:.%@@@@@@@@@@@@@@@@@@@@%.-@@@@@@@@@@ @@@@@@@@@@#.@@:.#@@@@@@@@@@@@@@#@@@@@@% *@@@@@@@@@ @@@@@@@@@*::--::=%@@@@@@@@@@@@::@@@@@@@ =@@@@@@@@@ @@@@@@@@-.#@@@@@-.@@@@@@@@@@#.-@@@@@@@@*.-@@@@@@@@ @@@@@@@@.-@@@@@%::@@@@@@@@%=.+@@@@@@@@@@%.-@@@@@@@ @@@@@@@@#::++=::+@@@@@@@%=:=%@@@@@%%@@@@@+ @@@@@@@ @@@@@@@@@@=.:: #@@@@@@@=.+@@@@@@%=:*@@@@@= @@@@@@@ @@@@@@@@@@@@%-.%@@@@@@# *@@@@@#-:+@@@@@@% +@@@@@@@ @@@@@@@@@@@@@.=@@@@@@@@=:===---*@@@@@@@@@.=@@@@@@@ @@@@@@@@@@@@@=.%@@@@@@@@#-##%@@@@@@@@@@@@.-@@@@@@@ @@@@@@@@@@@@@@= -%@@@@@@# #@@@@@@@@@@@@@# #@@@@@@@ @@@@@@@@@@@@@@@ .:=*%%@%#..*@@@@@@@@@@@+.+@@@@@@@@ @@@@@@@@@@@@@@@.=@*==- -=*. --==+*#**=:-#@@@@@@@@@ @@@@@@@@@@@@@@@:-@@@@# #@@+ %%##*..++#%@@@@@@@@@@@ @@@@@@@@@@@@@@@::@@@@-.@@@% *@@@@-:@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@*.=++::%@@@@::%@%+ *@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@%***%@@@@@@%=---=%@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@---OllamaHound---@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@---By 7h30th3r0n3---@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
!!! AVERTISSEMENT !!!
⚠️ Avis légal et éthique
Ce projet est destiné aux évaluations de sécurité autorisées (réseaux internes, engagements cadrés, environnements de laboratoire).
Utilisez-le uniquement sur des systèmes qui vous appartiennent ou pour lesquels vous disposez d'une autorisation écrite explicite.
En utilisant ce logiciel, vous acceptez d'être seul responsable de vos actions.
Le(s) auteur(s) et les contributeurs fournissent ce logiciel « tel quel » et déclinent toute responsabilité
en cas d'utilisation abusive, de dommages ou de conséquences juridiques découlant de son utilisation.
/api/tags et /api/generateresults/scraper/targets.txtresults/scanner/<prefix>_YYYYMMDD_HHMMSS.csvVous pouvez procéder étape par étape ou exécuter l'Orchestrator pour enchaîner les trois premières étapes.
asyncio + aiohttp (des milliers de sockets en vol)rich<prefix>_YYYYMMDD_HHMMSS.csvGET /api/version → repli GET /version → repli en-tête Server< 0.1.47<= 0.3.14GET /api/tagsaiohttprichpackagingrequestsshodanInstaller les dépendances :
python3 -m pip install -U aiohttp rich packaging requests shodan
Utiliser Docker :
docker build -t ollamahound .
docker run -it --rm ollamahound <ollamahound scripts>
Option A (la plus rapide) : collecter → scanner → connecter
python3 ollamaScraper.py
python3 ollamaScanner.py results/scraper/targets.txt --gen-ok-only
python3 ollamaConnector.py --scan-csv results/scanner/ollama_scan_*.csv
Option B (tout-en-un) : pipeline orchestrateur
python3 ollamaOrchestrator.py --scan-gen-ok-only
ollamaOrchestrator.py exécute simplement le scraper, le scanner, puis le connector afin de passer de la collecte Shodan à une CLI interactive en une seule commande. Le scraper et le connector restent interactifs, mais l'orchestrateur relie leurs sorties pour vous.
python3 ollamaOrchestrator.py --scan-gen-ok-only --scan-vuln-only
results/orchestrator/targets.txt (modifiable avec --targets).results/scanner/ avec le préfixe de --scan-output-prefix (par défaut orchestrator_scan).--connector-row pour sélectionner automatiquement une ligne au lancement du connector, ou choisissez-en une interactivement comme d'habitude.--skip-scrape, --skip-scan et --skip-connect permettent de reprendre à partir de sorties existantes (--scan-csv est requis lorsqu'on saute la phase de scan).Le reste de cette section s'applique toujours si vous souhaitez exécuter chaque module manuellement.
Scraper :
# Basic interactive scrape (Shodan dork picker)
python3 ollamaScraper.py
# Custom output folder + filename
python3 ollamaScraper.py --output-dir results/my-scrape -o targets_acme.txt
Scanner :
# Scan targets.txt (default 11434, 500 concurrency, 8s timeout)
python3 ollamaScanner.py results/scraper/targets.txt
# Only hosts where /api/generate returns 200
python3 ollamaScanner.py results/scraper/targets.txt --gen-ok-only
# Multi-port scan (space and comma mix)
python3 ollamaScanner.py results/scraper/targets.txt -p 11434 8080,13871
# Aggressive sweep (short timeout + high concurrency)
python3 ollamaScanner.py results/scraper/targets.txt --timeout 3 -c 800
# Keep only vulnerable hosts (RCE/DoS) and unknown versions
python3 ollamaScanner.py results/scraper/targets.txt --vuln-only --show-unknown
# Custom CSV prefix + output dir
python3 ollamaScanner.py results/scraper/targets.txt -o scan_acme.csv --output-dir results/scanner_acme
Navigator :
# Filter a directory of scanner CSVs
python3 ollamaNavigator.py --scan-csv results/scanner --require-gen-ok --vuln rce
# Filter a single CSV, restrict to llama models, size >= 7B
python3 ollamaNavigator.py --scan-csv results/scanner/scan_20260107_180002.csv \
--model llama --min-params 7
# Exclude models + search keywords
python3 ollamaNavigator.py --scan-csv results/scanner --exclude-model qwen --search france
# Export filtered rows
python3 ollamaNavigator.py --scan-csv results/scanner --vuln dos \
--json-output results/navigator/dos.json --csv-output results/navigator/dos.csv
# Interactive filter menu
python3 ollamaNavigator.py --scan-csv results/scanner --interactive
Connector :
# Connect directly
python3 ollamaConnector.py --host http://127.0.0.1:11434 --model llama3
# Use a scanner CSV row (1-based index)
python3 ollamaConnector.py --scan-csv results/scanner/scan_20260107_180002.csv --scan-row 3
Orchestrator :
# Full pipeline
python3 ollamaOrchestrator.py
# Full pipeline + only gen-ok + vuln-only
python3 ollamaOrchestrator.py --scan-gen-ok-only --scan-vuln-only
# Reuse existing targets and CSV, only run connector
python3 ollamaOrchestrator.py --skip-scrape --skip-scan --scan-csv results/scanner/scan_20260107_180002.csv
# Skip connector (scrape + scan only)
python3 ollamaOrchestrator.py --skip-connect
targets.txt peut contenir une entrée par ligne :
192.0.2.1010.0.0.0/24ollama.example.orgSi vous générez la liste avec le scraper, pointez le scanner vers results/scraper/targets.txt (ou le chemin que vous avez choisi avec --output-dir).
ollamaScraper.py peut construire results/scraper/targets.txt pour vous en interrogeant Shodan :
python3 ollamaScraper.py
Le script met en cache votre clé API dans .shodan_api, vous permet de choisir un dork (mondial ou limité à un pays), et ajoute chaque résultat à results/scraper/targets.txt tout en affichant un contexte de base. Vous pouvez éventuellement ajouter un filtre org:"Company" pour affiner les résultats. Ctrl+C ou l'atteinte de la limite maximale d'IP arrête l'exécution. Utilisez --output-dir / -o pour changer le dossier ou le nom de fichier, puis transmettez ce chemin au scanner.
Afficher uniquement les hôtes où /api/generate renvoie HTTP 200 :
python3 ollamaScanner.py targets.txt --gen-ok-only
Balayage plus agressif (timeout court + concurrence élevée) :
python3 ollamaScanner.py targets.txt --gen-ok-only --timeout 3 -c 800
Exemple de balayage complet :
11434 et 8080/api/generate == 200scan.csvpython3 ollamaScanner.py targets.txt -p 11434,8080 --timeout 2 -c 1200 \
--gen-ok-only --vuln-only --show-unknown -o scan.csv
Les CSV du scanner sont désormais placés dans results/scanner/. Utilisez --output-dir si vous souhaitez diriger les fichiers ailleurs (le dossier est créé automatiquement).
Le scanner affiche une table rich avec :
? si inconnue)rce, dos, patched, unknown)tags, generate, show)Un CSV horodaté est écrit automatiquement, par exemple :
ollama_scan_20260107_180002.csv
Champs :
ip, port, version, vuln, tags, generate, show, modelsUtilisez le navigator pour filtrer, trier et exporter les résultats d'un seul CSV ou de tout un dossier de sorties du scanner (dédupliqués par hôte/port, modèles fusionnés).
python3 ollamaNavigator.py --scan-csv results/scanner --require-gen-ok --vuln rce --model llama
--scan-csv accepte un seul fichier CSV ou un dossier de sorties du scanner.params (par défaut), ip ou version.--interactive pour un éditeur de filtres piloté par menu + exports.--json-output ou --csv-output.Connectez-vous à une instance découverte et diffusez les réponses :
python3 ollamaConnector.py --host http://127.0.0.1:11434 --model llama3
Si vous omettez --model, la CLI récupère /api/tags, liste chaque modèle exposé par le serveur et vous laisse choisir par numéro. Chaque invite diffuse les jetons en cyan jusqu'à ce que le serveur termine ou que vous appuyiez sur Ctrl+C. Tapez exit / quit pour quitter.
Vous pouvez également pointer le connector vers une ligne d'un CSV du scanner pour ne pas avoir à retaper l'hôte et le modèle :
python3 ollamaConnector.py --scan-csv scan_20260107_141056.csv --scan-row 3
--scan-row est basé sur 1 (la première ligne après l'en-tête est 1). Si vous l'omettez, le connector charge le CSV, affiche chaque hôte (IP/port, état de vulnérabilité, premier modèle), vous laisse choisir l'index, puis liste les modèles découverts afin que vous puissiez choisir avec lequel discuter. Sélectionner 0 lors de l'invite du modèle passe à une récupération fraîche de /api/tags, donc le comportement d'origine du connector fonctionne toujours si le CSV est obsolète ou vide.
ollamaScraper.py est un simple assistant qui conserve un fichier de jeton .shodan_api, demande un pays (ou mondial), vous permet de choisir parmi plusieurs dorks Shodan prêts à l'emploi (ou une requête personnalisée), puis parcourt les pages Shodan jusqu'à ce que vous interrompiez ou atteigniez une limite d'hôtes définie par l'utilisateur. Chaque IP est écrite dans results/scraper/targets.txt, ce qui permet au scanner de réutiliser immédiatement la sortie. Fournissez un autre dossier via --output-dir si nécessaire.
Il propose également un filtre optionnel entreprise/organisation qui ajoute org:"Company" au dork, et affiche un avertissement pour ne cibler que les systèmes qui vous appartiennent ou pour lesquels vous disposez d'une autorisation explicite de test.
--skip-scrape, --skip-scan, --skip-connect pour reprendre certaines parties du pipeline--targets pour choisir le fichier de cibles partagé--ports, --scan-concurrency, --scan-timeout pour ajuster l'étape de scan--scan-output-prefix, --scan-output-dir pour contrôler la sortie CSV du scanner--scan-gen-ok-only, --scan-vuln-only, --scan-show-unknown pour les filtres du scanner--scan-csv pour réutiliser un CSV de scan existant lorsqu'on saute le scanLe navigator extrait les tailles de paramètres des noms de modèles comme 7B, 13b ou 500m. La taille la plus élevée par hôte est affichée dans le tableau et utilisée pour le tri/le filtrage (--min-params / --max-params).
OllamaHound est conçu pour la sécurité défensive et offensive autorisée :
7h30th3r0n3
ScannerDécouverte asynchrone à grande échelle, identification des versions, classification des CVE, sondage des modèles.
|
ConnectorClient CLI interactif à interface riche pour dialoguer avec une instance Ollama découverte.
|
ScraperCollecteur de cibles basé sur Shodan qui construit
|
NavigatorAssistant de recherche/filtrage pour les CSV du scanner avec exports et menu interactif.
|
OrchestratorEnchaîne scraper → scanner → connector, en transmettant chaque sortie à l'étape suivante.
|
ResultsLes sorties sont stockées sous |
POST /api/generate/api/generate renvoie HTTP 200 remontent en tête--gen-ok-only ne conserve que les hôtes avec /api/generate fonctionnel--vuln-only ne conserve que les hôtes classés RCE/DoS--show-unknown inclut les hôtes dont la version est inconnue/non analysable--connector-row pour sélectionner automatiquement une ligne au lancement du connector| Module | Sortie | Emplacement par défaut |
|---|
| Scraper | Liste de cibles | results/scraper/targets.txt |
| Scanner | CSV horodaté | results/scanner/<prefix>_YYYYMMDD_HHMMSS.csv |
| Navigator | Exports JSON/CSV optionnels | navigator_results.json / navigator_results.csv |
| Orchestrator | Cibles + CSV du scanner | results/orchestrator/targets.txt + results/scanner/ |