
OPNsense 26.7.6 - 高 - リモート - ネットワークアクセスバイパス - captive lastseen roam
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-captive-lastseen-roam
分類: ネットワークアクセスバイパス 到達範囲: リモート
OPNsense コア 26.7.6 (a842fe48) - opnsense.org
キャプティブポータルのローミングは、依然として MAC 上の最新の hostwatch IPv4 と、すべての IPv6 のセッションを継承します。GHSA-864r (26.7.3) は「すべての IPv4 を追加する」動作を停止しました。残った IPv4 は list_hosts.py の ORDER BY last_seen DESC です。その後、プライマリ IP はフィルタリングされていない current_ips[0] から割り当てられます。Gratuitous ARP attacker_IP is-at victim_MAC が last_seen を更新します。26.7.3 以降、その IPv4 は多数のうちの一つではなく、被害者自身の ARP より新しい場合にフィルタが保持する IPv4 です。IPv6 NDP は一度も制限されていません。ローミングと hostwatch はデフォルトで有効です。
この GitHub パックは調整された開示まで非公開のままです。
| ID | CVE 未割り当て |
| 分類 | ネットワークアクセスバイパス |
| 到達範囲 | リモート (L2 隣接、キャプティブポータルゾーン) |
| CWE | CWE-345 / CWE-863 |
| CVSS | High: 7.4 CVSS:3.1/AV:A/AC:L/PR:N/UI:N/S:C/C:N/I:H/A:N |
| 製品 | OPNsense core |
| 影響を受けるバージョン | 26.7.6 (a842fe48c21288d11a422cb944678e8eb308becf) キャプティブポータルローミング |
| 認証 | キャプティブポータルゾーン上の未認証 L2 隣接ホスト、ローミング有効 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
タグ 26.7.6 のピール a842fe48 を固定しました。ラボは固定された _filter_addresses / list_hosts.py / arp.py の行を再現した Python ガジェットで、127.0.0.1:18820 でループバック待機します。
| 手法 | シンク | 権限 |
|---|---|---|
| roaming=1 の MAC に対する最新の hostwatch IPv4 | _filter_addresses / list_hosts.py の ORDER BY last_seen DESC を固定; プライマリはフィルタリングされていない current_ips[0] から | 完全性 (ラボ実証済み): 攻撃者 192.0.2.99 が保持され、被害者 192.0.2.10 が破棄され、primary=192.0.2.99。ラボ: attacker-ipv4-kept=192.0.2.99 victim-ipv4-dropped=yes roaming=1。 |
| 同じ MAC、roaming=0 | _filter_addresses は [addresses[0]] を返す | ネガティブ (ラボ実証済み): 最初の IPv4 192.0.2.10 が保持される。 |
| 同じ MAC 上の IPv6、roaming=1 | _filter_addresses はすべての非 v4 を保持 | 完全性 (ラボ実証済み): すべての IPv6 が保持される (2001:db8::10 と 2001:db8::99)。 |
| hostwatch が被害者 MAC の下に保存する偽造 GARP / NDP | __captiveportal_zone_N 上のライブ PF.add_to_table / IPFW.add_accounting | 完全性 (推測): 攻撃者の送信元 IP がポータルパステーブルと一致する。セッションユーザー名とクォータは被害者のまま。ワイヤー上のライブ GARP とライブゾーンテーブルパスはこのガジェットでは実行されない。 |
| 同じテーブル追加 | セッションごとの ipfw アカウンティングルール番号 | 完全性 (推測): 攻撃者のバイト数が被害者セッションに計上される。 |
| 被害者 IPv4 がもはや先頭でない | _remove_client / list_session_ips にないアドレスの pf 削除 | 可用性 (推測): 攻撃者 IPv4 が残る一方で、被害者 IPv4 がゾーンテーブルから外れる可能性がある。 |
ラボ実証済み vs 推測: last_seen IPv4 の保持/破棄、roaming=0 の最初の IP、および IPv6 すべてはラボ SUCCESS。ワイヤー上の偽造 GARP、ライブ pf/ipfw パス、およびアカウンティング汚染は推測。ガジェットであり、完全な OPNsense FreeBSD VM ではない。
必要条件: キャプティブポータルゾーン上の L2 隣接未認証ホスト。ローミング有効 (デフォルト)。Hostwatch 有効 (デフォルト)。そのゾーン上にすでに認証済みのセッションが一つ。
| 攻撃面 | ラボ |
|---|---|
| GHSA-864r の全 IPv4 追加 | 26.7.3 で閉鎖; この残存は last_seen IPv4 とすべての IPv6 |
| roaming=0 | 最初の IPv4 が保持される; 攻撃者 IPv4 は選択されない |
異なるログオン IP の XFF / X-Real-Ip スプーフィング | ゾーンプロキシが追加する; クリーンな pf CIDR ではない |
呼び出し元 IP の未認証 logon | getClientIp() の文書化されたポータルログイン |
| デフォルト 8+10 CSPRNG に対するバウチャーブルートフォース | この残存ではない |
| テンプレート zip-slip | realpath と管理者アップロード |
| ポータルスプラッシュ XSS から WebGUI オリジンへ | 異なるポート / chroot |
| WAN 未認証 | ゾーン上の L2 隣接 |
| WebGUI / root / バウチャー発行 | 閉じたまま |
未認証 WebGUI なし。root なし。ポータルの WAN スキップなし。
cd lab
./run.sh
ループバック待機 127.0.0.1:18820。Compose プロジェクト opnsense-captive-lastseen-roam。その compose からのイメージタグ。Witness OPNSENSE-CAPTIVE-LASTSEEN-ROAM-WITNESS。最終行:
SUCCESS opnsense-captive-lastseen-roam attacker-ipv4-kept=192.0.2.99 victim-ipv4-dropped=yes roaming=1 OPNSENSE-CAPTIVE-LASTSEEN-ROAM-WITNESS
ルートランチャー: python3 opnsense-captive-lastseen-roam-Abraxas-Labs.py。
セッションがすでに認証した IPv4 を選択し、その MAC の最新の hostwatch 行を選択しないこと。IPv6 も同様に制限するか、カーネルがまだ保持している NDP を要求すること。フィルタがすでに別のアドレスを選択している場合、フィルタリングされていない current_ips[0] からプライマリを割り当てないこと。last_seen のみを更新する GARP を信頼できない観測として扱うこと。これが GHSA-864r の不変条件です。
a842fe48c21288d11a422cb944678e8eb308becfcp-background-process.py _filter_addresses とプライマリ IP 書き換えlist_hosts.py ORDER BY last_seen DESClib/arp.py get_all_addresses_by_mac