Galah
Honeypot web propulsé par LLM qui génère dynamiquement de fausses réponses HTTP réalistes pour n'importe quel chemin demandé, utilisé pour attirer et étudier l'activité de scan/exploitation automatisée et pilotée par IA. LLM-powered web honeypot that dynamically generates realistic fake HTTP responses for any requested path, used to lure and study automated and AI-driven scanning/exploitation activity.
↗ https://github.com/0x4D31/galahOverview
Traditional web honeypots only convincingly emulate the handful of paths and responses someone bothered to script. Galah instead sits behind an HTTP listener and, for every unrecognized request, asks a configured LLM to generate a plausible-looking response on the fly — matching the requested path, method, and headers to something a real server of that apparent type would return. That makes it far harder for an attacker (human or, increasingly, an automated/agentic scanner) to fingerprint the honeypot by probing for the gaps a static template set would have. It logs every interaction, making it useful for building intel on scanning campaigns and, specifically, on how AI-driven exploitation tools behave against a target.
Installation
git clone https://github.com/0x4D31/galah.git
cd galah
go build
Or via go install
go install github.com/0x4D31/galah@latest
Configuration
# config.yaml
llm_provider: openai # openai, gemini, ollama (local), etc.
openai:
api_key: "<api_key>"
model: "gpt-4o-mini"
cache_enabled: true # reuse generated responses for repeated requests
cache_duration: 24h
server_header: "Apache/2.2.15 (CentOS)" # spoofed Server banner
Running
Start Galah listening on port 8080 with the given config
galah -i eth0 -p 8080 -c config.yaml -l logs/galah.log
Run with TLS for HTTPS honeypot listeners
galah -p 443 -c config.yaml -t cert.pem -k key.pem
Point a local model (via Ollama) at Galah instead of a hosted API
galah -c config.yaml --llm-provider ollama --ollama-model llama3
Tips
- Enable
cache_enabledin production — without it, every unique probe (including noisy internet-wide scanners) triggers a fresh LLM call, which gets expensive fast. - Feed Galah’s structured JSON logs into your existing SIEM/log pipeline to correlate honeypot hits with other telemetry — each entry includes the request, generated response, and detected sensor metadata.
- Because responses are generated per-request, Galah is particularly effective at snagging scanners that fingerprint honeypots by requesting unusual/non-standard paths expecting a 404 template — Galah will happily hallucinate something plausible instead.
Help / Man page
usage: galah [OPTIONS]
options:
-i, --interface STRING network interface to bind (default: all)
-p, --port INT listening port (default: 8080)
-c, --config PATH path to config.yaml
-l, --log PATH path to interaction log file
-t, --cert PATH TLS certificate (enables HTTPS)
-k, --key PATH TLS private key
--llm-provider STRING override provider (openai, gemini, ollama)
--ollama-model STRING model name when using ollama provider
-v, --verbose verbose logging
--version show version
config.yaml keys:
llm_provider, cache_enabled, cache_duration, server_header,
<provider>.api_key, <provider>.model
Vue d’ensemble
Les honeypots web traditionnels n’émulent de façon convaincante que la poignée de chemins et de réponses que quelqu’un a pris la peine de scripter. Galah, lui, se place derrière un listener HTTP et, pour chaque requête non reconnue, demande à un LLM configuré de générer à la volée une réponse plausible, en faisant correspondre le chemin, la méthode et les headers demandés à ce qu’un vrai serveur de ce type apparent renverrait. Cela rend beaucoup plus difficile pour un attaquant (humain ou, de plus en plus, un scanner automatisé/agentique) de fingerprinter le honeypot en sondant les trous qu’un jeu de templates statiques aurait. Il journalise chaque interaction, ce qui le rend utile pour bâtir du renseignement sur les campagnes de scan et, en particulier, sur le comportement des outils d’exploitation pilotés par IA face à une cible.
Installation
git clone https://github.com/0x4D31/galah.git
cd galah
go build
Ou via go install
go install github.com/0x4D31/galah@latest
Configuration
# config.yaml
llm_provider: openai # openai, gemini, ollama (local), etc.
openai:
api_key: "<api_key>"
model: "gpt-4o-mini"
cache_enabled: true # réutilise les réponses générées pour les requêtes répétées
cache_duration: 24h
server_header: "Apache/2.2.15 (CentOS)" # bannière Server usurpée
Exécution
# Démarrer Galah en écoute sur le port 8080 avec la config donnée
galah -i eth0 -p 8080 -c config.yaml -l logs/galah.log
# Lancer avec TLS pour des listeners honeypot HTTPS
galah -p 443 -c config.yaml -t cert.pem -k key.pem
# Pointer un modèle local (via Ollama) vers Galah au lieu d'une API hébergée
galah -c config.yaml --llm-provider ollama --ollama-model llama3
Conseils
- Activer
cache_enableden production : sans cela, chaque sonde unique (y compris les scanners bruyants à l’échelle d’internet) déclenche un nouvel appel LLM, ce qui devient vite coûteux. - Injecter les logs JSON structurés de Galah dans votre pipeline SIEM/logs existant pour corréler les hits du honeypot avec le reste de la télémétrie : chaque entrée inclut la requête, la réponse générée et les métadonnées de capteur détectées.
- Comme les réponses sont générées par requête, Galah est particulièrement efficace pour piéger les scanners qui fingerprintent les honeypots en demandant des chemins inhabituels/non standards en attendant un template 404 : Galah hallucinera volontiers quelque chose de plausible à la place.
Aide / Page de manuel
usage: galah [OPTIONS]
options:
-i, --interface STRING network interface to bind (default: all)
-p, --port INT listening port (default: 8080)
-c, --config PATH path to config.yaml
-l, --log PATH path to interaction log file
-t, --cert PATH TLS certificate (enables HTTPS)
-k, --key PATH TLS private key
--llm-provider STRING override provider (openai, gemini, ollama)
--ollama-model STRING model name when using ollama provider
-v, --verbose verbose logging
--version show version
config.yaml keys:
llm_provider, cache_enabled, cache_duration, server_header,
<provider>.api_key, <provider>.model