فخ (قماش القنب) لاتصالات SSH الواردة

ليس سراً أن الإنترنت بيئة معادية للغاية. بمجرد رفع الخادم ، فإنه يتعرض على الفور لهجمات هائلة وعمليات مسح متعددة. على سبيل المثال من hanipot حارس الأمن ، يمكن للمرء أن تقدير حجم حركة المرور غير المرغوب فيه. في الواقع ، على خادم متوسط ​​، 99 ٪ من حركة المرور يمكن أن تكون ضارة.

Tarpit هو منفذ فخ يُستخدم لإبطاء الاتصالات الواردة. إذا كان هناك نظام طرف ثالث يتصل بهذا المنفذ ، فلن يعمل على إغلاق الاتصال بسرعة. سيتعين عليها إنفاق موارد نظامها والانتظار حتى يتم مقاطعة الاتصال بواسطة مهلة ، أو قطعها يدويًا.

في معظم الأحيان ، يتم استخدام قماش القنب للحماية. تم تطوير هذه التقنية لأول مرة للحماية من ديدان الكمبيوتر. والآن يمكن استخدامه لإفساد حياة مرسلي البريد العشوائي والباحثين الذين يشاركون في مسح واسع لجميع عناوين IP على التوالي (أمثلة على Habré: النمسا ، أوكرانيا ).

واحد من مسؤولي النظام يدعى كريس ويلونز ، تعبت على ما يبدو من مشاهدة هذا الخزي - وكتب برنامجا صغيرا Endlessh ، tarpit ل SSH ، إبطاء الاتصالات الواردة. يفتح البرنامج المنفذ (بشكل افتراضي ، يتم تحديد المنفذ 2222 للاختبار) ويتظاهر بأنه خادم SSH ، ولكنه في الواقع ينشئ اتصالًا لا ينتهي مع العميل الوارد حتى يستسلم. قد يستمر هذا لعدة أيام أو أكثر حتى يسقط العميل.

تركيب المرافق:

$ make $ ./endlessh & $ ssh -p2222 localhost 

سوف يأخذ قماش القنب المنفّذ بشكل صحيح موارد أكثر من المهاجم منك. لكن المسألة ليست حتى في الموارد. المؤلف يكتب أن البرنامج هو الادمان. يوجد 27 عميلًا محاصرون في الوقت الحالي ، بعضهم متصل بأسابيع. في ذروة النشاط ، جلس 1378 عميلًا في الفخ لمدة 20 ساعة!

في وضع التشغيل ، يجب تثبيت خادم Endlessh على المنفذ العادي 22 ، حيث يطرق مثيري الشغب على نطاق واسع. تنصح توصيات الأمان القياسية دائمًا بنقل SSH إلى منفذ مختلف ، مما يقلل على الفور من أحجام السجل بترتيب من حيث الحجم.

يقول كريس ويلونز إن برنامجه يستغل فقرة واحدة من مواصفات RFC 4253 لبروتوكول SSH. مباشرة بعد تأسيس اتصال TCP ، ولكن قبل تطبيق التشفير ، يجب على الطرفين إرسال سلسلة تعريف. وهناك ملاحظة: "قد يرسل الخادم صفوفًا أخرى من البيانات قبل إرسال الصف مع الإصدار . " وليس هناك حد لكمية هذه البيانات ، فقط كل سطر يجب ألا يبدأ بـ SSH- .

هذا هو بالضبط ما يفعله Endlessh: فهو يرسل دفقًا لا ينتهي من البيانات التي تم إنشاؤها عشوائيًا والتي تتوافق مع RFC 4253 ، أي الإرسال قبل التعريف ، ولا يبدأ كل سطر بـ SSH- ولا يتجاوز 255 حرفًا ، بما في ذلك حرف إنهاء السطر. بشكل عام ، كل شيء قياسي.

بشكل افتراضي ، ينتظر البرنامج 10 ثوانٍ بين إرسال الحزم. هذا يمنع رحلة مهلة بحيث سيتم المحاصرين العميل إلى الأبد.

نظرًا لإرسال البيانات قبل تطبيق التشفير ، فإن البرنامج بسيط للغاية. أنها لا تحتاج إلى تنفيذ أي الأصفار ودعم بروتوكولات متعددة.

حاول المؤلف جعل الأداة تستهلك الحد الأدنى من الموارد وتعمل بسلاسة على الجهاز. على عكس برامج مكافحة الفيروسات الحديثة و "أنظمة الأمان" الأخرى ، يجب ألا يبطئ الكمبيوتر. لقد نجح في تقليل استهلاك البيانات وحركة المرور إلى حدٍ كبير بسبب تنفيذ برنامج أكثر دقة. إذا بدأ ببساطة عملية منفصلة على اتصال جديد ، يمكن للمهاجمين المحتملين القيام بهجوم DDoS ، مما يفتح العديد من الاتصالات لاستنفاد موارد الجهاز. مؤشر ترابط واحد لكل اتصال ليس هو أيضًا الخيار الأفضل ، لأن kernel سينفق الموارد على إدارة مؤشر الترابط.

لذلك ، اختار Chris Wellons الخيار الأكثر خفيفة الوزن لـ Endlessh: خادم الاستقصاء المفرد poll(2) ، حيث العملاء في المصيدة لا يستهلكون من الناحية العملية موارد غير ضرورية ، دون حساب كائن مأخذ التوصيل في kernel و 78 بايت إضافية للتتبع في Endlessh. من أجل عدم تخصيص المخازن المؤقتة للتلقي والإرسال لكل عميل ، يقوم Endlessh بفتح مقبس وصول مباشر وترجمة حزم TCP مباشرةً ، متجاهلاً كدسة TCP / IP بأكملها تقريبًا في نظام التشغيل. لا يلزم وجود مخزن مؤقت للإدخال على الإطلاق ، لأن بيانات الإدخال لا تهمنا.

يقول المؤلف إنه في وقت برنامجه لم يكن يعلم بوجود بيثون أسيسو وغيرها من القماش المشمع. إذا كان يعلم عن asycio ، فيمكنه تنفيذ فائدته في 18 سطرًا فقط في Python:

 import asyncio import random async def handler(_reader, writer): try: while True: await asyncio.sleep(10) writer.write(b'%x\r\n' % random.randint(0, 2**32)) await writer.drain() except ConnectionResetError: pass async def main(): server = await asyncio.start_server(handler, '0.0.0.0', 2222) async with server: await server.serve_forever() asyncio.run(main()) 


Asyncio مثالي لكتابة قماش القنب. على سبيل المثال ، سيعلق هذا الفخ Firefox أو Chrome أو عميل آخر يحاول الاتصال بخادم HTTP الخاص بك لعدة ساعات:

 import asyncio import random async def handler(_reader, writer): writer.write(b'HTTP/1.1 200 OK\r\n') try: while True: await asyncio.sleep(5) header = random.randint(0, 2**32) value = random.randint(0, 2**32) writer.write(b'X-%x: %x\r\n' % (header, value)) await writer.drain() except ConnectionResetError: pass async def main(): server = await asyncio.start_server(handler, '0.0.0.0', 8080) async with server: await server.serve_forever() asyncio.run(main()) 


Tarpit هو أداة عظيمة لمعاقبة الفتوات على الإنترنت. صحيح ، هناك بعض المخاطر ، على العكس من ذلك ، للفت انتباههم إلى السلوك غير العادي لخادم معين. قد يفكر شخص ما في الانتقام وهجوم DDoS مستهدف على IP الخاص بك. ومع ذلك ، حتى الآن لم تكن هناك مثل هذه الحالات ، والقذيفة تعمل بشكل جيد.





Source: https://habr.com/ru/post/ar445318/


All Articles