
Escáner para la identificación de servidores con software SSH posiblemente vulnerable a las CVE CVE-2024-6387 y CVE-2023-48795.
Escáner para identificación de servidores con software SSH posiblemente vulnerable a las CVEs CVE-2024-6387 y CVE-2023-48795.
| CVE | Nombre | Condición | Severidad |
|---|---|---|---|
| CVE-2024-6387 | regreSSHion | OpenSSH < 9.8p1 | CRITICAL |
| CVE-2023-48795 | Terrapin | OpenSSH < 9.6 | HIGH |
Race condition en el manejador de señales SIGALRM del servidor OpenSSH permite RCE no autenticado como root en sistemas Linux con glibc. Afecta a todas las versiones de OpenSSH anteriores a la 9.8p1.
Ataque de truncamiento de prefijo en el handshake SSH (protocolo binario) que permite a un adversario MITM eliminar mensajes de extensión de seguridad negociados al inicio de la sesión. Afecta a OpenSSH < 9.6.
El script se conecta directamente al puerto SSH de los objetivos y lee el banner de identificación (p. ej.: SSH-2.0-OpenSSH_9.7), sin enviar ninguna credencial. Con la versión en mano, la compara con las versiones corregidas de cada CVE y clasifica el 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
El script también identifica el fabricante/software SSH a partir del banner, reconociendo:
pip install requests packaging urllib3 dnspython
dnspythones opcional, pero muy recomendado: la resolución inversa paralela es significativamente más rápida con él. Sindnspython, el script usasocketcomo respaldo.
# IP individual
python ssh_scanner.py --ip 192.168.1.10
# Rango CIDR
python ssh_scanner.py --cidr 10.0.0.0/24
# Múltiples CIDRs
python ssh_scanner.py --cidr 10.0.0.0/24 192.168.1.0/24
# ASN (prefijos resueltos vía RIPE Stat, fallback a bgp.tools)
python ssh_scanner.py --asn AS12345
# Combinación de entradas
python ssh_scanner.py --asn AS12345 --cidr 10.0.0.0/8 --ip 1.2.3.4
# Desde un archivo (un IP, CIDR o ASN por línea)
python ssh_scanner.py --file alvos.txt
# Puertos adicionales (además del 22)
python ssh_scanner.py --cidr 10.0.0.0/24 --ports 22 2222 22222
La resolución DNS se ejecuta en lote antes del escaneo SSH, con una cola dedicada de hilos, evitando que la latencia del DNS afecte la velocidad del escaneo.
Todos los resultados se guardan en ./logs/:
formato_estruturado.csv)Columnas presentes:
Ejemplo de líneas:
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 final del escaneo, si hay hosts vulnerables, el script muestra automáticamente una vista previa de las primeras 20 líneas del CSV estructurado en la terminal.
Actualice OpenSSH a la versión 9.8p1 o superior (cubre ambas CVEs):
# Ubuntu / Debian — vía repositorio del sistema
sudo apt update && sudo apt install --only-upgrade openssh-server
ssh -V
# CentOS / RHEL / Rocky
sudo dnf update openssh-server
ssh -V
# Compilación desde el código fuente (versión más reciente)
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
Después de actualizar, reinicie el servicio:
sudo systemctl restart sshd
Este script está destinado al uso en su propia infraestructura o bajo autorización explícita. El escaneo no autorizado puede violar diversas legislaciones, así que úselo con precaución.
Cualquier acción y consecuencia resultantes del uso indebido de esta herramienta son de su propia responsabilidad.
Si tiene sugerencias de mejora o encuentra errores, abra una issue o envíe un Pull Request. ¡Toda contribución es bienvenida! 🚀
| Banner | Fabricante identificado |
|---|
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 |
| Otros no mapeados | Nombre extraído del banner |
| Parámetro | Predeterminado | Descripción |
|---|
--ports | 22 | Puerto(s) SSH a escanear |
--workers | 60 | Hilos simultáneos para el escaneo SSH |
--timeout | 3.0 | Tiempo de espera de la conexión SSH en segundos |
--dns-workers | 200 | Hilos simultáneos para la resolución DNS inversa |
--dns-timeout | 1.5 | Tiempo de espera de las consultas DNS en segundos |
--no-confirm | — | Omite la confirmación antes de iniciar (útil en automatizaciones) |
| Archivo |
|---|
| Contenido |
|---|
ssh_scan_<timestamp>.log | Registro completo del escaneo (todos los hosts SSH encontrados) |
ssh_scan_<timestamp>_vulneraveis.txt | Solo hosts clasificados como VULNERÁVEL |
ssh_scan_<timestamp>_resultados.csv | Todos los hosts SSH con estado completo |
ssh_scan_<timestamp>_formato_estruturado.csv | CSV estructurado con IP, puerto, timestamp, dominio, fabricante y CVEs |
| Columna | Descripción |
|---|
IP | Dirección IP del host |
PORTA | Puerto SSH donde se capturó el banner |
TIMESTAMP_UTC | Timestamp ISO 8601 UTC del momento del escaneo |
DOMINIO | Hostname mediante DNS inverso (PTR) o SEM-PTR |
FABRICANTE | Fabricante identificado a partir del banner |
SW_NAME | Nombre del software SSH extraído del banner |
SW_VERSAO | Versión del software SSH |
CVEs | CVEs afectadas separadas por ; (minúsculas) |
BANNER | Banner SSH completo capturado |
| Estado | Significado |
|---|
VULNERÁVEL | Versión de OpenSSH confirmada por debajo de la versión corregida |
SEGURO | Versión de OpenSSH confirmada en la versión corregida o superior |
VERSÃO-OCULTA | SSH detectado pero versión no expuesta — no confirmado seguro |
SSH-NÃO-OPENSSH | Servidor SSH encontrado pero no es OpenSSH (Dropbear, Cisco, etc.) |
NÃO-SSH | El puerto respondió pero el banner no corresponde al protocolo SSH |