
CVE-2018-15473 - Opensshenum est un énumérateur d'utilisateurs exploitant un bug OpenSsh.
Opensshenum est un énumérateur d'utilisateurs OpenSsh permettant de vérifier une liste arbitraire de noms d'utilisateurs auprès d'un serveur OpenSsh, afin de connaître ceux réellement présents sur cette machine distante. Ce programme exploite un bug (corrigé en juillet 2018) dont l'efficacité est prouvée au moins à partir d'OpenSSH 2.3.0 (sorti en novembre 2000).
J'ai écrit l'exploit en partant de Tssh, un client SSH 2 que j'ai écrit en C++11 à partir de zéro, en m'appuyant sur les RFC.
Pour plus d'informations, lisez ici :
http://seclists.org/oss-sec/2018/q3/124
Cette faille a reçu le CVE-2018-15473.
Ce code a été publié à des fins d'information et d'éducation. L'intrusion dans des systèmes et des services sans l'autorisation du propriétaire est illégale. Toute mauvaise utilisation des informations et du logiciel contenus dans ce dépôt peut entraîner des poursuites pénales contre l'auteur de l'infraction. Toute action et/ou activité liée au matériel contenu dans ce dépôt Git relève de votre seule responsabilité. L'auteur ne pourra être tenu responsable si des poursuites pénales sont engagées contre des personnes qui utilisent à mauvais escient les informations ou le logiciel de ce site pour enfreindre la loi.
Le programme est destiné à être utilisé dans un environnement *nix et a été testé sur diverses distributions Linux et OS X :
en utilisant, comme compilateur, l'un de ceux-ci :
et, comme serveur SSH, l'un des suivants :
La seule dépendance externe est la bibliothèque OpenSSL, utilisée pour les fonctions cryptographiques. Je pourrais introduire des alternatives à OpenSSL dans les prochaines versions. Ce programme est destiné à être utilisé avec une version d'OpenSSL égale ou supérieure à :
(Cela signifie qu'avec OS X, une mise à niveau est obligatoire).
Pour compiler le programme, les outils/bibliothèques suivants sont nécessaires :
Il traite la liste d'utilisateurs transmise par pipe, exemple :
cat user.txt | ./opensshenum -i dummy_cert target_addr
xxx:NOK
gabriel:OK
où user.txt est un fichier contenant une liste d'utilisateurs, un par ligne, et dummy_cert est une clé générée avec la commande ssh-keygen d'OpenSsh (le répertoire des clés est ~/.shh par défaut).
Un programme peut être utilisé pour générer la liste :
printf "xxx\ngabriel" | ./src/opensshenum -i dummy_rsa localhost
xxx:NOK
gabriel:OK
Consultez la page de manuel incluse dans cette version.
Capacité de scan de ports SSH ajoutée : désormais, opensshenum peut analyser tous les ports associés à une adresse afin de détecter des instances de SSH écoutant sur des ports différents de 22 et d'effectuer l'exploit uniquement sur ces ports vérifiés. Cette fonctionnalité peut être utilisée de manière autonome, permettant d'obtenir uniquement une liste des ports associés à SSH, sans exécuter d'attaque.
Exemple :
opensshenum -s -n -t2 -m22221 -M22225 -r'.*OpenSSH' -idummy_rsa my_imaginary_website.com
analysera les ports (-s) entre 22221 et 22225 (inclus), en effectuant uniquement l'analyse (-n), avec un délai d'attente de 2 secondes (-t), en s'attendant à une chaîne d'accueil contenant la chaîne OpenSSH, en utilisant une clé publique nommée idummy_rsa (je recommande de générer une clé uniquement pour ce type d'opérations) et en utilisant comme cible my_imaginary_website.com. Plus d'informations dans la page de manuel.
Un script alpha utilisant GNU Parallel (parallenum.sh) est inclus, comme preuve de concept de la réduction du temps de scan possible en divisant la plage des ports à analyser en sous-plages, chacune relevant d'un processus spécifique. Cela produit évidemment beaucoup de bruit. Pour réduire le bruit, le paramètre -t peut être utilisé à cet effet.
La fonction de prise d'empreinte, utile pour identifier automatiquement le type d'OS (c'est-à-dire si la chaîne « hello » est omise) et les services avec une base de données d'utilisateurs/combinaisons d'utilisateurs. La base de données est créée à partir des fichiers *.lst rassemblés dans un répertoire. Chaque fichier *.lst porte le nom <os_name_or_service>.lst, exemples :
ubuntu_17_10.lst aix.lst proprietary_ftp.lst
La base de données, un fichier csv, a le format :
user_1;os_or_service_1; ... ;os_or_service_n ... user_m;os_or_service_1; ... ;os_or_service_n
La base de données peut être créée à partir des fichiers *.lst à l'aide de l'utilitaire createdb, présent dans le répertoire ./utils, en spécifiant le répertoire des *.lst, exemple :
cd utils make ./createdb ../lists/
Pour activer la prise d'empreinte, utilisez l'option -F avec le fichier de la base de données, exemple :
cat test/scan.sample | opensshenum -p22 -idummy_rsa -Futils/opensshenum.db localhost