فخ (tarpit) لاتصالات SSH الواردة

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

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

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

يبدو أن أحد مسؤولي النظام يدعى كريس ويلونز، سئم من مشاهدة هذا العار - وقام بكتابة برنامج صغير بلا نهاية، وهو عبارة عن هيكل 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 عن طريق فتح العديد من الاتصالات لاستنفاد الموارد على الجهاز. كما أن مؤشر ترابط واحد لكل اتصال ليس هو الخيار الأفضل، لأن النواة سوف تهدر الموارد على إدارة الخيوط.

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

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

import asyncio
import random

async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % 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 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (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 الخاص بك. ومع ذلك، حتى الآن لم تكن هناك مثل هذه الحالات، والقماش يعمل بشكل رائع.

المحاور:
بايثون، أمن المعلومات، البرمجيات، إدارة النظام

به:
SSH، Endlessh، tarpit، tarpit، trap، asycio
فخ (tarpit) لاتصالات SSH الواردة

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

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

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

يبدو أن أحد مسؤولي النظام يدعى كريس ويلونز، سئم من مشاهدة هذا العار - وقام بكتابة برنامج صغير بلا نهاية، وهو عبارة عن هيكل 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 عن طريق فتح العديد من الاتصالات لاستنفاد الموارد على الجهاز. كما أن مؤشر ترابط واحد لكل اتصال ليس هو الخيار الأفضل، لأن النواة سوف تهدر الموارد على إدارة الخيوط.

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

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

import asyncio
import random

async def handler(_reader, writer):
try:
while True:
await asyncio.sleep(10)
writer.write(b'%xrn' % 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 OKrn')
try:
while True:
await asyncio.sleep(5)
header = random.randint(0, 2**32)
value = random.randint(0, 2**32)
writer.write(b'X-%x: %xrn' % (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 الخاص بك. ومع ذلك، حتى الآن لم تكن هناك مثل هذه الحالات، والقماش يعمل بشكل رائع.

فخ (tarpit) لاتصالات SSH الواردة

المصدر: www.habr.com

إضافة تعليق