Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
pfsense-api-fleet-jwt — pfSense Plus MIM API toolkit b4acd7ca - 高 - リモート - IDOR - 1つのコントローラーJWTはフリートトークンです | Kitploit
ツール/GitHubGitHub/abraxas/pfsense-api-fleet-jwt
認証と認可脆弱性分析エクスプロイトウェブアプリケーション悪用情報収集ペネトレーションテストAPIセキュリティラボと実践
GitHubabraxas/pfsense-api-fleet-jwt

pfsense-api-fleet-jwt

pfSense Plus MIM API toolkit b4acd7ca - 高 - リモート - IDOR - 1つのコントローラーJWTはフリートトークンです

リポジトリを見る
1日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

Abraxas Labs - pfsense-api-fleet-jwt

abraxaslabs.tech  ·  github.com/abraxas  ·  @abraxas_null  ·  [email protected]  ·  pfsense-api-fleet-jwt

pfsense-api-fleet-jwt

Class: IDOR Reach: Remote

pfSense Plus MIM API (Netgate) pin b4acd7ca - github.com/Netgate/pfsense-api

1つの POST /login Bearer が、登録されたすべての device_id で再利用されます。公式のサンプルでは、GET /mim/devices から取得したすべての id に対して、そのトークンを /api/device/pfsense/{device_id}/api にコピーしています。LoginResponse のフィールドは token、user、version、alerts のみです。LDAP MIM のロールはグローバルです。デバイスには紐付けられていません。デバイスを一覧表示できるコントローラのログインは、ファイアウォール A 向けのユーザーとして発行されたトークンで、ファイアウォール B と通信します。

これは1つの顧客テナンシーであり、SaaS のクロステナントの残存物ではありません。未認証の呼び出しは 401 のままです。Plus の RBAC は実行されませんでした。シリーズハブ: pfsense-api-nexus-mim(これは残存物6)。残存物9(verify_ssl=False のサンプル)から盗まれた JWT が、このフリートトークンです。

IDCVE はまだなし
ClassIDOR
ReachRemote(認証済みコントローラ JWT)
CWECWE-639
CVSSHigh: 8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N
ProductNetgate/pfsense-api(pfSense Plus Nexus Multi-instance Management コントローラ OpenAPI + 生成クライアント)
Affectedpin b4acd7ca21dbca739a530403a1f62a7440f7726f(2026-05-25)。タグなし。サーバーは Plus 専用(有償)。CE REST パッケージではありません。
AuthPOST /login からのコントローラ JWT。GET /mim/devices が許可されている場合、device_id の推測は不要です。
LicenseGNU Affero GPL v3.0
Lab127.0.0.1:19161 のみ。公開されたクライアント契約の Python モック。Plus イメージはありません。

github.com/Netgate/pfsense-api の main b4acd7ca21dbca739a530403a1f62a7440f7726f(2026-05-25、Add Snort-3 API definitions)をピン留めしました。これは jaredhendrickson/pfsense-api / pfrest.org ではありません。

攻撃者ができること

デバイスを一覧表示できるコントローラのログインは、同じ JWT で登録されたすべてのインスタンスと通信します。CSRF は関係ありません(Bearer API)。PHP / shell / export-key はすべてのボックスで、プロキシがフリートトークンを受け入れた時点で、意図された管理者権限です。残存物はデバイスごとのバインドの欠如であり、Diagnostics: Command ではありません。

権限メソッド / パスラボで実証済みか推測か
登録済みの全 device_id を列挙する(名前、アドレス、状態)ログイン Bearer 付きの GET /mim/devices偵察(ラボで実証済み)。 モックは site-a と site-b の両方を返した。未認証は 401。
1 つのトークンでファイアウォール A とファイアウォール B のシステムステータスを読むGET /api/device/pfsense/{device_id}/api/system偵察(ラボで実証済み)。 device-a=200、device-b=200。Witness は B のみ。
両方の id に対して診断 PHP ラッパーを POST するPOST /api/device/pfsense/{device_id}/api/diag/cmd/php完全性(モック上でのみラボ検証)。 両方 200。さらに RBAC は実行されなかったため、ライブのロールゲートは未証明。
ログインに console または system が含まれる場合、登録済みの全ボックスで PHP / シェル / ファイル編集を実行するPOST /diag/cmd/php、POST /diag/cmd/shell、GET/POST /diag/editfile、download/upload完全性(OAS + 例から推測)。 プロキシがフリートトークンを受け入れた時点で意図される管理者権限。典型的な pfSense PHP-FPM は root。
列挙された全インスタンスで CA / リーフ秘密鍵と PKCS12 をエクスポートするGET /system/certificates/{refid}/export-key、GET /system/certauth/{refid}/export-key、GET /system/certificates/{refid}/export-p12偵察(推測)。 同じ JWT、leftover 4 と同じスキーマ。さらに RBAC は未実行。
列挙された全インスタンスで ACME アカウントと発行済み鍵をダンプするGET /services/acme および関連する account/cert GET偵察(推測)。 同じ JWT、leftover 5 のスキーマ。
列挙された全インスタンスでエイリアス、ファイアウォール、インターフェース、VPN、サービスを変更する同じ per-device プレフィックス、残り 700 以上の操作完全性(推測)。 同じ JWT、ローカルインスタンスと同じスキーマ。
列挙された全インスタンスで再起動 / 停止 / 設定復元を行うPOST /diag/control、POST /diag/backup/restore可用性 + 完全性(推測)。 同じプロキシ。未実行。
クロスカスタマー SaaS IDORn/aクローズ。 単一顧客テナンシー。Netgate はそのテナンシーでコントローラーを運用している。
未認証のインターネットから :8443 へBearer なしの GET /mim/devicesこのラボではクローズ。 401。誤った Bearer も 401。
オフラインデバイスサンプルは state != online をスキップサンプルによりクローズ。 認証境界ではない。
device_id のブラインド数値探索GET /api/device/pfsense/1/api/system推測要件としてクローズ。 id は長い文字列(ED25519 形状)。列挙により推測が不要になる。

必要条件: デバイスプロキシへのアクセスが許可されたコントローラーログイン。MIM コントローラーへのネットワークパス(製品では :8443、このラボではループバック :19161)。未認証ではない。CSRF ではない。

クローズのままの隣接サーフェス

サーフェス理由
未認証の listing / php / shellBearer なしおよび誤った Bearer でのモック 401。securitySchemes に関する仕様の沈黙はサーバー 200 ではない。
SaaS クロステナント単一顧客テナンシー。テナンシークラスターはマーケティングページでは依然として計画されていた。
mim_user / Nexus グループなしログインゲートが保持される場合はクローズと文書化されている。
機能的な mim_* ロール名それらは存在する(view、logs、usermgmt、services、firewall、interfaces、devices、system、superuser)。それらはグローバルであり、device_id ごとではない。ライブ Plus チェックは実行されなかった(plus-rbac=not-executed)。
登録 SSH JSON 補間Leftover 1。別パック。
登録 AutoAddPolicyLeftover 2。別パック。
JWT なしのデバイス unix ソケットLeftover 3。ローカル、別パック。
CE REST パッケージjaredhendrickson/pfsense-api は別のサーバー。
CE WebGUI QinQ / OpenVPN ウィザード / CARP / limiter / IPsec バナーすでに CE の leftover としてメール済み。この OAS のフィールド名は同じシンクであり、新しい CVE ではない。
意図された admins / mim_superuser フリートコンソールコントローラー所有者向けの製品モデル。leftover は他の全員に対する欠落したオブジェクト ACL。

発見方法

b4acd7ca を固定し、OpenAPI に対して公式の例を読みました。管理対象ファイアウォールと通信するすべてのサンプルは次のことを行います:

devApi = AuthenticatedClient(
    base_url=CONTROLLER_URL+"/api/device/pfsense/{}/api".format(device.device_id),
    verify_ssl=False,
    headers={"Content-Type": "application/json"},
    cookies=cookies,
    token=token,
)

helper_funcs.py の createDeviceApiChild は任意の device_id 文字列を受け取り、self.token をコピーします。example.js は newClient("device/pfsense/" + device.device_id + "/api") を実行した後、setBearer(client.getBearer()) を呼び出します。example-upgrade-devices.py の newDevApiClient も同じコピーです。GET /mim/devices は列挙のオラクルです(tags フィルタのみ)。

pfapi_openapi.yml および py/pfapi/models/login_response.py の LoginResponse は token / user / version / alerts です。LDAP の nexus_group_prefix はロール view, logs, usermgmt, services, firewall, interfaces, devices, system, superuser を、任意の read/modify/delete 付きでドキュメント化しています。これらの名前の中にデバイスリストを取るものはありません。

誤った方向性: これを SaaS のクロステナント IDOR として扱うこと。OpenAPI が securitySchemes について沈黙していることを未認証 RCE とみなすこと(モックは Bearer なしでは依然として 401 を返します)。Plus を実行せずに mim_view と mim_system の分割が実在すると仮定すること。POST /diag/cmd/php を未公開の Critical としてランク付けすること(Netgate は Diagnostics: Command を意図された管理者権限として扱っています)。茶番: リバースシェル。オラクルは 1 つのトークン、2 つのデバイス ID、両方 200、証拠は B のみ。

Lab

python3 pfsense-api-fleet-jwt-Abraxas-Labs.py

または

cd lab
./run.sh

Loopback 127.0.0.1:19161。Compose プロジェクト pfsense-api-fleet-jwt。公開されているログインおよびデバイスごとのプロキシコントラクトの Python モック。スタックは実行後に破棄される。Pin YAML の抜粋は poc.py にバンドルされている。リポジトリのローカルクローンは任意。Plus イメージなし。Witness PFSENSE-API-FLEET-JWT-WITNESS。最終行:

SUCCESS PFSENSE-API-FLEET-JWT one-token=yes device-a=200 device-b=200 schema-no-device-acl=yes plus-rbac=not-executed PFSENSE-API-FLEET-JWT-WITNESS

修正

JWT をデバイスタグまたは許可リストにバインドし、ファイアウォール A 向けのログインが /api/device/pfsense/{B}/api を呼び出せないようにします。コントローラー管理者とインスタンスコンソールを分離し、ヘルプデスクロールが登録済みのすべてのボックスで POST /diag/cmd/php を実行できないようにします。LoginResponse でロールと許可されたデバイスを返します。GET /mim/devices を表示フィルターではなく認可境界として扱います。

参考資料

ツールをダウンロード