Эксплойт аутентифицированного удаленного выполнения кода для плагина WordPress WP All Import <= 3.6.7 (CVE-2022-1565). Загружает произвольные файлы через небезопасную проверку типа файла в wp_all_import_get_gz.php.
WordPress Plugin WP All Import <= 3.6.7 — удалённое выполнение кода (RCE) (с аутентификацией)
root@kitploit:~
Дата: 05 ноября 2023 г.
Автор эксплойта: Việt HÙng (https://github.com/phanthibichtram12)
Домашняя страница поставщика: https://www.wpallimport.com/
Ссылка на ПО: https://wordpress.org/plugins/wp-all-import/advanced/ (прокрутите вниз и выберите версию)
Версия: <= 3.6.7 (протестировано: 3.6.7)
Протестировано на: WordPress 6.1 (не зависит от ОС, так как этот эксплойт НЕ содержит полезную нагрузку)
CVE: CVE-2022-1565
ОПИСАНИЕ УЯЗВИМОСТИ
Плагин WP All Import уязвим к произвольной загрузке файлов из-за отсутствия проверки типа файла через файл wp_all_import_get_gz.php в версиях до 3.6.7 включительно.
Это позволяет прошедшим аутентификацию злоумышленникам с правами администратора и выше загружать произвольные файлы на сервер уязвимого сайта, что может привести к удалённому выполнению кода.
КАК РАБОТАЕТ ЭКСПЛОЙТ
1. Подготовка ZIP-файла:
создайте PHP-файл с вашей полезной нагрузкой (например, reverse shell)
присвойте переменной "payload_file_name" имя этого файла (например, "shell.php")
создайте ZIP-файл с полезной нагрузкой
присвойте переменной "zip_file_to_upload" путь (PATH) к этому файлу (например, "/root/shell.zip")
2. Вход с учётной записью администратора:
присвойте переменной "target_url" базовый URL цели (НЕ заканчивайте строку символом /)
присвойте переменной "admin_user" имя пользователя учётной записи администратора
присвойте переменной "admin_pass" пароль учётной записи администратора
3. Получение wpnonce с помощью метода get_wpnonce_upload_file()
на самом деле существует 2 типа wpnonce:
первый wpnonce извлекается с помощью метода get_wpnonce_edit_settings() внутри класса PluginSetting.
Этот wpnonce позволяет изменить настройки плагина (см. шаг 4)
второй wpnonce извлекается с помощью метода get_wpnonce_upload_file() внутри класса PluginSetting.
Этот wpnonce позволяет загрузить файл
4. Проверка, включён ли безопасный режим плагина, с помощью метода check_if_secure_mode_is_enabled() внутри класса PluginSetting
если безопасный режим включён, содержимое ZIP-файла помещается в каталог со случайным именем.
Эксплойт отключает безопасный режим.
После отключения безопасного режима содержимое ZIP-файла помещается в основной каталог (см. переменную payload_url).
Метод, используемый для включения и отключения безопасного режима, — set_plugin_secure_mode(set_to_enabled:bool, wpnonce:str)
если безопасный режим НЕ включён, эксплойт загружает файл, но затем НЕ включает безопасный режим.
5. Загрузка файла с помощью метода upload_file(wpnonce_upload_file: str)
после загрузки сервер ответит HTTP 200 OK, но это не означает, что загрузка завершилась успешно.
Ответ будет содержать JSON следующего вида:
{"jsonrpc":2.0","error":{"code":102,"message": Vui lòng xác minh rằng tệp bạn tải lên là tệp ZIP hợp lệ."},"is_valid":false,"id" :"nhận dạng"}
Как видите, в нём сообщается об ошибке с кодом 102, но, согласно проведённой мной проверке, загрузка завершается успешно.
6. Повторное включение безопасного режима, если он был включён, с помощью метода switch_back_to_secure_mode()
7. Активация полезной нагрузки с помощью метода activate_payload()
вы можете самостоятельно определить метод активации полезной нагрузки.
Причина такого выбора в том, что этот эксплойт НЕ предоставляет никакой полезной нагрузки.
Поскольку вы можете использовать собственную полезную нагрузку, вы, возможно, захотите активировать её HTTP POST-запросом вместо HTTP GET-запроса или передать параметры.
ПОЧЕМУ ЭКСПЛОЙТ ОТКЛЮЧАЕТ БЕЗОПАСНЫЙ РЕЖИМ?
Согласно PoC этой уязвимости, предоставленному WPSCAN, загруженные файлы можно получить, перейдя на страницу «Managed Imports».
Не знаю почему, но после загрузки любого файла я не вижу загруженный файл на этой странице (возможно, требуется Pro-версия?).
Мне пришлось найти альтернативное решение, и я сделал это, воспользовавшись этой опцией.
В ходе тестирования я заметил, что загружал недопустимый XML-файл, и именно поэтому он не отображался на странице «Managed Imports».
В любом случае, этот способ отключения безопасного режима немного более «скрытный», поскольку загруженное содержимое не отображается в админ-панели.
Если вы хотите видеть результат загрузки в админ-панели, потребуется выполнить больше шагов.
ЕСТЬ ЛИ ПРОБЛЕМЫ ПРИ ИСПОЛЬЗОВАНИИ ЭКСПЛОЙТА?
Для эффективной работы эксплойта учтите следующее:
проверьте target_url и учётные данные администратора
проверьте путь к ZIP-файлу и имя полезной нагрузки (они могут отличаться)
если вы тестируете локально, попробуйте установить для verify_ssl_certificate значение False
для дальнейшего исследования вы можете использовать print_response(http_response)