
استخراج البيانات خلسة من المتصفح عبر DNS
Browsertunnel هي أداة لتسريب البيانات من المتصفح باستخدام بروتوكول DNS. يتم ذلك عن طريق إساءة استخدام dns-prefetch، وهي ميزة تهدف إلى تقليل زمن الاستجابة الملحوظ لمواقع الويب عن طريق إجراء استعلامات DNS في الخلفية لنطاقات محددة. لا يظهر حركة مرور DNS في أدوات تصحيح المتصفح، ولا يتم حظرها بواسطة سياسة أمان المحتوى (CSP) للصفحة، وغالبًا لا يتم فحصها بواسطة جدران الحماية أو البروكسيات الخاصة بالشركات، مما يجعلها وسيلة مثالية لتهريب البيانات في السيناريوهات المقيدة.
إنها تقنية قديمة – حيث يعود نفق DNS نفسه إلى التسعينيات، وقد كتب Patrick Vananti حول استخدام dns-prefetch لهذا الغرض في عام 2016، ولكن على حد علمي، فإن browsertunnel هي أول أداة مفتوحة المصدر وجاهزة للإنتاج توضح استخدامها. نظرًا لأن dns-prefetch لا يعيد أي بيانات إلى JavaScript العميل، فإن الاتصال عبر browsertunnel يكون أحادي الاتجاه فقط. بالإضافة إلى ذلك، تقوم بعض المتصفحات بتعطيل dns-prefetch افتراضيًا، وفي هذه الحالات، سيفشل browsertunnel بصمت.
يتكون المشروع من جزأين:
html/، تقوم بتشفير وإرسال الرسائل من جهة العميل.يمكن لـ Browsertunnel إرسال سلاسل نصية عشوائية عبر DNS عن طريق ترميز السلسلة في نطاق فرعي، يتم توجيهه إلى خادم browsertunnel عندما يحاول المتصفح حل النطاق بشكل متكرر.
يتم تقسيم الرسائل الأطول التي لا يمكن احتواؤها في نطاق واحد (253 بايت) تلقائيًا إلى استعلامات متعددة، يتم إعادة تجميعها وفك تشفيرها بواسطة الخادم.
أولاً، قم بإعداد سجلات DNS لتفويض نطاق فرعي إلى خادمك. على سبيل المثال، إذا كان عنوان IP لخادمك هو 192.0.2.123 وتريد عمل نفق عبر النطاق الفرعي t1.example.com، فسيبدو تكوين DNS الخاص بك كالتالي:
t1 IN NS t1ns.example.com.
t1ns IN A 192.0.2.123
على الخادم الخاص بك، قم بتثبيت browsertunnel باستخدام go get. بدلاً من ذلك، قم بتجميع browsertunnel على جهازك الخاص، وانسخ الملف الثنائي إلى الخادم الخاص بك.
go get github.com/veggiedefender/browsertunnel
بعد ذلك، قم بتشغيل browsertunnel، مع تحديد النطاق الفرعي الذي تريد عمل نفق من خلاله.
browsertunnel t1.example.com
للاستخدام الكامل، قم بتشغيل browsertunnel -help:
$ browsertunnel -help
Usage of browsertunnel:
-deletionInterval int
seconds in between checks for expired messages (default 5)
-expiration int
seconds an incomplete message is retained before it is deleted (default 60)
-maxMessageSize int
maximum encoded size (in bytes) of a message (default 5000)
-port int
port to run on (default 53)
للحصول على أوصاف أكثر تفصيلاً ومبررات لهذه المعلمات، يمكنك أيضًا مراجعة godoc.
أخيرًا، اختبر نفقك! يمكنك استخدام صفحة العرض التوضيحي الخاصة بي هنا أو استنساخ هذا المستودع وتحميل html/index.html محليًا. إذا كان كل شيء يعمل، فيجب أن تتمكن من رؤية الرسائل مسجلة في stdout.
للتطبيقات الواقعية لهذا المشروع، قد ترغب في عمل fork وتعديل الكود كما تراه مناسبًا. بعض الأفكار: