
Galah : Un honeypot web alimenté par un LLM.
TL;DR : Galah (/ɡəˈlɑː/ - se prononce « guh-laa ») est un honeypot web alimenté par LLM conçu pour imiter diverses applications et répondre dynamiquement à des requêtes HTTP arbitraires. Galah prend en charge les principaux fournisseurs de LLM, notamment OpenAI, GoogleAI, Vertex AI de GCP, Anthropic, Cohere et Ollama.
Contrairement aux honeypots web traditionnels qui émulent manuellement des applications web ou des vulnérabilités spécifiques, Galah élabore dynamiquement des réponses pertinentes—y compris les en-têtes HTTP et le corps—à toute requête HTTP. Les réponses générées par le LLM sont mises en cache pour une période configurable afin d'éviter une génération répétitive pour des requêtes identiques, réduisant ainsi les coûts d'API. La mise en cache est spécifique au port, garantissant que les réponses générées pour un port particulier ne seront pas réutilisées pour la même requête sur un port différent.
Galah peut éventuellement inspecter les requêtes HTTP entrantes par rapport à un ensemble de règles Suricata, en ciblant divers tampons HTTP, y compris la méthode, l'URI, les en-têtes, les cookies et le corps de la requête (l'implémentation actuelle ne prend pas en charge tous les mots-clés Suricata et la gestion de PCRE est limitée). Pour activer et configurer la correspondance des règles, voir Correspondance des règles HTTP Suricata.
La configuration du prompt est essentielle dans ce honeypot. Bien que vous puissiez mettre à jour le prompt dans le fichier de configuration, il est crucial de conserver le segment qui demande au LLM de produire des réponses au format JSON spécifié.
Remarque : Galah a été développé comme un projet de week-end amusant pour explorer les capacités des LLM dans la création de messages HTTP. Le honeypot peut être identifiable par diverses méthodes telles que les techniques de fingerprinting réseau, des temps de réponse prolongés selon le fournisseur et le modèle de LLM, et des réponses non standard. Pour vous protéger contre les attaques de déni de portefeuille, pensez à définir des limites d'utilisation sur votre API LLM.
config.yaml si nécessaire.git clone [email protected]:0x4D31/galah.git
cd galah
go mod download
mkdir bin
go build -o bin/galah ./cmd/galah
./bin/galah --help
██████ █████ ██ █████ ██ ██
██ ██ ██ ██ ██ ██ ██ ██
██ ███ ███████ ██ ███████ ███████
██ ██ ██ ██ ██ ██ ██ ██ ██
██████ ██ ██ ███████ ██ ██ ██ ██
llm-based web honeypot | version 1.1.1
author: Adel "0x4D31" Ka
Usage: galah --provider PROVIDER --model MODEL [--server-url SERVER-URL] [--temperature TEMPERATURE] [--api-key API-KEY] [--cloud-location CLOUD-LOCATION] [--cloud-project CLOUD-PROJECT] [--interface INTERFACE] [--config-file CONFIG-FILE] [--rules-config-file RULES-CONFIG-FILE] [--event-log-file EVENT-LOG-FILE] [--cache-db-file CACHE-DB-FILE] [--cache-duration CACHE-DURATION] [--log-level LOG-LEVEL] [--suricata-enabled] [--suricata-rules-dir SURICATA-RULES-DIR]
Options:
--provider PROVIDER, -p PROVIDER
LLM provider (openai, googleai, gcp-vertex, anthropic, cohere, ollama) [env: LLM_PROVIDER]
--model MODEL, -m MODEL
LLM model (e.g. gpt-3.5-turbo-1106, gemini-1.5-pro-preview-0409) [env: LLM_MODEL]
--server-url SERVER-URL, -u SERVER-URL
LLM Server URL (required for Ollama) [env: LLM_SERVER_URL]
--temperature TEMPERATURE, -t TEMPERATURE
LLM sampling temperature (0-2). Higher values make the output more random [default: 1, env: LLM_TEMPERATURE]
--api-key API-KEY, -k API-KEY
LLM API Key [env: LLM_API_KEY]
--cloud-location CLOUD-LOCATION
LLM cloud location region (required for GCP's Vertex AI) [env: LLM_CLOUD_LOCATION]
--cloud-project CLOUD-PROJECT
LLM cloud project ID (required for GCP's Vertex AI) [env: LLM_CLOUD_PROJECT]
--interface INTERFACE, -i INTERFACE
interface to serve on
--config-file CONFIG-FILE, -c CONFIG-FILE
Path to config file [default: config/config.yaml]
--rules-config-file RULES-CONFIG-FILE, -r RULES-CONFIG-FILE
Path to rules config file (rule engine disabled if omitted)
--event-log-file EVENT-LOG-FILE, -o EVENT-LOG-FILE
Path to event log file [default: event_log.json]
--cache-db-file CACHE-DB-FILE, -f CACHE-DB-FILE
Path to database file for response caching [default: cache.db]
--cache-duration CACHE-DURATION, -d CACHE-DURATION
Cache duration for generated responses (in hours). Use 0 to disable caching, and -1 for unlimited caching (no expiration). [default: 24]
--log-level LOG-LEVEL, -l LOG-LEVEL
Log level (debug, info, error, fatal) [default: info]
--suricata-enabled Enable Suricata HTTP rule checking (default: false)
--suricata-rules-dir SURICATA-RULES-DIR
Directory containing Suricata .rules files to check HTTP requests against
--help, -h display this help and exit
% git clone [email protected]:0x4D31/galah.git
% cd galah
% mkdir logs
% export LLM_API_KEY=your-api-key
% docker build -t galah-image .
% docker run -d --name galah-container -p 8080:8080 -v $(pwd)/logs:/galah/logs -e LLM_API_KEY galah-image -o logs/galah.json -p openai -m gpt-3.5-turbo-1106
./galah -p openai -m gpt-4.1-mini --suricata-enabled --suricata-rules-dir rules
Test :
curl --http1.1 --path-as-is -X POST \
-H 'SOAPAction: "http://purenetworks.com/HNAP1/GetGuestNetworkSettings"' \
-H 'Content-Type: text/xml' \
--data '<GetGuestNetworkSettings xmlns="http://purenetworks.com/HNAP1/">' \
http://127.0.0.1:8888/HNAP1/ -v
Remarque : L'utilisation inutile de -X ou --request, POST est déjà inféré.
* Trying 127.0.0.1:8888...
* Connected to 127.0.0.1 (127.0.0.1) port 8888
> POST /HNAP1/ HTTP/1.1
> Host: 127.0.0.1:8888
> User-Agent: curl/8.7.1
> Accept: */*
> SOAPAction: "http://purenetworks.com/HNAP1/GetGuestNetworkSettings"
> Content-Type: text/xml
> Content-Length: 64
>
* upload completely sent off: 64 bytes