
# Enumerador de usuários OpenSSH baseado em CVE-2018-15473 com varredura de portas, fingerprinting e execução paralela para verificar a presença de usuários em servidores SSH remotos.
Opensshenum é um enumerador de usuários do OpenSsh que permite verificar uma lista arbitrária de nomes de usuários contra um servidor OpenSsh, para saber quais realmente existem naquela máquina remota. Este programa explora uma falha (corrigida em julho de 2018) que se mostrou eficaz pelo menos a partir do OpenSSH 2.3.0 (lançado em novembro de 2000).
Eu escrevi o exploit a partir do Tssh, um cliente SSH 2 que escrevi em C++11 do zero, partindo das RFCs.
Para mais informações, leia aqui:
http://seclists.org/oss-sec/2018/q3/124
Este problema recebeu o CVE-2018-15473.
Este código foi publicado para fins informativos e educacionais. A intrusão em sistemas e serviços sem autorização do proprietário é ilegal. O uso indevido das informações e do software neste repositório pode resultar em acusações criminais contra o autor do delito. Quaisquer ações e/ou atividades relacionadas ao material contido neste Repositório Git são de sua inteira responsabilidade. O autor não será responsabilizado caso sejam apresentadas acusações criminais contra indivíduos que façam uso indevido das informações ou do software deste site para violar a lei.
O programa é destinado a ser usado em ambiente *nix e foi testado em várias distribuições Linux e OS X:
usando, como compilador, um desta lista:
e, como servidor ssh, um dos seguintes:
A única dependência externa é a biblioteca OpenSSL, usada para as funções criptográficas. Eu poderei introduzir alternativas ao OpenSSL nas próximas versões. Este programa é destinado a ser usado com uma versão do OpenSSL igual ou superior a:
(Isso significa que no OS X, uma atualização é obrigatória).
Para compilar o programa, estas ferramentas/bibliotecas são necessárias:
Ele processa a lista de usuários passada via pipe, exemplo:
cat user.txt | ./opensshenum -i dummy_cert target_addr
xxx:NOK
gabriel:OK
onde user.txt é um arquivo contendo uma lista de usuários, um por linha, e dummy_cert é uma chave gerada com o comando ssh-keygen do OpenSsh (o diretório das chaves é ~/.shh por padrão).
Um programa pode ser usado para gerar a lista:
printf "xxx\ngabriel" | ./src/opensshenum -i dummy_rsa localhost
xxx:NOK
gabriel:OK
Veja a página de manual incluída nesta versão.
Adicionada capacidade de scanner de portas SSH: agora o opensshenum pode escanear todas as portas associadas a um endereço para descobrir instâncias de SSH ouvindo em portas diferentes de 22, para realizar o exploit apenas nessas portas verificadas. Este recurso pode ser usado de forma independente, permitindo obter apenas uma lista das portas associadas a SSH, sem executar nenhum ataque.
Exemplo:
opensshenum -s -n -t2 -m22221 -M22225 -r'.*OpenSSH' -idummy_rsa my_imaginary_website.com
vai escanear as portas (-s) entre 22221 e 22225 (ambas incluídas), executando apenas o escaneamento (-n), com timeout de 2 segundos (-t), esperando uma string hello contendo a string OpenSSH, usando uma chave pública chamada idummy_rsa (recomendo gerar uma chave apenas para esse tipo de operação) e usando como alvo my_imaginary_website.com. Mais informações na página de manual.
Um script alfa usando GNU Parallel ( parallenum.sh ) está incluído, como prova de conceito da redução do tempo de escaneamento alcançável dividindo o intervalo de portas a escanear em subintervalos, cada um pertencente a um processo específico. Isso obviamente produz muito ruído. Para reduzir o ruído, o parâmetro -t pode ser usado para esse fim.
Função de fingerprint, útil para identificar automaticamente o tipo de SO (ou seja, se a string "hello" for omitida) e os serviços com um banco de dados de usuários/combinação de usuários. O banco de dados é criado a partir de arquivos *.lst coletados em um diretório. Cada arquivo *.lst tem o nome <os_name_or_service>.lst, exemplos:
ubuntu_17_10.lst aix.lst proprietary_ftp.lst
O banco de dados, um arquivo csv, tem o formato:
user_1;os_or_service_1; ... ;os_or_service_n ... user_m;os_or_service_1; ... ;os_or_service_n
O banco de dados pode ser criado a partir dos arquivos *.lst usando o utilitário createdb, presente no diretório ./utils, especificando o diretório dos *.lst, exemplo:
cd utils make ./createdb ../lists/
Para solicitar o fingerprinting, use a opção -F com o arquivo do banco de dados, exemplo:
cat test/scan.sample | opensshenum -p22 -idummy_rsa -Futils/opensshenum.db localhost