
CVE-2026-63030 / CVE-2026-60137 - сканер RCE-уязвимостей WordPress без аутентификации
от @bahartanir (katherinepierce) Форк ZephrFish/wp2shell-scanner с дополнительными улучшениями. Исследование: Adam Kues (Assetnote) и Mustafa Can İPEKÇİ (nukedx).
Инструменты обнаружения и валидации для проверки ядра WordPress на подверженность wp2shell
(CVE-2026-63030 / CVE-2026-60137). Режим выбирается флагом, а
цель задаётся позиционно. --scan снимает отпечаток версии ядра и подтверждает, что
REST-маршрут /batch/v1 доступен, не отправляя эксплойт-пейлоад; режимы
--check/--read/--shell/--rce/--root-prereq — это валидационный
PoC для авторизованного лабораторного использования.
wp2shell.py — это один скрипт, использующий только стандартную библиотеку, — без внешних
зависимостей. Каждый запуск выводит баннер в 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 отправляют реальные
эксплойт-пейлоады. Запускайте их только против встроенной лаборатории на localhost или других
систем, которыми вы владеете и на тестирование которых у вас есть явное разрешение. --shell и --rce
выполняют удалённый код и предназначены для лаборатории/авторизованных целей; --rce на хосте
вне loopback требует --authorized. --root-prereq использует тот же
диагностический плагин с защитой по токену для проверки предпосылок shell-to-root, но
не выполняет локальную привилегированную эскалацию.
--shell требует восстановленный/взломанный пароль администратора. --rce — это
цепочка без учётных данных (pre-auth): он создаёт собственного администратора через
SQLi (oEmbed → changeset → повторный вход в parse_request), затем разворачивает
веб-шелл — пароль не требуется.
--shell, --rce и --root-prereq запрашивают интерактивное подтверждение y/N
перед отправкой любого пейлоада, выполняющего код (они прерываются при
неинтерактивном stdin/EOF). Передайте -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!'
python3 wp2shell.py --lpe http://127.0.0.1:8080
Патч-диффы, на которых основан PoC, сохранены в poc/diffs/, с исследовательскими
заметками в poc/RESEARCH.md. SQLi полностью восстанавливается по
фиксу author__not_in. Цепочка --rce без учётных данных (oEmbed → changeset →
повторный вход → создание администратора) воспроизводит RCE на стандартной
конфигурации против встроенной лаборатории; --shell — альтернативный путь через
восстановленные/взломанные учётные данные администратора к аутентифицированной
загрузке плагина и выполнению команд.
--lpe)--lpe объединяет полную pre-auth RCE (SQLi → создание администратора → веб-шелл)
с автоматизированной попыткой эскалации до root. Он пробует следующее по порядку,
останавливаясь на первом успехе:
python3 wp2shell.py --lpe http://127.0.0.1:8080
python3 wp2shell.py --lpe http://127.0.0.1:8080 -y # skip auth prompt
python3 wp2shell.py --lpe https://target --authorized # non-loopback
--lpe против цели вне loopback требует --authorized. Во встроенной лаборатории
(базовый образ Ubuntu 22.04 с уязвимым ядром GameOverlay) CVE-2023-2640/32629
успешно срабатывает без компилятора.
| Флаг | Что делает |
|---|
--scan | Неразрушающая проверка подверженности: отпечаток версии + подтверждение доступности REST-маршрута /batch/v1. Эксплойт-пейлоад не отправляется. |
--check | Подтверждает слепую time-based SQLi с помощью безвредного дифференциального зонда. |
--read | Извлекает данные через слепую SQLi (пресет или сырое SQL-скалярное выражение). |
--shell | Цепочка аутентифицированного RCE с использованием взломанного/восстановленного пароля администратора. |
--rce | RCE без учётных данных — pre-auth: создаёт собственного администратора через SQLi, затем разворачивает самоочищающийся веб-шелл. |
--root-prereq | Безвредная проверка предпосылок shell-to-root; выполняет только диагностику, никогда — локальную привилегированную эскалацию. |
--lpe | Полная цепочка: pre-auth SQLi → создание администратора → веб-шелл → root. Пробует CVE-2023-2640/32629 (GameOverlay overlayfs), CVE-2023-4911 (Looney Tunables glibc), CVE-2026-31431 (AF_ALG Copy Fail), CVE-2026-23111 (зонд UAF в nf_tables), затем запасной вариант SUID/sudo/cap. |
| Флаг | Применяется к | Что делает |
|---|
-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 для обнаружения pre-auth SQLi (по умолчанию 4). |
--rounds | --rce | Медиана по N зондов для обнаружения --rce (по умолчанию 3). |
--route | --rce | Форма batch-маршрута: auto, rest-route или wp-json (по умолчанию auto). |
--proxy | --rce | Направляет запросы через HTTP-прокси, например Burp на http://127.0.0.1:8080. |
--authorized | --rce | Подтверждает авторизацию для цели --rce вне loopback (обязательно для удалённых хостов). |
--timeout | все | Таймаут запроса в секундах (по умолчанию 15). |
| CVE | Затронутые системы | Методика | Компилятор |
|---|
| CVE-2023-2640 / CVE-2023-32629 | Ubuntu 22.04 / 23.04, ядро < 6.3.3 с драйвером GameOverlay | Непривилегированное монтирование overlayfs в пользовательском namespace сохраняет chmod +s на верхнем каталоге (upper dir) | Нет (чистый shell) |
| CVE-2023-4911 | glibc 2.34–2.38 (Ubuntu 22.04, Debian 12, Fedora 37–38) | Переполнение стека GLIBC_TUNABLES в _dl_parse_tunables() → инъекция LD_PRELOAD при SUID-выполнении | требуется gcc |
| CVE-2026-31431 | Ядро Linux с algif_aead + authencesn(hmac(sha256),cbc(aes)) | AF_ALG AEAD-оптимизация in-place + запись splice() 4 байт в page cache SUID-бинарника; предварительный зонд — ссылка на AliHzSec/CVE-2026-31431 | требуется gcc |
| CVE-2026-23111 | Ubuntu 22.04 / 24.04, Debian Bookworm / Trixie | UAF из-за инвертированной проверки nf_tables в nft_map_catchall_activate() → underflow chain->use → освобождённая цепочка; предварительный зонд — ссылка на Baba01hacker666/CVE-2026-23111 | требуется gcc |
| Запасной вариант | Любая | SUID GTFOBins + злоупотребление sudo NOPASSWD | Нет |