Zurück zu den Updates
New releaseJul 21, 2026

honeyprompt v0.1.8

LLM-first Täuschungsframework: "Das Honeypot, das zurückredet!™"

Teilen

honeyprompt

banner

Einführung von honeyprompt, einem LLM-zentrierten Täuschungsframework, das speziell für Webentwickler entwickelt wurde. Das persönliche Leidenschaftsprojekt von @alectrocute.

Unterstützt alle großen Cloud- und lokalen LLM-Anbieter. SSH, HTTP, TLS, TCP, Telnet und mehr. Es wird als kleiner Container (und als einzelnes statisches Binärprogramm) ausgeliefert und hält alle Einstellungen in einer honeyprompt.yaml.

Keine Plugins zu kompilieren, keine Datenbank zu betreiben, leicht erweiterbar und auf Low-End-Hardware einsetzbar.

Demo-Instanz

Eine Demo-Instanz ist verfügbar unter 172.233.151.216, mit dem nicht authentifizierten Web-Panel unter: http://172.233.151.216:9090. Es ist eine öffentliche Instanz von honeyprompt, die auf einem günstigen Linode VPS läuft, mit openrouter/free als einzigem LLM-Anbieter/Modell.

Schnellstart

Für die einfachste Einrichtung im Jahr 2026 empfehlen wir Docker und OpenRouter/openrouter/free als LLM-Anbieter. Alle großen Cloud- und lokalen LLM-Anbieter werden unterstützt. Drei Dateien und ein Befehl richten die vollständige Standardbereitstellung ein: sieben LLM-gestützte Täuschungsmodule, dauerhafte Ereignisspeicherung und das Operator-Panel.

1. Holen Sie sich die Standardkonfiguration, die Compose-Datei und die Umgebungsvorlage:

# Wenn Sie Docker nicht haben:
# curl -fsSL get.docker.com -o get-docker.sh && sh get-docker.sh

mkdir honeypot && cd honeypot
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/honeyprompt.yaml
wget https://raw.githubusercontent.com/alectrocute/honeyprompt/main/compose.yaml
wget -O .env https://raw.githubusercontent.com/alectrocute/honeyprompt/main/.env.example

(Oder klonen Sie das Repository und wechseln Sie mit cd hinein – dieselben drei Dateien.)

2. Füllen Sie .env aus. Zwei Werte sind erforderlich:

OPENROUTER_API_KEY=sk-or-...            # Verwenden Sie einen dedizierten Schlüssel mit einem Ausgabenlimit
HONEYPROMPT_PANEL_PASSWORD=changeme     # Basic-Auth-Passwort für das Panel

3. Starten Sie es:

docker compose up -d

4. Testen Sie es:

ssh -p 2222 root@localhost            # Passwort: root — dann geben Sie irgendetwas ein
curl http://localhost:2375/v1.54/containers/json   # "freigegebene" Docker-API

5. Beobachten Sie es live im schreibgeschützten Panel unter http://127.0.0.1:9090 (melden Sie sich mit admin und Ihrem Panel-Passwort an). Jede Verbindung, jeder Anmeldeversuch und jeder Befehl wird live übertragen. Wenn Sie auf einem entfernten Host bereitstellen, müssen Sie den Port :9090 in der compose.yaml freigeben. Dies wird für Produktionsumgebungen nicht empfohlen.

Verwenden Sie für Produktionsumgebungen einen nummerierten Release anstelle von latest – setzen Sie dazu HONEYPROMPT_IMAGE in der .env.

Die honeyprompt.yaml, die Sie gerade heruntergeladen haben, ist eine vollständig kommentierte Demo. Sie enthält Profile für:

  • Einen generischen Unternehmens-Webserver – Port 80, das breiteste Netz; / liefert sofort die Standard-Nginx-Willkommensseite, und tiefere Pfade werden zur LLM weitergeleitet, die vollständige HTML/CSS-Intranetseiten, Anmeldeformulare und Admin-Panels erstellt, die den Angreifer bei der Stange halten.
  • MCP / Agent-Gateways – Streamable HTTP Discovery, OAuth-Metadaten, JSON-RPC-Tool-Aufrufe und verlockende Produktionstools.
  • Docker Engine API 29.5 – die nicht authentifizierte Port-2375-Oberfläche, die von echten Cloud-Würmern verwendet wird.
  • Kubernetes API v1.36 – Namespace, Workload, Secret, ConfigMap und RBAC-Discovery.
  • Ubuntu 26.04 AI Build-Infrastruktur – SSH, GPU-Workloads, Docker, kubeconfigs, CI-Status und Anbieterzugangsdaten.
  • Redis 8.8 – häufige RESP-Abfragen, die für Credential Diebstahl, Persistenz und seitliche Bewegung verwendet werden.
  • Industrielle Edge / OT – eine absichtlich veraltete Telnet-Verwaltungsebene, da moderne Verteidigung immer noch Angriffe auf alte Infrastruktur abfangen muss.

Betrieb ohne LLM

[!WICHTIG] Auch wenn Sie LLMs verwenden: Bestimmen Sie die am häufigsten verwendeten Pfade und fügen Sie statische Regeln für diese hinzu. Dies spart Ihnen massive Mengen an LLM-Token und beschleunigt Antworten auf Anfragen, die die Kosten eines LLM-Aufrufs nicht wert sind. Zufällige Beispiele: whoami, Gesundheitschecks, favicon, Versionsabfragen usw.

Diese minimale honeyprompt.yaml simuliert eine SSH-Box mit zwei statischen Regeln und ohne LLM:

panel:
  enabled: true
  address: "0.0.0.0:8080"

events:
  buffer: 2000
  file: /data/events.jsonl # dauerhafte Angreiferaktivität

services:
  - protocol: ssh
    address: "0.0.0.0:2222"
    description: "Ubuntu 26.04 LTS Build Runner"
    serverName: "gpu-runner-07"
    passwordRegex: "^(root|admin|123456)$" # welche Passwörter "funktionieren"
    commands:
      - regex: "^whoami$"
        handler: "root"
      - regex: "^(.+)$"
        handler: "bash: command not found"
docker run --rm \
  -p 2222:2222 -p 8080:8080 \
  -v "$(pwd)/honeyprompt.yaml:/etc/honeyprompt/honeyprompt.yaml:ro" \
  -v honeyprompt-data:/data \
  alectrocute/honeyprompt:latest

Bereitstellung

Für eine dauerhafte Bereitstellung verwenden Sie die beiliegende compose.yaml. Der Bereitstellungsleitfaden behandelt Docker-Hub-Releases, erforderliche GitHub-Geheimnisse, Port- und Firewall-Einrichtung, Panel-Zugriff über SSH, Upgrades, Rollback, Ereignisspeicherung und Isolation.

Warum LLM-zentrierte Täuschung – kurz erklärt

Ein Honeypot muss nur eines gut können: überzeugend genug bleiben, damit der Angreifer weitertippt. Jeder Befehl, den er ausführt, ist Geheimdienstinformation – die Tools, nach denen er greift, die Anmeldedaten, die er wiederverwendet, die CVEs, von denen er annimmt, dass Sie sie nicht gepatcht haben. Statische Honeypots brechen aus der Rolle, sobald jemand einen Befehl ausführt, den der Autor nicht vorhergesehen hat. Honeyprompt übergibt diesen Moment einer LLM, sodass die Shell dmesg | tail oder cat /etc/shadow so beantwortet, wie es eine echte tun würde, und die Sitzung läuft weiter.

Sehen Sie sich Adel Karimis hervorragenden DEF CON 32 Vortrag über Galah, den (ersten?) LLM-Honeypot, an, der dieses Projekt inspiriert hat: https://www.youtube.com/watch?v=XGsm4Qcc_Ag

Was protokolliert wird: zwei getrennte Datenströme

Dies ist der Teil, den Sie vorab verstehen sollten, da die beiden Ströme bewusst getrennt gehalten werden:

  • Täuschungsereignisse: Jede Angreiferinteraktion: Verbindungen, Authentifizierungsversuche, jeder Befehl oder jede Anfrage, die von honeyprompt zurückgesendete Antwort, welcher Anbieter und welches Modell geantwortet haben und wie lange es dauerte. Dies ist Ihre Bedrohungsinformation. Sie wird in einem begrenzten In-Memory-Puffer für das Live-Panel gehalten, und Sie können alles auf der Festplatte speichern.
  • Betriebsprotokolle: Start, gebundene Ports, Anbieterfehler, Herunterfahren, interne Fehler. Dies lesen Sie, wenn die Laufzeit sich fehlerhaft verhält. Es hat nichts mit der Angreiferaktivität zu tun.

Sie konfigurieren sie getrennt:

# Der Honig: Angreiferaktivität.
events:
  buffer: 2000 # letzte Ereignisse im Speicher für das Panel
  file: /data/events.jsonl # jedes Ereignis als JSON Lines speichern

# Die eigenen Diagnosen der Laufzeit.
logging:
  level: info # debug | info | warn | error
  format: text # wie es auf der Konsole aussieht: text (für Menschen) oder json
  file: /data/honeyprompt.log # optional; auf der Festplatte immer JSON

events.jsonl ist ein in sich geschlossenes JSON-Objekt pro Zeile – bereit für tail -f, Versand an ein SIEM oder Wiedergabe mit jq. Die Docker-Befehle oben mounten das benannte Volume honeyprompt-data bei /data, sodass Ereignisse einen Containerwechsel überleben. Beide Dateien werden angehängt und bei einem sauberen Herunterfahren geleert.

format beeinflusst nur, wie Betriebsprotokolle auf der Konsole dargestellt werden; die Betriebsprotokoll-Datei ist, falls aktiviert, immer strukturiertes JSON, damit sie einfach zu parsen ist.

Das Web-Panel

Screenshot

Ein optionales, schreibgeschütztes Dashboard, das Täuschungsereignisse in Echtzeit anzeigt, sie nach Protokoll aufschlüsselt und mit einem Klick alles als JSON exportiert:

panel:
  enabled: true
  address: "0.0.0.0:8080"
  auth: # optionales Basic Auth
    username: admin
    password: "${HONEYPROMPT_PANEL_PASSWORD}"

Das Dashboard besteht aus einfachem HTML, CSS und JavaScript (src/panel/assets), die in die Binärdatei eingebettet sind. Lassen Sie auth undefiniert, um die Authentifizierung zu deaktivieren.

Anbieter

Jeder Anbieter ist ein eigenes Modul mit eigenen Timeouts, Wiederholungen, Ratenbegrenzungen und Headern. Schlüssel stammen aus der Umgebung. Von Haus aus:

AnbietertypeAnmerkungen
OllamaollamaLokale Modelle; Standard: localhost:11434
llama.cppllamacppLokaler server OpenAI-Endpunkt
OpenAIopenaiOPENAI_API_KEY
Azure OpenAIazurebenötigt azure.deployment + azure.apiVersion
OpenRouteropenrouterOPENROUTER_API_KEY
AnthropicanthropicANTHROPIC_API_KEY
Google GeminigoogleGEMINI_API_KEY
Alles, was OpenAI-ähnlich istopenai-compatibleSetzen Sie baseUrl auf Ihr Gateway

Lastausgleich und Failover

Konfigurieren Sie Anbieter, wählen Sie eine pool.strategy (round-robin, weighted, random oder failover), und honeyprompt verteilt den Datenverkehr auf sie. Wenn der ausgewählte Anbieter timeoutet oder einen wiederholbaren Fehler zurückgibt, wechselt honeyprompt transparent zum nächsten – ein ausgefallener Backend bringt den Honeypot nie offline. Nicht wiederholbare Fehler (z. B. ein ungültiger API-Schlüssel) stoppen die Kaskade, damit Sie es erfahren, anstatt stillschweigend Kontingente zu verbrauchen.

Dienste verwenden den globalen Pool, es sei denn, sie benennen eine eigene Anbieteruntermenge:

llm:
  enabled: true
  providers: [local-ollama] # ein Name: erzwingt diesen Dienst für diesen Anbieter

Listen Sie mehrere Namen auf, um Lastausgleich und Failover zu behalten, jedoch nur innerhalb dieser Untermenge:

llm:
  enabled: true
  providers: [openai-primary, openrouter-backup]

Benannte Pools

Wenn mehrere Dienste dieselbe Anbietergruppe teilen sollen – oder eine Untermenge eine eigene Strategie anstelle der globalen benötigt – definieren Sie einen benannten Pool. Ein Pool hat einen Namen, eine Strategie und eine geordnete Anbieterliste, und ein Dienst referenziert ihn mit dem Namen an jeder Stelle, an der er einen Anbieter nennen würde:

pools:
  - name: cheap-first
    strategy: failover # zuerst das lokale Modell versuchen, auf die kostenpflichtige API zurückfallen
    order: [local-ollama, openrouter]
  - name: spread
    strategy: round-robin
    order: [openrouter, openai]

services:
  - protocol: ssh
    # ...
    llm:
      enabled: true
      providers: [cheap-first] # ein Pool-Name, anstelle eines Anbieters
  - protocol: http
    # ...
    llm:
      enabled: true
      providers: [spread]

Ein Pool-Name muss der einzige Eintrag in providers sein – das Mischen eines Pools mit einzelnen Anbietern in einer Liste ist nicht erlaubt, da nicht eindeutig wäre, welche Strategie gewinnt. Pool-Namen leben im selben Namensraum wie Anbieter-Namen und dürfen nicht mit diesen kollidieren.

Erweitern von Antworten mit Hooks

Wenn "Regex abgleichen" oder "Modell fragen" nicht ausreicht, ermöglichen Hooks das Einfügen Ihres eigenen TypeScripts in den Anfrage- und Antwortpfad. Ein Hook kann die Eingabeaufforderung vor dem Erreichen des Modells umschreiben oder die Antwort vor dem Erreichen des Angreifers umschreiben.

import { registerHook } from "./src/engine/hooks.ts";

registerHook({
  name: "fake-latency-notice",
  transformResponse(response, ctx) {
    if (ctx.protocol === "ssh" && /rm -rf/.test(ctx.input)) {
      return "rm: cannot remove '/': Operation not permitted\n";
    }
    return response;
  },
});

Referenzieren Sie ihn mit seinem Namen aus der hooks:-Liste eines beliebigen Dienstes. Ein integrierter Hook redact-secrets ist in der Beispielkonfiguration aktiviert, sodass das Modell niemals echte Anmeldedaten zurückgeben kann.

Metriken

Prometheus-Metriken werden unter /metrics im Panel bereitgestellt (nicht authentifiziert, damit Scraper einfach funktionieren):

honeyprompt_events_total{protocol="ssh"}                          412
honeyprompt_llm_requests_total{provider="openai",protocol="ssh"}  118
honeyprompt_auth_attempts_total{protocol="ssh"}                    87
honeyprompt_engine_errors_total{protocol="http"}                   0

Aus Quellcode erstellen

Möchten Sie beitragen oder eine native Binärdatei? Sie benötigen Deno 2.x – die einzige Abhängigkeit.

deno task check    # Typprüfung
deno task lint
deno task fmt
deno task test     # Unit- und Integrationstests

deno task start -- --config honeyprompt.yaml    # lokal ausführen
deno task dev   -- --config honeyprompt.yaml    # mit Dateiüberwachung ausführen
deno task compile                                # -> ./dist/honeyprompt (eigenständige Binärdatei)

deno compile backt die Laufzeit, Panel-Assets und alles in eine einzige ausführbare Datei ohne Abhängigkeiten. Vorkompilierte Binärdateien für Linux, macOS und Windows sind jedem getaggten Release beigefügt.

CI führt bei jedem Push Formatierung, Lint, Typprüfung, Tests, Konfigurationsvalidierung, ein plattformübergreifendes compile und einen Docker-Build durch. Das Taggen von vX.Y.Z erstellt Release-Binärdateien und veröffentlicht das mit Provenance- und SBOM-Attestaten versehene Multi-Arch-Image auf alectrocute/honeyprompt.

CLI

honeyprompt run [--config <Pfad>]        startet jeden konfigurierten Dienst (Standard)
honeyprompt validate [--config <Pfad>]   Konfiguration parsen und validieren, dann beenden – ideal für CI
honeyprompt version
honeyprompt help

--config standardmäßig ./honeyprompt.yaml oder $HONEYPROMPT_CONFIG, falls gesetzt (der Container setzt es auf /etc/honeyprompt/honeyprompt.yaml).

Ein Wort der Warnung für Benutzer und Mitwirkende

Dies ist ein Werkzeug zum Anlocken und Untersuchen von Angreifern auf Infrastruktur, die Ihnen gehört oder für die Sie autorisiert sind, Tests durchzuführen. Das Bereitstellen von Täuschungsdiensten bedeutet immer noch, Dienste bereitzustellen; führen Sie es auf isolierten Hosts aus, halten Sie es gepatcht und richten Sie es nicht auf etwas, das Sie sich nicht leisten können, durchsuchen zu lassen. Täuschung ist kein Ersatz für die eigentliche Absicherung des echten Systems.

Wenn Sie zu diesem Projekt beitragen und einen KI-Agenten verwenden oder stark auf generative Programmierung setzen möchten, ist das völlig in Ordnung – aber Sie werden PERSÖNLICH zu jeder einzelnen Codezeile befragt, die Sie anbieten, und wenn Sie kein sofortiges, KI-freies Verständnis demonstrieren, wird Ihr GESAMTER Beitrag abgelehnt und verworfen.

Lizenz

MIT.

Kategorien