
O OpenSSH até a versão 7.7 permite que atacantes remotos enumerem nomes de usuário válidos enviando solicitações de autenticação malformadas e observando respostas diferenciais do servidor.
| Campo | Valor |
|---|---|
| Software Afetado | OpenSSH 2.3 até 7.7 |
| CVSS v3.1 | 5.3 (Médio) |
| Vetor de Ataque | Rede (remoto, sem autenticação necessária) |
| Causa Raiz | O servidor não adia a saída antecipada para usuários inválidos até que o pacote completo seja analisado (auth2-gss.c, auth2-hostbased.c, auth2-pubkey.c) |
| Impacto | Divulgação de informações — enumeração de nomes de usuário válidos |
exploit.py — Pacote Malformado (rápido, multi-thread)Envia um SSH_MSG_USERAUTH_REQUEST truncado (campo booleano removido). Usuários inválidos acionam uma saída antecipada (USERAUTH_FAILURE); usuários válidos fazem com que o servidor desconecte.
exploit_timing.py — Ataque de Temporização (mais lento, funciona em servidores corrigidos)Envia uma senha muito longa (~100KB) via autenticação por senha. Usuários válidos demoram mais porque o servidor calcula o hash da senha antes de rejeitar, enquanto usuários inválidos são rejeitados imediatamente. Executa de forma sequencial e calibra automaticamente o limiar.
Use este quando exploit.py retornar falsos positivos (servidores corrigidos).
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 | Descrição |
|---|
target_ip | IP do servidor SSH alvo |
target_port | Porta do servidor SSH alvo (geralmente 22) |
lhost | IP do atacante (não utilizado, mantido para consistência do template) |
lport | Porta do atacante (não utilizada, mantida para consistência do template) |
-u, --username | Nome de usuário único para testar |
-w, --wordlist | Caminho para um arquivo de wordlist (um nome de usuário por linha) |
-t, --threads | Número de threads (padrão: 4, apenas em exploit.py) |