Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
galah — Galah : Un honeypot web alimenté par un LLM. | Kitploit
Outils/GitHubGitHub/0x4d31/galah
Sécurité WebRenseignement sur les MenacesDétection d'IntrusionRéponse aux Incidents
GitHub0x4d31/galah

galah

Galah : Un honeypot web alimenté par un LLM.

Voir le dépôt
65866il y a 1 anVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

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.

Pour commencer

Déploiement local

  • Assurez-vous d'avoir Go version 1.22+ installé.
  • En fonction de votre fournisseur LLM, créez une clé API (par exemple, depuis ici pour OpenAI et ici pour GoogleAI Studio) ou configurez des identifiants d'authentification (par exemple, les identifiants par défaut de l'application pour Vertex AI de GCP).
  • Si vous souhaitez servir des ports HTTPS, générez des certificats TLS.
  • Clonez le dépôt et installez les dépendances.
  • Mettez à jour le fichier config.yaml si nécessaire.
  • Compilez et exécutez le binaire Go !
root@kitploit:~
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

Exécution dans Docker

  • Assurez-vous d'avoir Docker CE ou EE installé localement.
  • Clonez le dépôt et construisez l'image Docker.
  • Vous pouvez monter un répertoire local dans le conteneur pour stocker les logs.
  • Exécutez le conteneur Docker.
root@kitploit:~
% 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

Exemple d'utilisation

root@kitploit:~
./galah -p openai -m gpt-4.1-mini --suricata-enabled --suricata-rules-dir rules

Test :

root@kitploit:~
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

< HTTP/1.1 200 OK
< Server: TP-LINK HTTP Server/1.0
< Date: Mon, 21 Apr 2025 01:28:43 GMT
< Content-Length: 545
< Content-Type: text/xml; charset=utf-8
< 
<?xml version="1.0" encoding="utf-8"?>
<GetGuestNetworkSettingsResponse xmlns="http://purenetworks.com/HNAP1/">
  <GetGuestNetworkSettingsResult>OK</GetGuestNetworkSettingsResult>
  <GuestNetworkEnabled>true</GuestNetworkEnabled>
  <GuestNetworkSSID>TPLink_Guest</GuestNetworkSSID>
  <GuestNetworkSecurity>WPA2-PSK</GuestNetworkSecurity>
  <GuestNetworkPassword>guest1234</GuestNetworkPassword>
  <GuestNetworkIsolation>true</GuestNetworkIsolation>
  <GuestNetworkSSIDBroadcast>true</GuestNetworkSSIDBroadcast>

Journal d'événements JSON :

root@kitploit:~
{
  "eventTime": "2025-04-21T02:28:43.583386+01:00",
  "httpRequest": {
    "body": "<GetGuestNetworkSettings xmlns=\"http://purenetworks.com/HNAP1/\">",
    "bodySha256": "836c42168ebbad0b7192daa70ad8e4ea8d5930097162f513045f5ecb6ae9d5bd",
    "headers": {
      "Accept": "*/*",
      "Content-Length": "64",
      "Content-Type": "text/xml",
      "Soapaction": "\"http://purenetworks.com/HNAP1/GetGuestNetworkSettings\"",
      "User-Agent": "curl/8.7.1"
    },
    "headersSorted": "Accept,Content-Length,Content-Type,Soapaction,User-Agent",
    "headersSortedSha256": "3a44fecf9284eca3947c45ffeb2301ce6d9b3d0a3cc5a7491ccea2b6ed61edaa",
    "method": "POST",
    "protocolVersion": "HTTP/1.1",
    "request": "/HNAP1/",
    "sessionID": "1745198923587092000_qHLNEPBNPrH6qw==",
    "userAgent": "curl/8.7.1"
  },
  "httpResponse": {
    "headers": {
      "Content-Length": "454",
      "Content-Type": "text/xml; charset=utf-8",
      "Server": "TP-LINK HTTP Server/1.0"
    },
    "body": "<?xml version=\"1.0\" encoding=\"utf-8\"?> <GetGuestNetworkSettingsResponse xmlns=\"http://purenetworks.com/HNAP1/\">   <GetGuestNetworkSettingsResult>OK</GetGuestNetworkSettingsResult>   <GuestNetworkEnabled>true</GuestNetworkEnabled>   <GuestNetworkSSID>TPLink_Guest</GuestNetworkSSID>   <GuestNetworkSecurity>WPA2-PSK</GuestNetworkSecurity>   <GuestNetworkPassword>guest1234</GuestNetworkPassword>   <GuestNetworkIsolation>true</GuestNetworkIsolation>   <GuestNetworkSSIDBroadcast>true</GuestNetworkSSIDBroadcast> </GetGuestNetworkSettingsResponse>"
  },
  "level": "info",
  "msg": "successfulResponse",
  "port": "8888",
  "responseMetadata": {
    "generationSource": "llm",
    "info": {
      "model": "gpt-4.1-mini",
      "provider": "openai",
      "temperature": 1
    }
  },
  "sensorName": "mbp",
  "srcHost": "localhost",
  "srcIP": "127.0.0.1",
  "srcPort": "62418",
  "suricataMatches": [
    {
      "msg": "ET WEB_SPECIFIC_APPS D-Link DIR-823G Multiple HNAP SOAPAction Endpoints Authentication Bypass",
      "sid": "2061623"
    }
  ],
  "tags": null,
  "time": "2025-04-21T02:28:43.587152+01:00"
}

Voir d'autres exemples ici.

Utilisation en bibliothèque

Le paquet galah peut être utilisé comme une bibliothèque autonome. Créez un galah.Service et appelez GenerateHTTPResponse avec un http.Request pour produire une réponse. Si ConfigFile, EventLogFile ou CacheDBFile sont omis, leurs chemins par défaut (config/config.yaml, event_log.json et cache.db) sont utilisés. Spécifiez RulesConfigFile pour activer la vérification des règles ; le laisser vide désactive entièrement le moteur de règles. Options.Logger peut être fourni avec un *log.Logger ; si nil, Galah crée un journal texte par défaut.

root@kitploit:~
svc, err := galah.NewService(context.Background(), galah.Options{
    LLMProvider: "openai",
    LLMModel:    "gpt-4.1-mini",
    LLMAPIKey:   "YOUR_KEY",
    ConfigFile:  "config/config.yaml",
    RulesConfigFile: "config/rules.yaml", // omit to disable rule engine
    EventLogFile: "event_log.json",
    CacheDBFile:  "cache.db",
    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),
})
if err != nil {
    log.Fatal(err)
}
req, _ := http.NewRequest("GET", "https://example.com", nil)
respBytes, err := svc.GenerateHTTPResponse(req, "8080")
if err != nil {
    log.Fatal(err)
}
fmt.Println(string(respBytes))

Vous pouvez également construire un service à partir d'une configuration déjà chargée :

root@kitploit:~
cfg, _ := config.LoadConfig("config.yaml")
rulesCfg, _ := config.LoadRules("rules.yaml")
svc, err := galah.NewServiceFromConfig(context.Background(), cfg, rulesCfg.Rules, galah.Options{
    LLMProvider: "openai",
    LLMModel:    "gpt-4.1-mini",
    LLMAPIKey:   "YOUR_KEY",
    EventLogFile: "event_log.json", // use default if empty
    CacheDBFile:  "cache.db",       // use default if empty
    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),
})

Pour désactiver complètement la vérification des règles, omettez RulesConfigFile lors de la création d'un service ou passez nil/une slice vide à NewServiceFromConfig. Les champs d'options inutilisés peuvent être laissés vides pour utiliser leurs valeurs par défaut.

Le service expose également des méthodes d'assistance pour le cache et la journalisation des événements lorsqu'il est utilisé en bibliothèque :

root@kitploit:~
respBytes, _ := svc.CheckCache(req, "8080") // returns nil if no cached entry

svc.LogEvent(req, llm.JSONResponse{Headers: map[string]string{"Content-Type": "text/plain"}, Body: "hi"}, "8080", "llm", nil)
Télécharger l’outil