
Escáner ligero en Python para CVE-2023-48795 (vulnerabilidad de truncamiento de prefijo SSH Terrapin). Realiza captura pasiva de banner y análisis de KEXINIT para detectar combinaciones vulnerables de cifrado/MAC y ausencia de mitigación strict-KEX.
Un escáner ligero en Python para CVE-2023-48795 — la vulnerabilidad de truncamiento de prefijo Terrapin en SSH.
Terrapin es una vulnerabilidad a nivel de protocolo en SSH que permite a un atacante realizando un MitM activo truncar la información de extensión negociada, degradando la seguridad de la conexión — lo más crítico es deshabilitar
ext-info(usado para algoritmos de firma del servidor) yping(usado por la extensiónno-authde OpenSSH).
| Campo | Detalle |
|---|---|
| CVE | CVE-2023-48795 |
| CVSS | 5.9 (Medio) |
| Tipo | Protocolo SSH — Truncamiento de Prefijo / Bypass de Integridad |
| Divulgación | Diciembre 2023 |
| Afectados | OpenSSH < 9.6, PuTTY < 0.80, libssh < 0.10.6, y muchos otros |
| Referencias | terrapin-attack.com |
La vulnerabilidad existe porque ciertas combinaciones de cifrado/MAC en SSH — específicamente chacha20-poly1305 y cifrados en modo CBC con Encrypt-then-MAC — permiten a un atacante MitM activo inyectar y eliminar números de secuencia SSH durante el handshake, truncando los datos de extensión negociados sin ser detectado.
La solución introdujo una extensión KEX estricta (kex-strict-*[email protected]) que tanto el cliente como el servidor deben anunciar para ser inmunes.
El script realiza solo una captura pasiva de banners y análisis de KEXINIT — sin handshake SSH completo, sin autenticación, sin explotación:
SSH_MSG_KEXINIT del servidorDebido a que la verificación ocurre completamente dentro de la fase de intercambio de claves, es no intrusiva y no deja rastro significativo más allá de un intento de conexión TCP normal.
socket, struct, argparse, concurrent.futures)git clone https://github.com/Mr-Whiskerss/terrapin_check
cd terrapin_check
chmod +x terrapin_check.py
python3 terrapin_check.py <host> [puerto]
python3 terrapin_check.py 192.168.1.10
python3 terrapin_check.py 192.168.1.10 2222
Un objetivo por línea — acepta formato host o host:puerto.
python3 terrapin_check.py -f targets.txt
python3 terrapin_check.py -f targets.txt --threads 20 --timeout 3
python3 terrapin_check.py -f targets.txt --summary
usage: terrapin_check.py [-h] [-f FILE] [-p PORT] [--threads THREADS] [--timeout TIMEOUT] [--summary] [host] [port]
positional arguments:
host Host objetivo
port Puerto SSH (por defecto: 22)
options:
-h, --help Muestra este mensaje de ayuda y sale
-f, --file FILE Archivo que contiene hosts (host o host:puerto por línea)
-p, --port-flag PORT Puerto predeterminado al usar -f (por defecto: 22)
--threads THREADS Hilos concurrentes para escaneo masivo (por defecto: 10)
--timeout TIMEOUT Tiempo de espera del socket en segundos (por defecto: 5.0)
--summary Imprime solo una línea de resumen por host
| Código | Significado |
|---|---|
0 | No se encontraron hosts vulnerables |
1 | Uno o más hosts vulnerables detectados |
Esto permite usar el script limpiamente en pipelines y flujos de trabajo automatizados.
────────────────────────────────────────────────────────────
Objetivo : 192.168.1.10:22
Banner : SSH-2.0-OpenSSH_8.9p1 Ubuntu-3ubuntu0.6
Estado : VULNERABLE
KEX Estricto : No
✗ ChaCha20-Poly1305 anunciado → posible truncamiento de prefijo
✗ Combinación CBC+ETM anunciada
Cifrados CBC : aes128-cbc, aes256-cbc
MACs ETM : [email protected], [email protected]
Algoritmos KEX:
curve25519-sha256
ecdh-sha2-nistp256
diffie-hellman-group14-sha256
────────────────────────────────────────────────────────────
[VULN] 192.168.1.10:22 VULNERABLE (CVE-2023-48795)
[SAFE] 192.168.1.20:22 No vulnerable
[MIT] 192.168.1.30:22 Algoritmos presentes pero KEX estricto mitiga
[?] 192.168.1.99:22 ERROR: Conexión rechazada
El script marca un host como VULNERABLE si cualquiera de las siguientes condiciones es verdadera, y la extensión KEX estricta no está anunciada:
El servidor anuncia [email protected] en cualquier dirección de cifrado.
El servidor anuncia cualquier cifrado en modo CBC y cualquier MAC ETM juntos:
Cifrados CBC verificados:
aes128-cbc, aes192-cbc, aes256-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, idea-cbc, arcfour, arcfour128, arcfour256, [email protected]
MACs ETM verificadas:
[email protected], [email protected], [email protected], [email protected], y variantes
Si el servidor anuncia [email protected] en su lista de algoritmos KEX, la conexión está protegida independientemente de los cifrados y MACs ofrecidos. En ese caso, el script reportará MITIGADO en lugar de VULNERABLE.
| Acción | Detalle |
|---|---|
| Actualizar OpenSSH | Actualizar a ≥ 9.6 tanto en cliente como en servidor. KEX estricto está habilitado por defecto. |
| Parchear otras implementaciones | PuTTY ≥ 0.80, libssh ≥ 0.10.6, Paramiko ≥ 3.4.0, AsyncSSH ≥ 2.14.2 |
| Eliminar algoritmos vulnerables | Si no es posible actualizar de inmediato, eliminar chacha20-poly1305 y cifrados CBC + MACs ETM de sshd_config: |
# /etc/ssh/sshd_config
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,[email protected],[email protected]
MACs hmac-sha2-256,hmac-sha2-512
La eliminación de algoritmos reduce la agilidad de cifrado. Actualizar es siempre la remediación preferida.
Esta herramienta está destinada únicamente para evaluaciones de seguridad autorizadas. Úsala solo contra sistemas que poseas o para los que tengas permiso explícito por escrito para realizar pruebas. El autor no acepta responsabilidad por mal uso.
Parte del kit de herramientas de pentesting de Mr-Whiskerss.