Skip to content
KitploitKITPLOIT
StrumentiBlog
Invia
StrumentiBlog
Invia

Strumenti di Hacking, PenTest e Cybersecurity per il tuo Arsenale di Sicurezza!

Kitploit è una directory di strumenti di hacking, cybersecurity e pentesting. Scopri gli ultimi aggiornamenti dei progetti per trovare vulnerabilità, analizzare sistemi, automatizzare i test e rafforzare la tua sicurezza.

··Feed·Contatto·Privacy·© 2026 Kitploit

Directory degli strumenti

Categorie

Vedi tutte le categorie
Loading categories
galah — Galah: Un web honeypot basato su LLM. | Kitploit
Strumenti/GitHubGitHub/0x4d31/galah
Sicurezza WebThreat IntelligenceRilevamento IntrusioniRisposta agli Incidenti
GitHub0x4d31/galah

galah

Galah: Un web honeypot basato su LLM.

Vedi Repository
658661 anno faRevisionato da Kitploit

Più Popolari

Vedi tutti →

Scopri gli strumenti più utilizzati dalla nostra community.

Esplora tutti gli strumenti

Sfoglia la nostra collezione di strumenti

Vedi tutti gli strumenti →
Condividi

TL;DR: Galah (/ɡəˈlɑː/ - pronunciato ‘guh-laa’) è un honeypot web basato su LLM progettato per emulare varie applicazioni e rispondere dinamicamente a richieste HTTP arbitrarie. Galah supporta i principali provider LLM, tra cui OpenAI, GoogleAI, la Vertex AI di GCP, Anthropic, Cohere e Ollama.

A differenza degli honeypot web tradizionali che emulano manualmente specifiche applicazioni web o vulnerabilità, Galah crea dinamicamente risposte pertinenti—inclusi header HTTP e corpo del messaggio—a qualsiasi richiesta HTTP. Le risposte generate dal LLM vengono memorizzate nella cache per un periodo configurabile, per evitare la generazione ripetitiva per richieste identiche, riducendo i costi API. La cache è specifica per porta: le risposte generate per una determinata porta non verranno riutilizzate per la stessa richiesta su una porta diversa.

Galah può opzionalmente ispezionare le richieste HTTP in arrivo rispetto a un insieme di regole Suricata, cercando corrispondenze su vari buffer HTTP tra cui metodo, URI, header, cookie e corpo della richiesta (l'implementazione attuale non supporta tutte le parole chiave Suricata e la gestione di PCRE è limitata). Per abilitare e configurare il matching delle regole, consultare Suricata HTTP Rule Matching.

La configurazione del prompt è fondamentale in questo honeypot. Sebbene sia possibile aggiornare il prompt nel file di configurazione, è essenziale mantenere la parte che istruisce il LLM a produrre risposte nel formato JSON specificato.

Nota: Galah è stato sviluppato come un divertente progetto del fine settimana per esplorare le capacità dei LLM nella creazione di messaggi HTTP. L'honeypot potrebbe essere identificabile attraverso vari metodi come tecniche di fingerprinting di rete, tempi di risposta prolungati a seconda del provider e modello LLM, e risposte non standard. Per proteggersi da attacchi "Denial of Wallet", assicurati di impostare limiti di utilizzo sulla tua API LLM.

Per Iniziare

Deploy Locale

  • Assicurati di avere Go versione 1.22+ installato.
  • A seconda del tuo provider LLM, crea una chiave API (ad esempio da qui per OpenAI e qui per GoogleAI Studio) o imposta le credenziali di autenticazione (ad esempio le Application Default Credentials per la Vertex AI di GCP).
  • Se desideri servire porte HTTPS, genera certificati TLS.
  • Clona il repository e installa le dipendenze.
  • Aggiorna il file config.yaml se necessario.
  • Compila ed esegui il binario 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

 ██████   █████  ██       █████  ██   ██ 
██       ██   ██ ██      ██   ██ ██   ██ 
██   ███ ███████ ██      ███████ ███████ 
██    ██ ██   ██ ██      ██   ██ ██   ██ 
 ██████  ██   ██ ███████ ██   ██ ██   ██ 
  honeypot web basato su llm | versione 1.1.1
         autore: Adel "0x4D31" Ka

Utilizzo: 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]

Opzioni:
  --provider PROVIDER, -p PROVIDER
                         Provider LLM (openai, googleai, gcp-vertex, anthropic, cohere, ollama) [env: LLM_PROVIDER]
  --model MODEL, -m MODEL
                         Modello LLM (es. gpt-3.5-turbo-1106, gemini-1.5-pro-preview-0409) [env: LLM_MODEL]
  --server-url SERVER-URL, -u SERVER-URL
                         URL del server LLM (richiesto per Ollama) [env: LLM_SERVER_URL]
  --temperature TEMPERATURE, -t TEMPERATURE
                         Temperatura di campionamento LLM (0-2). Valori più alti rendono l'output più casuale [default: 1, env: LLM_TEMPERATURE]
  --api-key API-KEY, -k API-KEY
                         Chiave API LLM [env: LLM_API_KEY]
  --cloud-location CLOUD-LOCATION
                         Regione della posizione cloud LLM (richiesta per Vertex AI di GCP) [env: LLM_CLOUD_LOCATION]
  --cloud-project CLOUD-PROJECT
                         ID del progetto cloud LLM (richiesto per Vertex AI di GCP) [env: LLM_CLOUD_PROJECT]
  --interface INTERFACE, -i INTERFACE
                         Interfaccia su cui servire
  --config-file CONFIG-FILE, -c CONFIG-FILE
                         Percorso del file di configurazione [default: config/config.yaml]
  --rules-config-file RULES-CONFIG-FILE, -r RULES-CONFIG-FILE
                         Percorso del file di configurazione delle regole (motore regole disabilitato se omesso)
  --event-log-file EVENT-LOG-FILE, -o EVENT-LOG-FILE
                         Percorso del file di log degli eventi [default: event_log.json]
  --cache-db-file CACHE-DB-FILE, -f CACHE-DB-FILE
                         Percorso del file di database per la cache delle risposte [default: cache.db]
  --cache-duration CACHE-DURATION, -d CACHE-DURATION
                         Durata della cache per le risposte generate (in ore). Usa 0 per disabilitare la cache e -1 per cache illimitata (nessuna scadenza). [default: 24]
  --log-level LOG-LEVEL, -l LOG-LEVEL
                         Livello di log (debug, info, error, fatal) [default: info]
  --suricata-enabled     Abilita il controllo delle regole HTTP Suricata (default: false)
  --suricata-rules-dir SURICATA-RULES-DIR
                         Directory contenente file .rules Suricata per controllare le richieste HTTP
  --help, -h             mostra questo aiuto ed esci

Esecuzione in Docker

  • Assicurati di avere Docker CE o EE installato localmente.
  • Clona il repository e costruisci l'immagine docker.
  • Puoi montare una directory locale nel contenitore per salvare i log.
  • Esegui il contenitore docker.
root@kitploit:~
% git clone [email protected]:0x4D31/galah.git
% cd galah
% mkdir logs
% export LLM_API_KEY=tua-chiave-api
% 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

Esempio di Utilizzo

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
Nota: L'uso non necessario di -X o --request, POST è già dedotto.
*   Tentativo 127.0.0.1:8888...
* Connesso a 127.0.0.1 (127.0.0.1) porta 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 completamente inviato: 64 byte

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

Log eventi 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"
}

Vedi altri esempi qui.

Utilizzo Come Libreria

Il pacchetto galah può essere utilizzato come libreria standalone. Crea un galah.Service e chiama GenerateHTTPResponse con una http.Request per produrre una risposta. Se ConfigFile, EventLogFile o CacheDBFile vengono omessi, vengono utilizzati i loro percorsi predefiniti (config/config.yaml, event_log.json e cache.db). Specifica RulesConfigFile per abilitare il controllo delle regole; lasciarlo vuoto disabilita completamente il motore delle regole. Options.Logger può essere fornito con un *log.Logger; se nil, Galah crea un logger di testo predefinito.

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", // ometti per disabilitare il motore regole
    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))

Puoi anche costruire un servizio a partire da una configurazione già caricata:

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", // usa il default se vuoto
    CacheDBFile:  "cache.db",       // usa il default se vuoto
    Logger:       log.NewWithOptions(os.Stderr, log.Options{}),
})

Per disattivare completamente il controllo delle regole, ometti RulesConfigFile quando crei un servizio o passa nil/uno slice vuoto a NewServiceFromConfig. Qualsiasi campo di opzione non utilizzato può essere lasciato vuoto per fare affidamento sui valori predefiniti.

Il servizio espone anche metodi helper per la cache e la registrazione degli eventi quando usato come libreria:

root@kitploit:~
respBytes, _ := svc.CheckCache(req, "8080") // restituisce nil se non c'è entry in cache

svc.LogEvent(req, llm.JSONResponse{Headers: map[string]string{"Content-Type": "text/plain"}, Body: "hi"}, "8080", "llm", nil)
Scarica lo strumento