
OPNsense 26.7.6 - عالية - عن بُعد - تجاوز الوصول إلى الشبكة - captive lastseen roam
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · opnsense-captive-lastseen-roam
التصنيف: تجاوز التحكم في الوصول إلى الشبكة الوصول: عن بُعد
OPNsense core 26.7.6 (a842fe48) - opnsense.org
لا يزال تجوال بوابة الالتقاط (captive-portal) يورّث جلسةً لأحدث مضيف IPv4 في hostwatch على عنوان MAC، بالإضافة إلى كل عناوين IPv6. أوقف GHSA-864r (26.7.3) سلوك "إضافة كل عنوان IPv4". عنوان IPv4 المتبقي هو list_hosts.py ORDER BY last_seen DESC. ثم يُسنَد العنوان IP الأساسي من current_ips[0] غير المُرشَّح. يُحدِّث ARP العشوائي (Gratuitous ARP) attacker_IP is-at victim_MAC قيمة last_seen. بعد 26.7.3 لم يعد ذلك العنوان IPv4 واحدًا من كثير؛ بل هو العنوان IPv4 الذي يُبقيه المرشِّح إن كان أحدث من ARP الخاص بالضحية. لم يُحدَّد IPv6 NDP أبدًا. التجوال وhostwatch مُفعَّلان افتراضيًا.
تبقى حزمة GitHub هذه خاصة حتى الإفصاح المنسَّق.
| المعرّف | لا يوجد CVE بعد |
| التصنيف | تجاوز التحكم في الوصول إلى الشبكة |
| الوصول | عن بُعد (مجاور للطبقة الثانية، منطقة بوابة الالتقاط) |
| CWE | CWE-345 / CWE-863 |
| CVSS | مرتفع: 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) تجوال بوابة الالتقاط |
| المصادقة | مضيف غير مُصادَق مجاور للطبقة الثانية في منطقة بوابة الالتقاط؛ التجوال مُفعَّل |
| الترخيص | GNU Affero GPL v3.0 |
| المختبر | 127.0.0.1 فقط |
ثبّتُّ الوسم 26.7.6 peel a842fe48. المختبر عبارة عن أداة Python تحاكي أسطر _filter_addresses / list_hosts.py / arp.py المثبَّتة، مع انتظار loopback على 127.0.0.1:18820.
| الطريقة | المَصبّ | الصلاحية |
|---|---|---|
| أحدث مضيف IPv4 في hostwatch لعنوان MAC مع roaming=1 | تثبيت _filter_addresses / list_hosts.py ORDER BY last_seen DESC؛ الأساسي من current_ips[0] غير المُرشَّح | السلامة (مُثبَت مختبريًا): يُحتفَظ بعنوان المهاجم 192.0.2.99، ويُسقَط عنوان الضحية 192.0.2.10، الأساسي=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. |
| IPv6 على نفس عنوان MAC، roaming=1 | _filter_addresses يُبقي كل ما ليس v4 | السلامة (مُثبَت مختبريًا): يُحتفَظ بكل عناوين IPv6 (2001:db8::10 و2001:db8::99). |
| GARP / NDP مُزوَّر يخزّنه hostwatch تحت عنوان MAC الخاص بالضحية | PF.add_to_table / IPFW.add_accounting الحيّين على __captiveportal_zone_N | السلامة (مُستنتَج): عنوان IP المصدر للمهاجم يطابق جدول مرور البوابة. يبقى اسم مستخدم الجلسة والحصة للضحية. لا يُشغَّل GARP الحيّ على الشبكة ولا مرور جدول المنطقة الحيّ في هذه الأداة. |
| نفس إضافة الجدول | رقم قاعدة محاسبة ipfw لكل جلسة | السلامة (مُستنتَج): تُحتسَب بايتات المهاجم على جلسة الضحية. |
| لم يعد عنوان IPv4 للضحية أولًا | _remove_client / حذف pf للعناوين غير الموجودة في list_session_ips | التوافر (مُستنتَج): يمكن أن يسقط عنوان IPv4 للضحية من جدول المنطقة بينما يبقى عنوان IPv4 للمهاجم. |
مُثبَت مختبريًا مقابل مُستنتَج: الإبقاء/الإسقاط على last_seen IPv4، وأول IP عند roaming=0، وكل IPv6 هي نجاح مختبري. GARP المُزوَّر على الشبكة، ومرور pf/ipfw الحيّ، وتلويث المحاسبة مُستنتَجة. أداة، وليست جهازًا افتراضيًا كاملًا لـ OPNsense FreeBSD.
يتطلب: مضيفًا غير مُصادَق مجاورًا للطبقة الثانية في منطقة بوابة الالتقاط. التجوال مُفعَّل (افتراضي). hostwatch مُفعَّل (افتراضي). جلسة واحدة مُصرَّح بها مسبقًا في تلك المنطقة.
| السطح | المختبر |
|---|---|
| GHSA-864r إضافة-كل-IPv4 | مغلق في 26.7.3؛ هذا المتبقي هو last_seen IPv4 بالإضافة إلى كل IPv6 |
| roaming=0 | يُحتفَظ بأول IPv4؛ لا يُختار عنوان IPv4 للمهاجم |
انتحال XFF / X-Real-Ip لعنوان IP تسجيل دخول مختلف | وكيل المنطقة يُلحِق؛ ليس CIDR pf نظيفًا |
logon غير مُصادَق لعنوان IP الخاص بالمتصل | تسجيل دخول البوابة الموثَّق لـ getClientIp() |
| تخمين القسائم على CSPRNG الافتراضي 8+10 | ليس هذا المتبقي |
| zip-slip في القالب | realpath بالإضافة إلى رفع المسؤول |
| XSS في شاشة البوابة إلى أصل WebGUI | منفذ / chroot مختلف |
| WAN غير مُصادَق | مجاور للطبقة الثانية في المنطقة |
| WebGUI / root / إصدار القسائم | يبقى مغلقًا |
لا WebGUI غير مُصادَق. لا root. لا تجاوز للبوابة من WAN.
cd lab
./run.sh
انتظار loopback 127.0.0.1:18820. مشروع Compose opnsense-captive-lastseen-roam. وسم الصورة من ذلك الـ compose. الشاهد 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 الذي صرّحت به الجلسة مسبقًا، وليس أحدث صف hostwatch لذلك العنوان MAC. حدِّد IPv6 بالطريقة نفسها، أو اشترط NDP الذي لا يزال النواة يحتفظ به. لا تُسنِد الأساسي من current_ips[0] غير المُرشَّح عندما يكون المرشِّح قد اختار بالفعل عنوانًا مختلفًا. عامل GARP الذي يُحدِّث last_seen فقط كملاحظة غير موثوقة، وهو ثابت GHSA-864r.
a842fe48c21288d11a422cb944678e8eb308becfcp-background-process.py _filter_addresses وإعادة كتابة IP الأساسيlist_hosts.py ORDER BY last_seen DESClib/arp.py get_all_addresses_by_mac