
Autonomous honeypot SSH autónomo para capturar interacciones de atacantes y convertirlas en inteligencia de seguridad estructurada.
SSHintel es un honeypot SSH ligero construido con Python y Paramiko. Simula una shell Linux falsa para registrar intentos de acceso no autorizados, capturar credenciales y analizar el comportamiento de los atacantes en un entorno controlado.
ls, cd, pwd, cat, echo, grep, find, tree, head, tail, wc, stat, ps, df, free, env, id, whoami, etc.)--tarpit para ralentizar a los atacantes con salida retardadaSSHintel no es una shell Bash/Linux completa. Simula un subconjunto creíble de comandos comunes para recopilar telemetría de los atacantes. Los comandos se despachan mediante un registro ligero; añadir un comando significa añadir una pequeña función manejadora.
pip install -r requirements.txt
Nota: La clave de host SSH se genera automáticamente en la primera ejecución. No se necesita generar claves manualmente.
Ejecute el honeypot con un puerto, nombre de usuario y contraseña específicos:
python3 run.py serve --port 2222 --username user1 --password pass123
El puerto predeterminado es
2222y el host es0.0.0.0.
El honeypot genera automáticamente una clave de host SSH en static/server.key en la primera ejecución si no existe. No se necesita generar la clave manualmente.
Para habilitar el modo tarpit:
python3 run.py serve --port 2222 --username user1 --password pass123 --tarpit
Para deshabilitar la telemetría de SQLite (solo JSONL):
python3 run.py serve --port 2222 --username user1 --password pass123 --no-db
La configuración del sensor sigue el orden CLI > entorno > archivo de configuración > valores predeterminados.
Solo los indicadores de CLI proporcionados explícitamente anulan las demás fuentes. Esto se aplica a
serve; los comandos de panel/consulta conservan su propia configuración de CLI.
En Python 3.11+:
cp sshintel.toml.example sshintel.toml
chmod 600 sshintel.toml
python3 run.py serve
En Python 3.8/3.10, utilice el equivalente JSON sin dependencias:
cp sshintel.json.example sshintel.json
chmod 600 sshintel.json
python3 run.py serve
Edita el archivo copiado antes del despliegue. TOML requiere Python 3.11+; las versiones
anteriores fallan con una instrucción clara de usar JSON. Sin un archivo explícito,
SSHintel busca sshintel.toml, luego sshintel.json en el directorio actual.
Usa serve --config /path/to/settings.json o HONEYPOT_CONFIG para seleccionar otro
archivo (--config tiene prioridad). Los archivos explícitos inexistentes, los archivos malformados, las claves desconocidas
y los valores inválidos fallan antes de que se inicie el servidor o la base de datos. Las rutas de archivo dentro de
la configuración son relativas al directorio de trabajo del proceso, no al archivo de configuración.
| Clave del archivo | Variable de entorno | Valor predeterminado |
|---|---|---|
host | HONEYPOT_HOST | 0.0.0.0 |
port | HONEYPOT_PORT (alias heredado: 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 | sin definir |
db_path | HONEYPOT_DB_PATH | data/sshintel.db |
no_db | HONEYPOT_NO_DB | false |
fetch_payloads | HONEYPOT_FETCH_PAYLOADS | false (reservado) |
Los booleanos de entorno aceptan true/false, 1/0, yes/no y on/off.
HONEYPOT_PORT tiene prioridad sobre PORT. Los puertos deben ser 1–65535 y los límites
y tiempos de espera deben ser enteros positivos. Usa --no-tarpit, --db-enabled o
--no-fetch-payloads para anular una configuración verdadera de menor prioridad. Las rutas de base de datos
usan la bandera CLI --db existente. La obtención de payloads no está implementada: habilitar
fetch_payloads se rechaza en lugar de ignorarse silenciosamente.
Los archivos locales sshintel.toml/sshintel.json están ignorados por Git y excluidos de las compilaciones
de Docker porque pueden contener credenciales. En su lugar, monta un archivo de configuración como solo lectura
en un contenedor. Docker consume las variables de entorno directamente (sin
interpolar credenciales en el shell); sus valores predeterminados ENV existentes tienen prioridad sobre
un archivo montado. Anula esas variables según sea necesario o usa banderas CLI explícitas.
SSHintel protege contra el agotamiento de recursos por muchas conexiones concurrentes o conexiones mantenidas activas indefinidamente. Estos son configurables mediante la CLI:
| Bandera | Valor predeterminado | Propósito |
|---|---|---|
--max-connections | 50 | Número máximo de conexiones activas simultáneas; las conexiones adicionales se rechazan y se registran como un evento connection_rejected |
--auth-timeout | 60 (s) | Tiempo permitido para completar el handshake/autenticación SSH; los clientes bloqueados se desconectan |
--session-idle-timeout | 300 (s) | Tiempo de espera por inactividad para un shell autenticado; una sesión inactiva se finaliza, pero un atacante que está escribiendo activamente nunca se elimina |
Ejemplo:
python3 run.py serve --port 2222 --username user1 --password pass123 \
--max-connections 25 --auth-timeout 30 --session-idle-timeout 300
Cuando hay demasiadas conexiones abiertas, la conexión adicional se cierra inmediatamente y se escribe un evento de seguridad connection_rejected (con reason: connection_limit) en el log JSONL. Una autenticación estancada se registra como una desconexión con reason: auth_timeout; un shell inactivo termina con reason: idle_timeout.
El modo tarpit envía la salida intencionalmente de forma lenta para mantener al atacante ocupado, por lo que el bucle del banner del tarpit no está sujeto al tiempo de espera por inactividad — pero las sesiones tarpit sí cuentan para el límite de conexiones.
SSHintel incluye un dashboard web local que visualiza la telemetría de seguridad almacenada en SQLite.
python3 run.py dashboard
Luego abre http://localhost:5000 en tu navegador.