
Exploit remoto de enumeración de nombres de usuario en OpenSSH para CVE-2018-15473, con scripts de ataque de paquetes malformados y de temporización, y escaneo multihilo.
OpenSSH hasta 7.7 permite a atacantes remotos enumerar nombres de usuario válidos enviando solicitudes de autenticación malformadas y observando respuestas diferenciales del servidor.
| Campo | Valor |
|---|---|
| Software afectado | OpenSSH 2.3 hasta 7.7 |
| CVSS v3.1 | 5.3 (Medio) |
| Vector de ataque | Red (remoto, sin autenticación requerida) |
| Causa raíz | El servidor no retrasa la salida para usuarios inválidos hasta después de analizar el paquete completo (auth2-gss.c, auth2-hostbased.c, auth2-pubkey.c) |
| Impacto | Divulgación de información — enumeración de nombres de usuario válidos |
exploit.py — Paquete Malformado (rápido, multihilo)Envía un SSH_MSG_USERAUTH_REQUEST truncado (campo booleano eliminado). Los usuarios inválidos provocan una salida temprana (USERAUTH_FAILURE), los usuarios válidos hacen que el servidor se desconecte.
exploit_timing.py — Ataque de Tiempos (más lento, funciona en servidores parcheados)Envía una contraseña muy larga (~100KB) mediante autenticación por contraseña. Los usuarios válidos tardan más porque el servidor calcula el hash de la contraseña antes de rechazar, mientras que los usuarios inválidos son rechazados inmediatamente. Se ejecuta secuencialmente y auto-calibra el umbral.
Úselo cuando exploit.py devuelva falsos positivos (servidores parcheados).
git clone <this-repo-url>
cd cve-2018-15473
pip install -r requirements.txt
# Malformed packet (try this first)
python3 exploit.py <target_ip> 22 <lhost> <lport> -u root
python3 exploit.py <target_ip> 22 <lhost> <lport> -w usernames.txt -t 8
# Timing attack (fallback for patched servers)
python3 exploit_timing.py <target_ip> 22 <lhost> <lport> -u root
python3 exploit_timing.py <target_ip> 22 <lhost> <lport> -w usernames.txt
| Argumento | Descripción |
|---|
target_ip | IP del servidor SSH objetivo |
target_port | Puerto SSH objetivo (generalmente 22) |
lhost | IP del atacante (no utilizada, mantenida para consistencia de plantilla) |
lport | Puerto del atacante (no utilizado, mantenido para consistencia de plantilla) |
-u, --username | Nombre de usuario único a probar |
-w, --wordlist | Ruta a un archivo de lista de palabras (un usuario por línea) |
-t, --threads | Número de hilos (predeterminado: 4, solo exploit.py) |