
Comprobador en Python y hook de exploit configurable para CVE-2026-90817, que realiza fingerprinting de instancias REDCap, valida hashes de encuestas y sondea rutas RCE de __passthru Data Import.
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 ejecutará 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
# Objetivo único (se requiere hash de encuesta para las pruebas de encuesta + passthru)
python poc.py -u https://redcap.example.edu/redcap --hash Ab12Xy34Zq --mode check
# Abreviatura: base|hash
python poc.py -u "https://redcap.example.edu/redcap|Ab12Xy34Zq" --mode check
# Comprobación masiva (una URL por línea, |hash opcional)
python poc.py --list targets.example.txt --mode check -j 20 -q
# Flujo en vivo: cada host + resumen de pruebas (recomendado para listas largas)
python poc.py --list targets.example.txt --mode check -j 20 -q --flow
# Exploit (tras el aviso → exploit_chain.json real)
cp exploit_chain.example.json exploit_chain.json # editar con valores reales
python poc.py -u https://redcap.example.edu/redcap --hash XXX --mode exploit -c id \
--chain exploit_chain.json
# Coloca la exportación como fofa_csv_7561.csv (o cualquier fofa*.csv), luego:
python fofa_to_list.py
# Escribe list.txt (ignorado por git) y normaliza el CSV con una columna url
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, la comprobación aún puede identificar REDCap y marcar 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 # ejemplo de salida de terminal --flow
├── 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 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 ticks 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 | En o por encima de 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 |