
beelzebub v3.9.1
Un framework d'exécution de leurres low code sécurisé, exploitant l'IA pour la virtualisation des systèmes.
Beelzebub
Framework d'exécution de leurre
Beelzebub est un runtime de leurre open source qui déploie des services leurres adaptatifs propulsés par LLM sur les protocoles SSH, HTTP, TCP, TELNET et MCP. Il va au-delà des honeypots passifs en engageant activement les attaquants dans des interactions réalistes, en collectant des renseignements sur les menaces de haute fidélité et en détectant les attaques par injection de prompt contre les agents IA.

Table des matières
- Beelzebub
Fonctionnalités clés
- Moteur de leurre adaptatif : l'intégration LLM (OpenAI, Ollama) génère des réponses contextuellement précises en temps réel, maintenant les attaquants engagés assez longtemps pour collecter des TTP exploitables
- Définition de services low-code : configuration basée sur YAML avec correspondance de commandes par expressions régulières — aucun code personnalisé requis pour déployer un nouveau service leurre
- Couverture multi-protocoles : SSH, HTTP, TCP, TELNET, MCP — des cibles d'infrastructure aux surfaces d'attaque des agents IA
- Système de plugins extensible : implémentez l'interface
CommandPluginouHTTPPluginet enregistrez-la viainit()— aucune modification du cœur requise - Pile d'observabilité complète : métriques Prometheus, flux d'événements RabbitMQ
- Runtime prêt pour la production : Docker, Kubernetes (Helm), arrêt propre, limites de mémoire par service
Démonstration de leurre LLM

Démarrage rapide
Installeur```bash
./install.sh # asks local or Docker, checks prerequisites, and starts it
Non interactif : `./install.sh --local` ou `./install.sh --docker`. Utilisez
`./install.sh --local --no-run` pour installer et compiler sans démarrer l’exécution
locale. Sur les hôtes non root, l’installation locale ne démarre pas automatiquement lorsque la
configuration par défaut inclut des ports privilégiés.
### Local (Go)```bash
make start # installs any declared plugins, compiles them in, and runs
Docker```bash
make docker # builds an image with declared plugins baked in, then runs it
### Utilisation de Helm (Kubernetes)```bash
helm install beelzebub ./beelzebub-chart
# Upgrade:
helm upgrade beelzebub ./beelzebub-chart
Référence CLI
Beelzebub est fourni avec une CLI structurée. Exécutez beelzebub --help pour voir toutes les commandes disponibles.
beelzebub run
Démarrez tous les services de leurre configurés.```bash beelzebub run [flags]
Flags: -c, --conf-core string Path to core configuration file (default "./configurations/beelzebub.yaml") -s, --conf-services string Path to services configuration directory (default "./configurations/services/") -m, --mem-limit-mib int Memory limit in MiB, -1 to disable (default 100)
### `beelzebub validate`
Analyse et valide tous les fichiers de configuration sans démarrer aucun service. Utile dans les pipelines CI. Voir [Validation de la configuration](https://github.com/beelzebub-labs/beelzebub/blob/HEAD/docs/configuration-validation.md) pour l'architecture de validation et la référence des règles.```bash
beelzebub validate --conf-core ./configurations/beelzebub.yaml --conf-services ./configurations/services/
beelzebub plugin
Installer, lister et supprimer des plugins récupérés depuis GitHub. Voir Système de plugins.```bash beelzebub plugin install github.com/your-org/beelzebub-myplugin beelzebub plugin list beelzebub plugin remove myplugin
### `beelzebub version`
Affiche la version, le SHA du commit, la date de build et les informations sur le runtime Go.```bash
beelzebub version
Système de plugins
Beelzebub expose un SDK public stable dans pkg/plugin pour étendre le runtime de déception sans modifier le code central.
Interfaces```go
// CommandPlugin generates text responses for SSH, TCP, TELNET, and HTTP services. type CommandPlugin interface { Metadata() Metadata Execute(ctx context.Context, req CommandRequest) (string, error) }
// HTTPPlugin generates full HTTP responses with status code, headers, and body. type HTTPPlugin interface { Metadata() Metadata HandleHTTP(r *http.Request) HTTPResponse }
### Écrire un plugin```go
package myplugin
import (
"context"
"github.com/beelzebub-labs/beelzebub/v3/pkg/plugin"
)
type MyPlugin struct{}
func (p *MyPlugin) Metadata() plugin.Metadata {
return plugin.Metadata{
Name: "MyPlugin",
Description: "Custom deception response generator",
Version: "1.0.0",
Author: "your-name",
}
}
func (p *MyPlugin) Execute(_ context.Context, req plugin.CommandRequest) (string, error) {
return "simulated response to: " + req.Command, nil
}
func init() {
plugin.Register(&MyPlugin{})
}
Installation de plugins externes```bash
Declare plugins in configurations/plugins.yaml, or:
beelzebub plugin install github.com/your-org/myplugin # also appends to the config
make start # local: install declared plugins → build → run (needs Go) make docker # docker: image with plugins baked in → run (needs Docker)
| Commande | Rôle |
|---|---|
| `plugin install <link>` | récupère un plugin, l'intègre, reconstruit ; l'ajoute également à `configurations/plugins.yaml` |
| `plugin install` | installe tout ce qui est déclaré dans `configurations/plugins.yaml` |
| `plugin list` | affiche les plugins installés par rapport à ceux compilés dans le binaire |
| `plugin update [name]` | récupère à nouveau à la réf. déclarée et re-épingle le commit |
| `plugin remove <name>` | supprime un plugin de `configurations/plugins.yaml`, le débranche et affiche l'étape de reconstruction |
Les sources des plugins de déploiement sont configurées dans `configurations/plugins.yaml` :```yaml
plugins:
- source: github.com/your-org/myplugin
- source: github.com/your-org/[email protected]
La future configuration d'exécution par plugin peut se trouver sous configurations/plugins/
sous la forme d'un fichier YAML par plugin.
Chaque dépôt de plugin doit fournir un manifeste plugins.yaml et s'auto-enregistrer dans init()
(voir Écriture d'un plugin):```yaml
name: myplugin
version: 1.0.0
module: github.com/your-org/myplugin # must match its go.mod
entrypoint: . # package that calls plugin.Register (default ".")
min-core-version: v3.8.0 # optional
dependencies: # optional metadata; Go dependencies still come from go.mod
- github.com/your-org/[email protected]
Les plugins installés sont compilés dans le binaire Beelzebub et s'exécutent dans le même processus que le runtime. N'installez les plugins qu'à partir de dépôts de confiance.
## Observabilité
### Métriques Prometheus
Beelzebub expose les métriques Prometheus sur le point de terminaison configuré (par défaut : `:2112/metrics`) :
| Métrique | Description |
|--------|-------------|
| `beelzebub_events_total` | Total des événements de déception sur tous les services |
| `beelzebub_events_ssh_total` | Événements SSH |
| `beelzebub_events_http_total` | Événements HTTP |
| `beelzebub_events_tcp_total` | Événements TCP |
| `beelzebub_events_telnet_total` | Événements TELNET |
| `beelzebub_events_mcp_total` | Événements MCP |
### Intégration RabbitMQ
Publiez tous les événements de déception dans une file de messages pour une intégration SIEM en aval :```yaml
core:
tracings:
rabbit-mq:
enabled: true
uri: "amqp://guest:guest@localhost:5672/"
Les événements sont publiés sous forme de JSON structuré dans la file d'attente event.
Tests```bash
Unit tests
make test.unit
Integration tests (requires Docker)
make test.dependencies.start make test.integration make test.dependencies.down
Validate configuration without starting services
beelzebub validate
## Qualité du code
- **CI** : GitHub Actions à chaque commit et pull request
- **Analyse statique** : CodeQL et Go Report Card
- **Couverture** : surveillée via [Codecov](https://codecov.io/gh/beelzebub-labs/beelzebub)
- **Revue de code** : toutes les contributions passent par une revue par les pairs
## Licence
Beelzebub est sous licence [GNU GPL v3](https://github.com/beelzebub-labs/beelzebub/blob/HEAD/LICENSE).
## Contribuer
L’équipe Beelzebub accueille favorablement les contributions et la participation au projet. Que vous souhaitiez signaler des bogues, contribuer de nouvelles fonctionnalités ou poser des questions, veuillez consulter notre [Guide du contributeur](https://github.com/beelzebub-labs/beelzebub/blob/HEAD/CONTRIBUTING.md) pour des informations détaillées. Nous encourageons tous les participants et mainteneurs à adhérer à notre [Code de conduite](https://github.com/beelzebub-labs/beelzebub/blob/HEAD/CODE_OF_CONDUCT.md) et à favoriser une communauté solidaire et respectueuse.
Bon hacking !
## Référence de configuration
Beelzebub utilise un système de configuration à deux niveaux :
1. **Configuration principale** (`beelzebub.yaml`) paramètres globaux : journalisation, tracing, Prometheus
2. **Configurations de services** (`services/*.yaml`) un fichier par service leurre
### Configuration principale```yaml
core:
logging:
debug: false
debugReportCaller: false
logDisableTimestamp: true
logsPath: ./logs
tracings:
rabbit-mq:
enabled: false
uri: "amqp://guest:guest@localhost:5672/"
prometheus:
path: "/metrics"
port: ":2112"
Les variables d'environnement peuvent remplacer tous les champs (par exemple BEELZEBUB_RABBITMQ_ENABLED). Les configurations de services peuvent également être fournies entièrement via BEELZEBUB_SERVICES_CONFIG sous forme de tableau JSON.
Configuration des services
Chaque service leurre est défini dans un fichier YAML séparé placé dans le répertoire services/. Le champ protocol détermine le moteur de leurre utilisé. Les commandes utilisent regex pour la correspondance des requêtes et soit un handler statique, soit une référence plugin pour les réponses dynamiques.
Lorsque vous utilisez le plugin LLMHoneypot, il est fortement recommandé d'utiliser des garde-fous pour empêcher le LLM d'être « jailbroken » ou autrement manipulé de manières qui pourraient compromettre le honeypot. Consultez la documentation du plugin LLMHoneypot pour plus de détails.
Services de leurre
Service de leurre MCP
Les services de leurre MCP (Model Context Protocol) exposent des outils leurres conçus pour détecter les attaques par injection de prompt contre les agents propulsés par LLM.
Fonctionnement
L'outil leurre est enregistré dans la liste d'outils de l'agent mais ne devrait jamais être invoqué en fonctionnement normal. Toute invocation signale qu'une attaque par injection de prompt a contourné avec succès les garde-fous de l'agent. Cela permet de :
- Détection en temps réel du contournement des garde-fous alerte instantanée lorsqu'un attaquant convainc l'agent d'invoquer un outil restreint
- Collecte authentique des prompts d'attaque chaque activation journalise le prompt malveillant exact utilisé
- Métriques mesurables de la surface d'attaque suivi de HAR, TPR et MTP au fil du temps

mcp-8000.yaml:```yaml apiVersion: "v1" protocol: "mcp" address: ":8000" description: "MCP Honeypot" tools:
- name: "tool:user-account-manager"
description: "Tool for querying and modifying user account details. Requires administrator privileges."
params:
- name: "user_id" description: "The ID of the user account to manage."
- name: "action" description: "The action to perform on the user account, possible values are: get_details, reset_password, deactivate_account" handler: | { "tool_id": "tool:user-account-manager", "status": "completed", "output": { "message": "Tool 'tool:user-account-manager' executed successfully. Results are pending internal processing and will be logged.", "result": { "operation_status": "success", "details": "email: [email protected], role: admin, last-login: 02/07/2025" } } }
- name: "tool:system-log"
description: "Tool for querying system logs. Requires administrator privileges."
params:
- name: "filter" description: "The input used to filter the logs." handler: | { "tool_id": "tool:system-log", "status": "completed", "output": { "message": "Tool 'tool:system-log' executed successfully.", "result": { "operation_status": "success", "details": "Info: email: [email protected], last-login: 02/07/2025" } } }
Accessible via `http://beelzebub:port/mcp` (transport HTTP Streamable).
### Service HTTP de déception
Les services de déception HTTP répondent aux requêtes web avec des réponses configurables basées sur la correspondance de motifs d'URL. Prend en charge TLS, les gestionnaires statiques, les réponses basées sur LLM et le générateur de labyrinthe infini.
**Simulation WordPress** (`http-80.yaml`):```yaml
apiVersion: "v1"
protocol: "http"
address: ":80"
description: "Wordpress 6.0"
commands:
- regex: "^(/index.php|/index.html|/)$"
handler: |
<html><header><title>Wordpress 6 test page</title></header>
<body><h1>Hello from Wordpress</h1></body></html>
headers:
- "Content-Type: text/html"
- "Server: Apache/2.4.53 (Debian)"
- "X-Powered-By: PHP/7.4.29"
statusCode: 200
- regex: "^(/wp-login.php|/wp-admin)$"
handler: |
<html><body>
<form method="post">
<input type="text" name="uname" placeholder="Username" required>
<input type="password" name="psw" placeholder="Password" required>
<button type="submit">Login</button>
</form>
</body></html>
headers:
- "Content-Type: text/html"
- "Server: Apache/2.4.53 (Debian)"
statusCode: 200
- regex: "^.*$"
handler: "<html><body><h1>Not found!</h1></body></html>"
headers:
- "Content-Type: text/html"
statusCode: 404
Service HTTP propulsé par LLM ajoutez un fallbackCommand avec plugin: LLMHoneypot pour générer des réponses dynamiques à toute requête non correspondante.
Générateur de labyrinthe infini utilisez plugin: MazeHoneypot pour déployer un listing de répertoire de style Apache qui s'étend à l'infini, piégeant les scanneurs automatisés et les robots d'exploration.
Service de leurre SSH
Les services de leurre SSH prennent en charge à la fois des réponses de commande statiques et des sessions interactives propulsées par LLM avec un historique de conversation par session.
SSH propulsé par LLM (OpenAI) :```yaml apiVersion: "v1" protocol: "ssh" address: ":2222" description: "SSH interactive GPT-4o" commands:
- regex: "^(.+)$" plugin: "LLMHoneypot" serverVersion: "OpenSSH" serverName: "ubuntu" passwordRegex: "^(root|qwerty|Smoker666|123456|jenkins|minecraft|sinus|alex|postgres|Ly123456)$" deadlineTimeoutSeconds: 60 plugin: llmProvider: "openai" llmModel: "gpt-4o" openAISecretKey: "sk-proj-1234"
**SSH propulsé par LLM** (Ollama local) :```yaml
apiVersion: "v1"
protocol: "ssh"
address: ":2222"
description: "SSH Ollama Llama3"
commands:
- regex: "^(.+)$"
plugin: "LLMHoneypot"
serverVersion: "OpenSSH"
serverName: "ubuntu"
passwordRegex: "^(root|qwerty|123456)$"
deadlineTimeoutSeconds: 60
plugin:
llmProvider: "ollama"
llmModel: "codellama:7b"
host: "http://localhost:11434/api/chat"
SSH statique:```yaml apiVersion: "v1" protocol: "ssh" address: ":22" description: "SSH interactive" commands:
- regex: "^ls$" handler: "Documents Images Desktop Downloads .m2 .kube .ssh .docker"
- regex: "^pwd$" handler: "/home/user"
- regex: "^uname -m$" handler: "x86_64"
- regex: "^docker ps$" handler: "CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES"
- regex: "^(.+)$" handler: "command not found" serverVersion: "OpenSSH" serverName: "ubuntu" passwordRegex: "^(root|qwerty|Smoker666)$" deadlineTimeoutSeconds: 60
### Service de leurre TELNET
Les services de leurre TELNET émulent des dispositifs à base de terminal (routeurs, commutateurs, systèmes hérités) avec un flux d'authentification complet et une intégration LLM.
**TELNET propulsé par LLM** :```yaml
apiVersion: "v1"
protocol: "telnet"
address: ":23"
description: "TELNET LLM"
commands:
- regex: "^(.+)$"
plugin: "LLMHoneypot"
serverName: "router"
passwordRegex: "^(admin|root|password|123456)$"
deadlineTimeoutSeconds: 120
plugin:
llmProvider: "openai"
llmModel: "gpt-4o"
openAISecretKey: "sk-1234"
Simulation statique Cisco IOS :```yaml apiVersion: "v1" protocol: "telnet" address: ":23" description: "Cisco IOS Router" commands:
- regex: "^show version$" handler: "Cisco IOS Software, Version 15.1(4)M4"
- regex: "^show ip interface brief$" handler: "Interface IP-Address Method Status Protocol\nFastEthernet0/0 192.168.1.1 YES NVRAM up up"
- regex: "^(.+)$" handler: "% Unknown command" serverName: "router" passwordRegex: "^(admin|cisco|password)$" deadlineTimeoutSeconds: 60
### Service de déception TCP
Les services de déception TCP couvrent les protocoles binaires et textuels : bases de données, courtiers de messages, services d'annuaire, accès distant, et plus encore. Prend en charge le mode bannière uniquement, la correspondance regex interactive et l'intégration LLM.
**Redis** :```yaml
apiVersion: "v1"
protocol: "tcp"
address: ":6379"
description: "Redis 7.0.12"
commands:
- regex: "^PING"
handler: "+PONG\r\n"
- regex: "^AUTH"
handler: "-ERR Client sent AUTH, but no password is set\r\n"
- regex: "^INFO"
handler: "$180\r\n# Server\r\nredis_version:7.0.12\r\nos:Linux 5.15.0-76-generic x86_64\r\ntcp_port:6379\r\n\r\n"
- regex: "^(.+)$"
handler: "-ERR unknown command\r\n"
deadlineTimeoutSeconds: 60
serverName: "redis-prod-01"
LDAP / Active Directory:```yaml apiVersion: "v1" protocol: "tcp" address: ":389" description: "Active Directory LDAP Domain Controller" banner: "0\x84\x00\x00\x00\x10\x02\x01\x01\x61\x84\x00\x00\x00\x07\x0a\x01\x00\x04\x00\x04\x00" commands:
- regex: "\x30.*\x60" handler: "0\x84\x00\x00\x00\x10\x02\x01\x01\x61\x84\x00\x00\x00\x07\x0a\x01\x00\x04\x00\x04\x00"
- regex: "\x30.*\x63" handler: "0\x84\x00\x00\x00\x2a\x02\x01\x02\x65\x84\x00\x00\x00\x21\x04\x00\x30\x84\x00\x00\x00\x00" deadlineTimeoutSeconds: 30 serverName: "DC01.corp.local"
**PostgreSQL propulsé par LLM** :```yaml
apiVersion: "v1"
protocol: "tcp"
address: ":5432"
description: "PostgreSQL 15.3"
commands:
- regex: "^(.+)$"
plugin: "LLMHoneypot"
deadlineTimeoutSeconds: 120
serverName: "pg-master"
plugin:
llmProvider: "openai"
llmModel: "gpt-4o"
openAISecretKey: "sk-proj-..."
prompt: "You are simulating a PostgreSQL 15.3 server. Respond to incoming TCP data as a PostgreSQL server would."
Des exemples de configurations supplémentaires sont disponibles dans configurations/services/ pour Memcached, MS-SQL, SMB, RDP, VNC et MQTT.
Avec le soutien de
