
CVE-2026-90817에 대한 Python 검사기 및 익스플로잇 훅으로, survey __passthru 라우팅을 통한 인증되지 않은 치명적인 REDCap RCE이며, 대량 스캔 및 FOFA 대상 가져오기 기능을 제공합니다.
CVE-2026-90817 (Securifera / Ryan Wincey)에 대한 Python 3 검사기(및 구성 가능한 익스플로잇 훅).
| 제품 | REDCap (Vanderbilt) |
| 영향 받는 버전 | ≥ 13.3.0 (브랜치 패치 전까지) |
| 수정 버전 | 16.0.49 LTS, 17.3.10 LTS, 17.4.4 Standard+ |
| CVSS 3.1 | 9.8 Critical |
| 인증 | 없음 — 전체 체인에는 유효한 공개 설문 해시(s=) 필요 |
| CWE | CWE-73, CWE-94 |
공개 설문 컨텍스트에서 공격자는 __passthru(설문 패스스루) 라우팅을 악용하여 의도하지 않은 컨트롤러(예: 데이터 가져오기)에 도달한 다음, 안전하지 않은 파일 경로 / 스트림 처리를 트리거하여 RCE를 실행할 수 있습니다.
Securifera는 아직 전체 HTTP 체인을 공개하지 않았습니다(저장소 게시 시점에 GitHub / Exploit-DB에 공개 PoC 없음).
| 모드 | 수행 작업 |
|---|---|
check | REDCap 핑거프린팅, 버전 휴리스틱, 유효한 설문(해시 제공 시), → DataImport |
exploit_chain.example.json은 자리 표시자일 뿐입니다(추측된 라우트/파라미터). RCE가 되지 않습니다.
연구용 드라이 런: --allow-placeholder-chain (요청을 전송하며, 실패가 예상됨).
pip install -r requirements.txtpip install -r requirements.txt
# 단일 대상 (설문 + passthru 테스트에는 설문 해시 필요)
python poc.py -u https://redcap.example.edu/redcap --hash Ab12Xy34Zq --mode check
# 축약형: base|hash
python poc.py -u "https://redcap.example.edu/redcap|Ab12Xy34Zq" --mode check
# 대량 검사 (한 줄에 URL 하나, 선택적 |hash)
python poc.py --list targets.example.txt --mode check -j 20 -q
# 라이브 스트림: 모든 호스트 + 테스트 요약 (긴 목록에 권장)
python poc.py --list targets.example.txt --mode check -j 20 -q --flow
# 익스플로잇 (권고 → 실제 exploit_chain.json 이후)
cp exploit_chain.example.json exploit_chain.json # 실제 값으로 편집
python poc.py -u https://redcap.example.edu/redcap --hash XXX --mode exploit -c id \
--chain exploit_chain.json
# 내보내기를 fofa_csv_7561.csv (또는 임의의 fofa*.csv)로 배치한 후:
python fofa_to_list.py
# list.txt (gitignore됨)를 작성하고 url 열로 CSV를 정규화합니다
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
해시가 없으면 check는 여전히 REDCap을 핑거프린팅하고 버전 범위를 표시할 수 있지만, 설문을 검증하거나 passthru 프로브를 실행할 수는 없습니다.
--flow 대량 검사)
| 파일 | 내용 |
|---|---|
cve_2026_90817_results.jsonl | 대상별 JSON |
hits.txt | 후보 (exploitable_candidate) |
status 값 (check)__passthru 라우트와 파라미터 이름이 필요하며, 기본값은 자리 표시자입니다.vulnerable_version이 null일 수 있습니다.title="REDCap" 행에는 설문 해시가 없는 경우가 많으며, CVE 전제 조건에는 공개 링크의 s=가 필요합니다.title="REDCap"
body="redcap_version"
body="/surveys/?s="
.
├── poc.py
├── fofa_to_list.py
├── exploit_chain.example.json
├── poc.png # 예제 --flow 터미널 출력
├── requirements.txt
├── targets.example.txt
├── README.md
├── LICENSE
└── .gitignore
승인된 보안 테스트에만 사용하십시오. 관련 법률 및 프로그램 규칙을 준수할 책임은 사용자에게 있습니다.
s=__passthruexploit | 검증된 exploit_chain.json(자리 표시자 예제가 아님)이 있는 경우에만 실행 |
| 옵션 | 설명 |
|---|
-u, --url | 단일 기본 URL (또는 URL|hash) |
--hash | 공개 설문 해시 (s= 값) |
--list | 대상 파일 (한 줄에 URL 또는 URL|hash 하나) |
--mode | check 또는 exploit |
--chain | 익스플로잇 모드용 JSON 체인 (기본값 exploit_chain.json) |
--allow-placeholder-chain | 익스플로잇 모드에서 예제 JSON 허용 (실제 RCE 없음) |
-c, --command | 셸 명령 (익스플로잇 모드; 작동하는 체인 필요) |
--threads, -j | 대량 동시성 (기본값 15) |
--timeout | HTTP 타임아웃 초 (기본값 25) |
--proxy | HTTP(S) 프록시 URL |
--output | JSONL 결과 (기본값 cve_2026_90817_results.jsonl) |
--vuln-list | check → hits.txt; exploit → exploited.txt |
--quiet, -q | 주기적 진행 틱 억제 |
--flow, -f | 완료된 대상당 한 줄 (사이트 + 테스트 요약) |
| 상태 | 의미 |
|---|
passthru_dataimport_reachable | 유효한 설문 + passthru 라우트가 Data Import로 보임 |
passthru_probe_reachable | Passthru가 차단되지 않은 HTTP를 반환함 |
likely_vulnerable_version | 영향 받는 범위의 버전 (설문 OK, 프로브 불확정) |
redcap_version_hot_no_hash | 영향 받는 버전 휴리스틱, 설문 해시 미제공 |
redcap_no_survey_hash | REDCap OK, 해시 없음, 버전 알 수 없음 |
patched / patched_no_survey | 브랜치의 수정 버전 이상 |
no_valid_survey | 해시가 유효하지 않거나 설문이 공개되지 않음 |
no_redcap | 호스트가 REDCap으로 보이지 않음 |
survey_ok_version_unknown | 설문 OK, 버전 문자열을 찾을 수 없음 |