
Comprobador en Python y hook de exploit para CVE-2026-90817, un RCE crítico no autenticado en REDCap a través del enrutamiento __passthru de encuestas, con escaneo masivo e importación de objetivos desde FOFA.
Comprobador en Python 3 (y hook de exploit configurable) para CVE-2026-90817 (Securifera / Ryan Wincey).
| Producto | REDCap (Vanderbilt) |
| Afectados | ≥ 13.3.0 (hasta el parche de la rama) |
| Corregido | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Crítico |
| Auth | Ninguna — se requiere un hash de encuesta público válido (s=) para la cadena completa |
| CWE | CWE-73, CWE-94 |
Desde un contexto de encuesta pública, los atacantes pueden abusar del enrutamiento __passthru (passthrough de encuesta) para alcanzar controladores no previstos (p. ej. Data Import), y luego desencadenar un manejo inseguro de rutas de archivo / flujo → RCE.
Securifera no ha publicado aún la cadena HTTP completa (no hay PoC público en GitHub / Exploit-DB en el momento de publicación del repositorio).
exploit_chain.example.json es solo un marcador de posición (rutas/parámetros supuestos). No producirá RCE.
Prueba en seco de investigación: --allow-placeholder-chain (envía solicitudes; se espera fallo).
pip install -r requirements.txtpip install -r requirements.txt
# Single target (survey hash required for survey + passthru tests)
python poc.py -u https://redcap.example.edu/redcap --hash Ab12Xy34Zq --mode check
# Shorthand: base|hash
python poc.py -u "https://redcap.example.edu/redcap|Ab12Xy34Zq" --mode check
# Mass check (one URL per line, optional |hash)
python poc.py --list targets.example.txt --mode check -j 20 -q
# Live stream: every host + test summary (recommended for long lists)
python poc.py --list targets.example.txt --mode check -j 20 -q --flow
# Exploit (after advisory → real exploit_chain.json)
cp exploit_chain.example.json exploit_chain.json # edit with real values
python poc.py -u https://redcap.example.edu/redcap --hash XXX --mode exploit -c id \
--chain exploit_chain.json
# Place export as fofa_csv_7561.csv (or any fofa*.csv), then:
python fofa_to_list.py
# Writes list.txt (gitignored) and normalizes the CSV with a url column
python poc.py --list list.txt --mode check -j 20 -q --flow
https://uni.edu/redcap|SurveyHash10
https://uni.edu/redcap?s=SurveyHash10
https://uni.edu/redcap
Sin un hash, check aún puede identificar REDCap y señalar ventanas de versión, pero no puede validar la encuesta ni ejecutar sondeos passthru.
--flow)
| Archivo | Contenido |
|---|---|
cve_2026_90817_results.jsonl | JSON por objetivo |
hits.txt | Candidatos (exploitable_candidate) |
status (check)__passthru exacta y los nombres de parámetros de Securifera/vendor; los valores por defecto son marcadores de posición.vulnerable_version puede ser null.title="REDCap" a menudo carecen de hashes de encuesta — las precondiciones del CVE necesitan s= de enlaces públicos.title="REDCap"
body="redcap_version"
body="/surveys/?s="
.
├── poc.py
├── fofa_to_list.py
├── exploit_chain.example.json
├── poc.png # example --flow terminal output
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
Solo para pruebas de seguridad autorizadas. Usted es responsable del cumplimiento de las leyes aplicables y las reglas del programa.
| Modo | Qué hace |
|---|
check | Huella de REDCap, heurísticas de versión, encuesta s= válida (si se proporciona el hash), sondeos __passthru → DataImport |
exploit | Se ejecuta solo con un exploit_chain.json verificado (no el ejemplo de marcador de posición) |
| Opción | Descripción |
|---|
-u, --url | URL base única (o URL|hash) |
--hash | Hash de encuesta público (valor s=) |
--list | Archivo de objetivos (una URL o URL|hash por línea) |
--mode | check o exploit |
--chain | Cadena JSON para el modo exploit (por defecto exploit_chain.json) |
--allow-placeholder-chain | Permitir JSON de ejemplo en modo exploit (sin RCE real) |
-c, --command | Comando de shell (modo exploit; requiere una cadena funcional) |
--threads, -j | Concurrencia masiva (por defecto 15) |
--timeout | Tiempo de espera HTTP en segundos (por defecto 25) |
--proxy | URL del proxy HTTP(S) |
--output | Resultados JSONL (por defecto cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt; exploit → exploited.txt |
--quiet, -q | Suprime los tics de progreso periódicos |
--flow, -f | Una línea por objetivo completado (sitio + resumen de pruebas) |
| Estado | Significado |
|---|
passthru_dataimport_reachable | Encuesta válida + la ruta passthru parece Data Import |
passthru_probe_reachable | Passthru devolvió HTTP no bloqueado |
likely_vulnerable_version | Versión en la ventana afectada (encuesta OK, sondeos no concluyentes) |
redcap_version_hot_no_hash | Heurísticas de versión afectada, no se proporcionó hash de encuesta |
redcap_no_survey_hash | REDCap OK, sin hash, versión desconocida |
patched / patched_no_survey | Igual o superior a la versión corregida para la rama |
no_valid_survey | Hash inválido o encuesta no pública |
no_redcap | El host no parece REDCap |
survey_ok_version_unknown | Encuesta OK, cadena de versión no encontrada |