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/galah

Overview

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_enabled in 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_enabled en 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