تسمح الطريقة باستبدال الحزم على مستوى اتصالات TCP التي تمر داخل نفق مشفر، ولكنها لا تسمح بالدمج في الاتصالات التي تستخدم طبقات تشفير إضافية (على سبيل المثال، TLS، HTTPS، SSH). لا يهم خوارزميات التشفير المستخدمة في VPN، حيث أن الحزم المخادعة تأتي من الواجهة الخارجية وتتم معالجتها بواسطة النواة كحزم من واجهة VPN. الهدف الأكثر احتمالاً للهجوم هو التدخل في اتصالات HTTP غير المشفرة، ولكن
لقد تم إثبات نجاح انتحال الحزم في الأنفاق التي تم إنشاؤها باستخدام OpenVPN وWireGuard وIKEv2/IPSec. Tor ليس عرضة لهذه المشكلة، لأنه يستخدم SOCKS لإعادة توجيه حركة المرور ويرتبط بواجهة الاسترجاع. بالنسبة لـ IPv4، يكون الهجوم ممكنًا إذا تم تعيين rp_filter على الوضع "Loose" (sysctl net.ipv4.conf.all.rp_filter = 2). في البداية، استخدمت معظم الأنظمة الوضع "الصارم"، ولكن بدءًا من
آلية rp_filter
قد يمر مسار الاستجابة عبر واجهة شبكة غير تلك التي وصلت الحزمة الواردة من خلالها.
في الوضع فضفاض، يتم فحص الحزمة الواردة مقابل جدول التوجيه، ولكنها تعتبر صالحة إذا كان عنوان المصدر يمكن الوصول إليه من خلال أي واجهة شبكة متاحة. يعتمد الهجوم المقترح على حقيقة أن المهاجم يمكنه إرسال حزمة بعنوان مصدر مزيف يتوافق مع واجهة VPN، وعلى الرغم من أن هذه الحزمة ستدخل النظام من خلال واجهة الشبكة الخارجية وليس من خلال VPN، لن يتم تجاهل الوضع "الفضفاض" rp_filter مثل هذه الحزمة.
لتنفيذ هجوم، يجب على المهاجم التحكم في البوابة التي يصل المستخدم من خلالها إلى الشبكة (على سبيل المثال، من خلال منظمة MITM، عندما يتصل الضحية بنقطة وصول لاسلكية يتحكم فيها المهاجم، أو من خلال
من خلال توليد دفق من الحزم الوهمية التي يتم فيها استبدال عنوان IP الخاص بواجهة VPN، تتم محاولات للتأثير على الاتصال الذي أنشأه العميل، ولكن لا يمكن ملاحظة تأثير هذه الحزم إلا من خلال التحليل السلبي لتدفق حركة المرور المشفرة المرتبطة مع تشغيل النفق. لتنفيذ هجوم، تحتاج إلى معرفة عنوان IP الخاص بواجهة شبكة النفق التي تم تعيينها بواسطة خادم VPN، وكذلك تحديد ما إذا كان الاتصال بمضيف معين نشطًا حاليًا عبر النفق.
لتحديد عنوان IP لواجهة الشبكة الافتراضية الخاصة بـ VPN، يتم إرسال حزم SYN-ACK إلى النظام الضحية، مع تعداد النطاق الكامل للعناوين الافتراضية بشكل تسلسلي (أولاً وقبل كل شيء، يتم تعداد العناوين المستخدمة في VPN افتراضيًا، على سبيل المثال، OpenVPN يستخدم الشبكة الفرعية 10.8.0.0/24). يمكن الحكم على وجود عنوان بناءً على استلام استجابة بعلامة RST.
بطريقة مماثلة، يتم تحديد وجود اتصال بموقع معين ورقم المنفذ على جانب العميل - من خلال فرز أرقام المنافذ، يتم إرسال حزمة SYN إلى المستخدم، كعنوان المصدر، حيث IP يتم استبدال الموقع، وعنوان الوجهة هو IP VPN افتراضي. يمكن التنبؤ بمنفذ الخادم (80 لـ HTTP)، ويمكن حساب رقم المنفذ على جانب العميل عن طريق القوة الغاشمة، وتحليل التغير في شدة استجابات ACK مع عدم وجود حزمة مع RST لأرقام مختلفة. علَم.
في هذه المرحلة، يعرف المهاجم جميع عناصر الاتصال الأربعة (عناوين/منفذ IP المصدر وعنوان/منفذ IP الوجهة)، ولكن من أجل إنشاء حزمة وهمية يقبلها النظام الضحية، يجب على المهاجم تحديد تسلسل TCP و أرقام الإقرار (seq وack) - الاتصالات. لتحديد هذه المعلمات، يرسل المهاجم باستمرار حزم RST مزيفة، محاولًا استخدام أرقام تسلسلية مختلفة، حتى يكتشف حزمة استجابة ACK، والتي يشير وصولها إلى أن الرقم يقع ضمن نافذة TCP.
بعد ذلك، يوضح المهاجم صحة التعريف عن طريق إرسال حزم بنفس الرقم ومراقبة وصول استجابات ACK، وبعد ذلك يختار العدد الدقيق للتسلسل الحالي. المهمة معقدة بسبب حقيقة أن الاستجابات يتم إرسالها داخل نفق مشفر ولا يمكن تحليل وجودها في تدفق حركة المرور المعترض إلا باستخدام طرق غير مباشرة. يتم تحديد ما إذا كان العميل يرسل حزمة ACK موجهة إلى خادم VPN بناءً على حجم وزمن الاستجابة للاستجابات المشفرة، والتي ترتبط بإرسال الحزم المخادعة. على سبيل المثال، بالنسبة لـ OpenVPN، يسمح لك حجم الحزمة المشفرة البالغ 79 بالحكم بدقة على وجود ACK بالداخل.
حتى تتم إضافة الحماية من الهجمات إلى نواة نظام التشغيل كوسيلة مؤقتة لمنع المشكلة
iptables -t Raw -I PREROUTING ! -i wg0 -d 10.182.12.8 -m addrtype ! --src-type LOCAL -j DROP
أو للnftables
NFT إضافة جدول IP الخام
nft add chain ip Raw prerouting '{ نوع مرشح ربط أولوية التوجيه المسبق 0؛ }'
nft إضافة قاعدة التوجيه المسبق ip الخام 'iifname != "wg0" ip adddr 10.182.12.8 fib Saddr type != local drop'
لحماية نفسك عند استخدام الأنفاق بعناوين IPv4، ما عليك سوى ضبط rp_filter على الوضع "Strict" ("sysctl net.ipv4.conf.all.rp_filter = 1"). من ناحية VPN، يمكن حظر طريقة الكشف عن الرقم التسلسلي عن طريق إضافة الحشو إلى الحزم المشفرة، مما يجعل جميع الحزم بنفس الحجم.
المصدر: opennet.ru