
Enumeratore utenti OpenSSH basato su CVE-2018-15473 con scansione delle porte, fingerprinting ed esecuzione parallela per verificare la presenza di utenti su server SSH remoti.
Opensshenum è un enumeratore di utenti OpenSsh che consente di verificare un elenco arbitrario di nomi utente contro un server OpenSsh, per sapere quali sono effettivamente presenti su quella macchina remota. Questo programma sfrutta un bug (corretto a luglio 2018) che si è dimostrato efficace almeno a partire da OpenSSH 2.3.0 (rilasciato a novembre 2000).
Ho scritto l'exploit partendo da Tssh, un client SSH 2 che ho scritto in C++11 da zero partendo dalle RFC.
Per maggiori informazioni leggi qui:
http://seclists.org/oss-sec/2018/q3/124
Questo problema ha ricevuto CVE-2018-15473.
Questo codice è stato pubblicato a scopo informativo ed educativo. L'intrusione in sistemi e servizi senza l'autorizzazione del proprietario è illegale. L'uso improprio delle informazioni e del software in questo repository può comportare l'avvio di procedimenti penali nei confronti dell'autore del reato. Qualsiasi azione e/o attività legata al materiale contenuto in questo repository Git è esclusivamente di tua responsabilità. L'autore non sarà ritenuto responsabile nel caso in cui vengano mosse accuse penali contro individui che utilizzano impropriamente le informazioni o il software di questo sito per infrangere la legge.
Il programma è pensato per essere usato in un ambiente *nix ed è stato testato su diverse distribuzioni Linux e OS X:
usando, come compilatore, uno di quelli in questa lista:
e, come server ssh, uno dei seguenti:
L'unica dipendenza esterna è la libreria OpenSSL, usata per le funzioni crittografiche. Potrei introdurre alternative a OpenSSL nelle prossime versioni. Questo programma è pensato per essere usato con una versione di OpenSSL uguale o superiore a:
(Questo significa che con OS X è obbligatorio un aggiornamento).
Per compilare il programma sono necessari questi strumenti/librerie:
Elabora la lista di utenti passata tramite pipe, esempio:
cat user.txt | ./opensshenum -i dummy_cert target_addr
xxx:NOK
gabriel:OK
dove user.txt è un file contenente una lista di utenti, uno per riga e dummy_cert è una chiave generata con il comando ssh-keygen di OpenSsh (la directory delle chiavi è ~/.shh come predefinita).
Il programma può essere usato per generare la lista:
printf "xxx\ngabriel" | ./src/opensshenum -i dummy_rsa localhost
xxx:NOK
gabriel:OK
Vedi la pagina man inclusa in questa release.
Aggiunta la funzionalità di port scanner SSH: ora opensshenum può scansionare tutte le porte associate a un indirizzo per individuare istanze di SSH in ascolto su porte diverse dalla 22, per eseguire l'exploit solo su quelle porte verificate. Questa funzionalità può essere usata in modalità standalone, consentendo di ottenere solo un elenco delle porte associate a SSH, senza eseguire alcun attacco.
Esempio:
opensshenum -s -n -t2 -m22221 -M22225 -r'.*OpenSSH' -idummy_rsa my_imaginary_website.com
scansionerà le porte (-s) tra 22221 e 22225 (entrambe incluse), eseguendo solo la scansione (-n), con timeout di 2 secondi (-t), aspettandosi una stringa hello contenente la stringa OpenSSH, usando una chiave pubblica chiamata idummy_rsa (consiglio di generare una chiave solo per questo tipo di operazioni) e usando come target my_imaginary_website.com. Maggiori informazioni nella pagina man.
È incluso uno script alpha che usa GNU Parallel (parallenum.sh), come prova di concetto della riduzione dei tempi di scansione ottenibile suddividendo l'intervallo delle porte da scansionare in sotto-intervalli, ciascuno di pertinenza di uno specifico processo. Questo ovviamente produce molto rumore. Per ridurre il rumore si può usare il parametro -t a tale scopo.
Funzione di fingerprint, utile per identificare automaticamente il tipo di OS (cioè se la stringa "hello" è omessa) e i servizi con un db di utenti/combinazioni di utenti. Il db è creato da file *.lst raccolti in una directory. Ogni file *.lst ha nome <os_name_or_service>.lst, esempi:
ubuntu_17_10.lst aix.lst proprietary_ftp.lst
Il db, un file csv, ha il formato:
user_1;os_or_service_1; ... ;os_or_service_n ... user_m;os_or_service_1; ... ;os_or_service_n
Il db può essere creato dai file *.lst usando l'utility createdb, presente nella directory ./utils, specificando la directory dei *.lst, esempio:
cd utils make ./createdb ../lists/
Per richiedere il fingerprinting, usa l'opzione -F con il file del db, esempio:
cat test/scan.sample | opensshenum -p22 -idummy_rsa -Futils/opensshenum.db localhost