
Eigenständige SSH-Honeypot zur Erfassung von Angreiferinteraktionen und deren Umwandlung in strukturierte Sicherheitsinformationen.
SSHintel ist ein leichtgewichtiger SSH-Honeypot, der mit Python und Paramiko erstellt wurde. Er simuliert eine gefälschte Linux-Shell, um unbefugte Zugriffsversuche zu protokollieren, Anmeldedaten zu erfassen und das Verhalten von Angreifern in einer kontrollierten Umgebung zu analysieren.
ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami usw.)--tarpit-Modus, um Angreifer durch verzögerte Ausgabe auszubremsenSSHintel ist keine vollständige Bash/Linux-Shell. Es simuliert eine glaubwürdige Teilmenge gängiger Befehle, um Angreifer-Telemetrie zu sammeln. Befehle werden über eine leichtgewichtige Registry verteilt; das Hinzufügen eines Befehls bedeutet das Hinzufügen einer kleinen Handler-Funktion.
pip install -r requirements.txt
Hinweis: Der SSH-Hostschlüssel wird beim ersten Start automatisch generiert. Es ist keine manuelle Schlüsselerzeugung erforderlich.
Führen Sie den Honeypot mit einem bestimmten Port, Benutzernamen und Passwort aus:
python3 run.py serve --port 2222 --username user1 --password pass123
Der Standardport ist
2222und der Host ist0.0.0.0.
Der Honeypot generiert automatisch beim ersten Start einen SSH-Hostschlüssel unter static/server.key, falls noch keiner existiert. Es ist keine manuelle Schlüsselgenerierung erforderlich.
Um den Tarpit-Modus zu aktivieren:
python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit
Um SQLite-Telemetrie zu deaktivieren (nur JSONL):
python3 run.py serve --port 2222 --username user1 --password pass123 --no-db
Sensor-Einstellungen verwenden CLI > Umgebung > Konfigurationsdatei > Standardwerte.
Nur explizit angegebene CLI-Flags überschreiben andere Quellen. Dies gilt für
serve; Dashboard-/Abfragebefehle behalten ihre eigenen CLI-Einstellungen.
Unter Python 3.11+:
cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve
Unter Python 3.8/3.10 verwenden Sie das abhängigkeitsfreie JSON-Äquivalent:
cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve
Bearbeiten Sie die kopierte Datei vor der Bereitstellung. TOML erfordert Python 3.11+; ältere
Versionen schlagen mit einer klaren Anweisung fehl, JSON zu verwenden. Ohne explizite Datei
sucht SSHintel im aktuellen Verzeichnis nach sshintel.toml, dann nach sshintel.json.
Verwenden Sie serve --config /path/to/settings.json oder HONEYPOT_CONFIG, um eine andere
Datei auszuwählen (--config hat Vorrang). Explizit fehlende Dateien, fehlerhafte Dateien, unbekannte Schlüssel
und ungültige Werte führen zum Abbruch, bevor der Server oder die Datenbank startet. Dateipfade innerhalb
der Konfiguration sind relativ zum Arbeitsverzeichnis des Prozesses, nicht zur Konfigurationsdatei.
| Dateischlüssel | Umgebungsvariable | Standardwert |
|---|---|---|
host | HONEYPOT_HOST | 0.0.0.0 |
port | HONEYPOT_PORT (Legacy-Alias: PORT) | 2222 |
username | HONEYPOT_USERNAME | user1 |
password | HONEYPOT_PASSWORD | pass123 |
tarpit | HONEYPOT_TARPIT | false |
tarpit_max_seconds | HONEYPOT_TARPIT_MAX_SECONDS | 120 |
max_connections | HONEYPOT_MAX_CONNECTIONS | 50 |
auth_timeout | HONEYPOT_AUTH_TIMEOUT | 60 |
session_idle_timeout | HONEYPOT_SESSION_IDLE_TIMEOUT | 300 |
sensor_id | HONEYPOT_SENSOR_ID | nicht gesetzt |
db_path | HONEYPOT_DB_PATH | data/sshintel.db |
no_db | HONEYPOT_NO_DB | false |
fetch_payloads | HONEYPOT_FETCH_PAYLOADS | false (reserviert) |
Umgebungs-Booleans akzeptieren true/false, 1/0, yes/no und on/off.
HONEYPOT_PORT hat Vorrang vor PORT. Ports müssen 1–65535 sein und Limits
sowie Timeouts müssen positive Ganzzahlen sein. Verwenden Sie --no-tarpit, --db-enabled oder
--no-fetch-payloads, um eine True-Einstellung mit niedrigerer Priorität zu überschreiben. Datenbankpfade
verwenden das bestehende --db-CLI-Flag. Das Abrufen von Payloads ist nicht implementiert: Das Aktivieren von
fetch_payloads wird abgelehnt, statt stillschweigend ignoriert zu werden.
Lokale sshintel.toml/sshintel.json-Dateien werden von Git ignoriert und von Docker-
Builds ausgeschlossen, da sie Anmeldedaten enthalten können. Binden Sie eine Konfigurationsdatei stattdessen
schreibgeschützt in einen Container ein. Docker verwendet Umgebungsvariablen direkt (ohne
Shell-Interpolation von Anmeldedaten); die vorhandenen ENV-Standardwerte haben Vorrang vor
einer eingebundenen Datei. Überschreiben Sie diese Variablen nach Bedarf oder verwenden Sie explizite CLI-Flags.
SSHintel schützt vor Ressourcenerschöpfung durch viele gleichzeitige Verbindungen oder Verbindungen, die unbegrenzt aufrechterhalten werden. Diese sind über die CLI konfigurierbar:
| Flag | Standardwert | Zweck |
|---|---|---|
--max-connections | 50 | Maximale Anzahl gleichzeitig aktiver Verbindungen; zusätzliche Verbindungen werden abgelehnt und als connection_rejected-Ereignis protokolliert |
--auth-timeout | 60 (s) | Zeit, die zum Abschluss des SSH-Handshakes/der Authentifizierung erlaubt ist; hängende Clients werden getrennt |
--session-idle-timeout | 300 (s) | Inaktivitäts-Timeout für eine authentifizierte Shell; eine inaktive Sitzung wird beendet, aber ein aktiv tippender Angreifer wird niemals getötet |
Beispiel:
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
Wenn zu viele Verbindungen geöffnet sind, wird die zusätzliche Verbindung sofort geschlossen und ein Sicherheitsereignis connection_rejected (mit reason: connection_limit) in das JSONL-Protokoll geschrieben. Eine stockende Authentifizierung wird als Trennung mit reason: auth_timeout aufgezeichnet; eine inaktive Shell endet mit reason: idle_timeout.
Der Tarpit-Modus sendet absichtlich langsam Ausgaben, um einen Angreifer beschäftigt zu halten, daher unterliegt die Tarpit-Banner-Schleife nicht dem Inaktivitäts-Timeout – aber Tarpit-Sitzungen zählen sehr wohl gegen das Verbindungslimit.
SSHintel enthält ein lokales Web-Dashboard, das die in SQLite gespeicherte Sicherheitstelemetrie visualisiert.
python3 run.py dashboard
Öffne anschließend http://localhost:5000 in deinem Browser.