
SSH username enumeration script based on timing differences and authentication responses. Exploits the same vector as CVE-2018-15473 on vulnerable versions of OpenSSH (≤ 7.7), though it can also reveal patterns in modern configurations.
script de enumeración de usuarios SSH basado en diferencias de timing y respuestas de autenticación. Explota el mismo vector que CVE-2018-15473 en versiones vulnerables de OpenSSH (≤ 7.7), aunque también puede revelar patrones en configuraciones modernas. Funciona en Python 3 + Paramiko y soporta:
Prelectura de banner para evitar errores de EOF/NoBanner.
Retries por intento y cooldown entre usuarios (para evadir tarpits/MaxStartups).
Autotune de parámetros (-m, -t) según el jitter del objetivo.
⚠️ Uso Ético
Este script debe usarse únicamente en entornos propios o con autorización explícita. El abuso contra sistemas externos sin permiso puede ser ilegal.
📖 Uso básico ./ssh_enum_py3.py -i -u users.txt -m <multiplier_ms> -t
Ejemplo: ./ssh_enum_py3.py -i 149.210.234.234 -u users.txt -m 5000 -t 8
⚙️ Opciones -i, --ip Host/IP objetivo (obligatorio) -p, --port Puerto SSH (default: 22) -u, --userlist Archivo con lista de usuarios (uno por línea)
-a, --autotune Calcula parámetros recomendados (multiplier y threshold) -m, --multiplier Umbral en milisegundos por encima de la mediana local -t, --threshold Número mínimo de “votos” (intentos que superan el cutoff)
--attempts Intentos por usuario (default: 12) --timeout Timeout de conexión/autenticación (s, default: 6) --banner-timeout Timeout para leer el banner SSH (s, default: 12) --delay Pausa entre intentos de un mismo usuario (s, default: 0.6) --cooldown-users Pausa entre usuarios (s, default: 0) --retries Reintentos por intento en caso de error de banner/transporte
🚀 Ejemplos de uso
Salida:
[*] Autotune sugerido: multiplier (ms): 4986 threshold : 8 baseline_med : 3586 ms (avg=3596 ms) error mix : {'AuthFailed': 12}
Autotune + enumeración en la misma corrida
./ssh_enum_py3.py -i 149.210.234.234 -a -u users.txt
--timeout 12 --banner-timeout 30 --delay 3 --cooldown-users 15
Enumeración directa con parámetros fijos
./ssh_enum_py3.py -i 149.210.234.234 -u users.txt -m 4986 -t 8
--attempts 10 --timeout 12 --banner-timeout 30 --retries 5 --delay 3 --cooldown-users 15
📋 Interpretación de resultados
likely VALID → Usuario probablemente existe (superó cutoff en ≥ threshold intentos).
likely INVALID → Usuario probablemente no existe (respuestas consistentes como “AuthFailed”).
errors={...} → resumen de códigos:
AuthFailed: respuesta normal de SSH.
NoBanner: el servidor cortó antes de banner (tarpit, MaxStartups, WAF).
TransportError: error de red/tiempo.