تله (tarpit) برای اتصالات SSH ورودی

بر کسی پوشیده نیست که اینترنت یک محیط بسیار خصمانه است. به محض اینکه سروری را بالا می برید، فوراً در معرض حملات گسترده و اسکن های متعدد قرار می گیرد. مثلا هانی پات از نگهبانان شما می توانید مقیاس این ترافیک زباله را تخمین بزنید. در واقع، در سرورهای متوسط، 99 درصد از ترافیک ممکن است مخرب باشد.

تارپیت یک پورت تله است که برای کاهش سرعت اتصالات ورودی استفاده می شود. اگر یک سیستم شخص ثالث به این پورت متصل شود، نمی توانید به سرعت اتصال را ببندید. او باید منابع سیستم خود را هدر دهد و منتظر بماند تا زمان اتصال به پایان برسد یا به صورت دستی آن را خاتمه دهد.

اغلب از تارپیت ها برای محافظت استفاده می شود. این تکنیک برای اولین بار برای محافظت در برابر کرم های کامپیوتری توسعه یافت. و اکنون می‌توان از آن برای خراب کردن زندگی هرزنامه‌ها و محققانی که درگیر اسکن گسترده تمام آدرس‌های IP در یک ردیف هستند، استفاده کرد (مثال‌هایی در Habré: اتریش, اوکراین).

یکی از مدیران سیستم به نام کریس ولونز ظاهراً از تماشای این رسوایی خسته شد - و یک برنامه کوچک نوشت. بی پایان، یک tarpit برای SSH که سرعت اتصالات ورودی را کاهش می دهد. این برنامه یک پورت را باز می کند (پورت پیش فرض برای آزمایش 2222 است) و وانمود می کند که یک سرور SSH است، اما در واقع یک ارتباط بی پایان با مشتری ورودی برقرار می کند تا زمانی که آن را رها کند. این ممکن است برای چند روز یا بیشتر ادامه یابد تا زمانی که مشتری بیفتد.

نصب ابزار:

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

یک tarpit که به درستی اجرا شود، منابع بیشتری را از مهاجم می گیرد تا از شما. اما حتی بحث منابع هم نیست. نویسنده می نویسد:که این برنامه اعتیاد آور است. در حال حاضر 27 مشتری به دام افتاده است که برخی از آنها هفته ها به هم متصل هستند. در اوج فعالیت، 1378 مراجعه کننده به مدت 20 ساعت در دام افتادند!

در حالت عملیاتی، سرور Endlessh باید روی پورت معمولی 22 نصب شود، جایی که هولیگان ها به طور انبوه در می زنند. توصیه‌های امنیتی استاندارد همیشه انتقال SSH را به یک پورت دیگر توصیه می‌کنند، که بلافاصله اندازه گزارش‌ها را با مرتبه‌ای بزرگ کاهش می‌دهد.

کریس ولونز می گوید که برنامه او از یک پاراگراف مشخصات استفاده می کند RFC 4253 به پروتکل SSH بلافاصله پس از برقراری ارتباط TCP، اما قبل از اعمال رمزنگاری، هر دو طرف باید یک رشته شناسایی ارسال کنند. و همچنین یک نکته وجود دارد: "سرور ممکن است ردیف های دیگری از داده ها را قبل از ارسال ردیف نسخه ارسال کند". و بدون محدودیت در حجم این داده ها، فقط باید هر خط را با آن شروع کنید SSH-.

این دقیقاً همان کاری است که برنامه Endlessh انجام می دهد: آن می فرستد بی پایان جریان داده های تولید شده به صورت تصادفی، که مطابق با RFC 4253 هستند، یعنی قبل از احراز هویت ارسال می کنند و هر خط با SSH- و از 255 کاراکتر، از جمله کاراکتر پایان خط، تجاوز نمی کند. به طور کلی، همه چیز طبق استاندارد است.

به طور پیش فرض، برنامه بین ارسال بسته ها 10 ثانیه صبر می کند. این کار از اتمام زمان مشتری جلوگیری می کند، بنابراین مشتری برای همیشه در دام خواهد افتاد.

از آنجایی که داده ها قبل از اعمال رمزنگاری ارسال می شوند، برنامه بسیار ساده است. نیازی به پیاده سازی هیچ رمزی ندارد و از چندین پروتکل پشتیبانی می کند.

نویسنده سعی کرد اطمینان حاصل کند که ابزار حداقل منابع را مصرف می کند و کاملاً بدون توجه روی دستگاه کار می کند. برخلاف آنتی ویروس‌های مدرن و دیگر «سیستم‌های امنیتی»، نباید کامپیوتر شما را کند کند. او به دلیل اجرای نرم‌افزار کمی حیله‌گرتر، توانست هم ترافیک و هم مصرف حافظه را به حداقل برساند. اگر به سادگی یک فرآیند جداگانه را روی یک اتصال جدید راه اندازی کند، مهاجمان بالقوه می توانند با باز کردن چندین اتصال برای تخلیه منابع روی دستگاه، یک حمله DDoS را انجام دهند. یک رشته در هر اتصال نیز بهترین گزینه نیست، زیرا هسته منابع مدیریت رشته ها را هدر می دهد.

به همین دلیل کریس ولونز سبک ترین گزینه را برای Endlessh انتخاب کرد: یک سرور تک رشته ای poll(2)، جایی که کلاینت های موجود در تله تقریباً هیچ منبع اضافی مصرف نمی کنند، بدون احتساب شی سوکت در هسته و 78 بایت دیگر برای ردیابی در Endlessh. برای اجتناب از تخصیص بافرهای دریافت و ارسال برای هر کلاینت، Endlessh یک سوکت دسترسی مستقیم را باز می کند و بسته های TCP را مستقیماً ترجمه می کند و تقریباً کل پشته TCP/IP سیستم عامل را دور می زند. بافر ورودی اصلاً مورد نیاز نیست، زیرا ما علاقه ای به داده های ورودی نداریم.

نویسنده در زمان برنامه خود می گوید نمی دانستم در مورد وجود asycio پایتون و دیگر tarpits. اگر او در مورد 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 برای نوشتن tarpit ایده آل است. به عنوان مثال، این قلاب فایرفاکس، کروم یا هر کلاینت دیگری را که سعی در اتصال به سرور 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())

تارپیت ابزاری عالی برای مجازات قلدرهای آنلاین است. درست است، برعکس، خطری وجود دارد که توجه آنها را به رفتار غیرمعمول یک سرور خاص جلب کند. کسی ممکن است به انتقام فکر کند و یک حمله DDoS هدفمند به IP شما. با این حال، تا کنون چنین مواردی وجود نداشته است و تارپیت ها عالی عمل می کنند.

هاب ها:
پایتون، امنیت اطلاعات، نرم افزار، مدیریت سیستم

برچسب ها:
SSH، Endlessh، tarpit، tarpit، trap، asycio
تله (tarpit) برای اتصالات SSH ورودی

بر کسی پوشیده نیست که اینترنت یک محیط بسیار خصمانه است. به محض اینکه سروری را بالا می برید، فوراً در معرض حملات گسترده و اسکن های متعدد قرار می گیرد. مثلا هانی پات از نگهبانان شما می توانید مقیاس این ترافیک زباله را تخمین بزنید. در واقع، در سرورهای متوسط، 99 درصد از ترافیک ممکن است مخرب باشد.

تارپیت یک پورت تله است که برای کاهش سرعت اتصالات ورودی استفاده می شود. اگر یک سیستم شخص ثالث به این پورت متصل شود، نمی توانید به سرعت اتصال را ببندید. او باید منابع سیستم خود را هدر دهد و منتظر بماند تا زمان اتصال به پایان برسد یا به صورت دستی آن را خاتمه دهد.

اغلب از تارپیت ها برای محافظت استفاده می شود. این تکنیک برای اولین بار برای محافظت در برابر کرم های کامپیوتری توسعه یافت. و اکنون می‌توان از آن برای خراب کردن زندگی هرزنامه‌ها و محققانی که درگیر اسکن گسترده تمام آدرس‌های IP در یک ردیف هستند، استفاده کرد (مثال‌هایی در Habré: اتریش, اوکراین).

یکی از مدیران سیستم به نام کریس ولونز ظاهراً از تماشای این رسوایی خسته شد - و یک برنامه کوچک نوشت. بی پایان، یک tarpit برای SSH که سرعت اتصالات ورودی را کاهش می دهد. این برنامه یک پورت را باز می کند (پورت پیش فرض برای آزمایش 2222 است) و وانمود می کند که یک سرور SSH است، اما در واقع یک ارتباط بی پایان با مشتری ورودی برقرار می کند تا زمانی که آن را رها کند. این ممکن است برای چند روز یا بیشتر ادامه یابد تا زمانی که مشتری بیفتد.

نصب ابزار:

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

یک tarpit که به درستی اجرا شود، منابع بیشتری را از مهاجم می گیرد تا از شما. اما حتی بحث منابع هم نیست. نویسنده می نویسد:که این برنامه اعتیاد آور است. در حال حاضر 27 مشتری به دام افتاده است که برخی از آنها هفته ها به هم متصل هستند. در اوج فعالیت، 1378 مراجعه کننده به مدت 20 ساعت در دام افتادند!

در حالت عملیاتی، سرور Endlessh باید روی پورت معمولی 22 نصب شود، جایی که هولیگان ها به طور انبوه در می زنند. توصیه‌های امنیتی استاندارد همیشه انتقال SSH را به یک پورت دیگر توصیه می‌کنند، که بلافاصله اندازه گزارش‌ها را با مرتبه‌ای بزرگ کاهش می‌دهد.

کریس ولونز می گوید که برنامه او از یک پاراگراف مشخصات استفاده می کند RFC 4253 به پروتکل SSH بلافاصله پس از برقراری ارتباط TCP، اما قبل از اعمال رمزنگاری، هر دو طرف باید یک رشته شناسایی ارسال کنند. و همچنین یک نکته وجود دارد: "سرور ممکن است ردیف های دیگری از داده ها را قبل از ارسال ردیف نسخه ارسال کند". و بدون محدودیت در حجم این داده ها، فقط باید هر خط را با آن شروع کنید SSH-.

این دقیقاً همان کاری است که برنامه Endlessh انجام می دهد: آن می فرستد بی پایان جریان داده های تولید شده به صورت تصادفی، که مطابق با RFC 4253 هستند، یعنی قبل از احراز هویت ارسال می کنند و هر خط با SSH- و از 255 کاراکتر، از جمله کاراکتر پایان خط، تجاوز نمی کند. به طور کلی، همه چیز طبق استاندارد است.

به طور پیش فرض، برنامه بین ارسال بسته ها 10 ثانیه صبر می کند. این کار از اتمام زمان مشتری جلوگیری می کند، بنابراین مشتری برای همیشه در دام خواهد افتاد.

از آنجایی که داده ها قبل از اعمال رمزنگاری ارسال می شوند، برنامه بسیار ساده است. نیازی به پیاده سازی هیچ رمزی ندارد و از چندین پروتکل پشتیبانی می کند.

نویسنده سعی کرد اطمینان حاصل کند که ابزار حداقل منابع را مصرف می کند و کاملاً بدون توجه روی دستگاه کار می کند. برخلاف آنتی ویروس‌های مدرن و دیگر «سیستم‌های امنیتی»، نباید کامپیوتر شما را کند کند. او به دلیل اجرای نرم‌افزار کمی حیله‌گرتر، توانست هم ترافیک و هم مصرف حافظه را به حداقل برساند. اگر به سادگی یک فرآیند جداگانه را روی یک اتصال جدید راه اندازی کند، مهاجمان بالقوه می توانند با باز کردن چندین اتصال برای تخلیه منابع روی دستگاه، یک حمله DDoS را انجام دهند. یک رشته در هر اتصال نیز بهترین گزینه نیست، زیرا هسته منابع مدیریت رشته ها را هدر می دهد.

به همین دلیل کریس ولونز سبک ترین گزینه را برای Endlessh انتخاب کرد: یک سرور تک رشته ای poll(2)، جایی که کلاینت های موجود در تله تقریباً هیچ منبع اضافی مصرف نمی کنند، بدون احتساب شی سوکت در هسته و 78 بایت دیگر برای ردیابی در Endlessh. برای اجتناب از تخصیص بافرهای دریافت و ارسال برای هر کلاینت، Endlessh یک سوکت دسترسی مستقیم را باز می کند و بسته های TCP را مستقیماً ترجمه می کند و تقریباً کل پشته TCP/IP سیستم عامل را دور می زند. بافر ورودی اصلاً مورد نیاز نیست، زیرا ما علاقه ای به داده های ورودی نداریم.

نویسنده در زمان برنامه خود می گوید نمی دانستم در مورد وجود asycio پایتون و دیگر tarpits. اگر او در مورد 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 برای نوشتن tarpit ایده آل است. به عنوان مثال، این قلاب فایرفاکس، کروم یا هر کلاینت دیگری را که سعی در اتصال به سرور 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())

تارپیت ابزاری عالی برای مجازات قلدرهای آنلاین است. درست است، برعکس، خطری وجود دارد که توجه آنها را به رفتار غیرمعمول یک سرور خاص جلب کند. کسی ممکن است به انتقام فکر کند و یک حمله DDoS هدفمند به IP شما. با این حال، تا کنون چنین مواردی وجود نداشته است و تارپیت ها عالی عمل می کنند.

تله (tarpit) برای اتصالات SSH ورودی

منبع: www.habr.com

اضافه کردن نظر