
Scanner per l'identificazione di server con software SSH potenzialmente vulnerabili alle CVE CVE-2024-6387 e CVE-2023-48795.
Scanner per l'identificazione di server con software SSH potenzialmente vulnerabili a CVE-2024-6387 e CVE-2023-48795.
| CVE | Nome | Condizione | Severità |
|---|---|---|---|
| CVE-2024-6387 | regreSSHion | OpenSSH < 9.8p1 | CRITICAL |
| CVE-2023-48795 | Terrapin | OpenSSH < 9.6 | HIGH |
Race condition nell'handler del segnale SIGALRM del server OpenSSH consente RCE non autenticato come root su sistemi Linux con glibc. Colpisce tutte le versioni di OpenSSH precedenti alla 9.8p1.
Attacco di troncamento del prefisso nell'handshake SSH (protocollo binario) che consente a un avversario MITM di rimuovere i messaggi di estensione di sicurezza negoziati all'inizio della sessione. Colpisce OpenSSH < 9.6.
Lo script si connette direttamente alla porta SSH dei bersagli e legge il banner di identificazione (es: SSH-2.0-OpenSSH_9.7), senza inviare alcuna credenziale. Una volta ottenuta la versione, la confronta con le versioni corrette per ciascuna CVE e classifica l'host.
Alvo → Conexão TCP porta 22 → Leitura do banner SSH → Identificação do software
→ Parse da versão OpenSSH → Comparação com versões fixadas → Classificação + Log + CSV
Lo script identifica anche il produttore/software SSH dal banner, riconoscendo:
| Banner | Produttore identificato |
|---|---|
SSH-2.0-OpenSSH_9.7 | OpenSSH |
SSH-2.0-ROSSSH | Mikrotik |
SSH-2.0-Cisco-1.25 | Cisco |
SSH-2.0-dropbear_2022.83 | Dropbear |
SSH-2.0-libssh-0.9.6 | libssh |
SSH-2.0-AsyncSSH_2.13.2 | AsyncSSH |
SSH-2.0-paramiko_2.9.5 | Paramiko |
SSH-2.0-Bitvise-... | Bitvise |
SSH-2.0-WolfSSH_1.4.14 | wolfSSH |
| Altri non mappati | Nome estratto dal banner |
pip install requests packaging urllib3 dnspython
dnspythonè opzionale, ma altamente raccomandato: la risoluzione inversa parallela è significativamente più veloce con esso. Senzadnspython, lo script usasocketcome fallback.
# IP individual
python ssh_scanner.py --ip 192.168.1.10
# Faixa CIDR
python ssh_scanner.py --cidr 10.0.0.0/24
# Múltiplos CIDRs
python ssh_scanner.py --cidr 10.0.0.0/24 192.168.1.0/24
# ASN (prefixos resolvidos via RIPE Stat, fallback para bgp.tools)
python ssh_scanner.py --asn AS12345
# Combinação de entradas
python ssh_scanner.py --asn AS12345 --cidr 10.0.0.0/8 --ip 1.2.3.4
# A partir de um arquivo (um IP, CIDR ou ASN por linha)
python ssh_scanner.py --file alvos.txt
# Portas adicionais (além da 22)
python ssh_scanner.py --cidr 10.0.0.0/24 --ports 22 2222 22222
| Parametro | Default | Descrizione |
|---|---|---|
--ports | 22 | Porta(e) SSH da scansionare |
--workers | 60 | Thread simultanei per la scansione SSH |
--timeout | 3.0 | Timeout della connessione SSH in secondi |
--dns-workers | 200 | Thread simultanei per la risoluzione DNS inversa |
--dns-timeout | 1.5 | Timeout delle query DNS in secondi |
--no-confirm | — | Salta la conferma prima di iniziare (utile nelle automazioni) |
La risoluzione DNS viene eseguita in batch prima della scansione SSH, con una coda dedicata di thread, evitando che la latenza DNS influisca sulla velocità della scansione.
Tutti i risultati vengono salvati in ./logs/:
| File | Contenuto |
|---|---|
ssh_scan_<timestamp>.log | Log completo della scansione (tutti gli host SSH trovati) |
ssh_scan_<timestamp>_vulneraveis.txt | Solo gli host classificati come VULNERÁVEL |
ssh_scan_<timestamp>_resultados.csv | Tutti gli host SSH con stato completo |
ssh_scan_<timestamp>_formato_estruturado.csv | CSV strutturato con IP, porta, timestamp, dominio, produttore e CVE |
formato_estruturado.csv)Colonne presenti:
| Colonna | Descrizione |
|---|---|
IP | Indirizzo IP dell'host |
PORTA | Porta SSH su cui è stato catturato il banner |
TIMESTAMP_UTC | Timestamp ISO 8601 UTC del momento della scansione |
DOMINIO | Hostname tramite DNS inverso (PTR) o SEM-PTR |
FABRICANTE | Produttore identificato dal banner |
SW_NAME | Nome del software SSH estratto dal banner |
SW_VERSAO | Versione del software SSH |
CVEs | CVE interessate separate da ; (minuscole) |
BANNER | Banner SSH completo catturato |
Esempio di righe:
IP | PORTA | TIMESTAMP_UTC | DOMINIO | FABRICANTE | SW_NAME | SW_VERSAO | CVEs | BANNER
192.168.1.10 | 22 | 2026-05-20T00:39:33Z | host.exemplo.com | OpenSSH | OpenSSH | 9.7 | cve-2024-6387;cve-2023-48795 | SSH-2.0-OpenSSH_9.7
192.168.1.20 | 22 | 2026-05-20T12:46:03Z | host2.exemplo.com | OpenSSH | OpenSSH | 9.4 | cve-2023-48795;cve-2024-6387 | SSH-2.0-OpenSSH_9.4
192.168.1.30 | 22 | 2026-05-20T12:47:11Z | router.exemplo.com | Mikrotik | ROSSSH | N/D | | SSH-2.0-ROSSSH
Al termine della scansione, se ci sono host vulnerabili, lo script mostra automaticamente un'anteprima delle prime 20 righe del CSV strutturato nel terminale.
| Stato | Significato |
|---|---|
VULNERÁVEL | Versione OpenSSH confermata inferiore alla versione corretta |
SEGURO | Versione OpenSSH confermata alla versione corretta o successiva |
VERSÃO-OCULTA | SSH rilevato ma versione non esposta — non confermato sicuro |
SSH-NÃO-OPENSSH | Server SSH trovato ma non è OpenSSH (Dropbear, Cisco, ecc.) |
NÃO-SSH | La porta ha risposto ma il banner non corrisponde al protocollo SSH |
Aggiorna OpenSSH alla versione 9.8p1 o successiva (copre entrambe le CVE):
# Ubuntu / Debian — via repositório do sistema
sudo apt update && sudo apt install --only-upgrade openssh-server
ssh -V
# CentOS / RHEL / Rocky
sudo dnf update openssh-server
ssh -V
# Compilação a partir do fonte (versão mais recente)
wget https://cdn.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-9.9p1.tar.gz
tar xzf openssh-9.9p1.tar.gz
cd openssh-9.9p1 && ./configure && make && sudo make install
Dopo l'aggiornamento, riavvia il servizio:
sudo systemctl restart sshd