Прихващане (tarpit) за входящи SSH връзки

Не е тайна, че интернет е много враждебна среда. Веднага щом повдигнете сървър, той незабавно е подложен на масивни атаки и множество сканирания. Например honeypot от охранители можете да оцените мащаба на този трафик на боклук. Всъщност на средния сървър 99% от трафика може да е злонамерен.

Tarpit е порт за прихващане, използван за забавяне на входящите връзки. Ако система на трета страна се свърже към този порт, няма да можете бързо да затворите връзката. Тя ще трябва да изразходва системните си ресурси и да изчака, докато връзката изтече, или ръчно да я прекрати.

Най-често тарпитите се използват за защита. Техниката е разработена за първи път за защита срещу компютърни червеи. И сега може да се използва, за да съсипе живота на спамери и изследователи, които се занимават с широко сканиране на всички 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 на Python и други tarpits. Ако знаеше за asycio, той можеше да имплементира своята помощна програма само в 18 реда в Python:

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. Досега обаче не е имало такива случаи, а тарпитите работят чудесно.

главини:
Python, Информационна сигурност, Софтуер, Системна администрация

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Прихващане (tarpit) за входящи SSH връзки

Не е тайна, че интернет е много враждебна среда. Веднага щом повдигнете сървър, той незабавно е подложен на масивни атаки и множество сканирания. Например honeypot от охранители можете да оцените мащаба на този трафик на боклук. Всъщност на средния сървър 99% от трафика може да е злонамерен.

Tarpit е порт за прихващане, използван за забавяне на входящите връзки. Ако система на трета страна се свърже към този порт, няма да можете бързо да затворите връзката. Тя ще трябва да изразходва системните си ресурси и да изчака, докато връзката изтече, или ръчно да я прекрати.

Най-често тарпитите се използват за защита. Техниката е разработена за първи път за защита срещу компютърни червеи. И сега може да се използва, за да съсипе живота на спамери и изследователи, които се занимават с широко сканиране на всички 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 на Python и други tarpits. Ако знаеше за asycio, той можеше да имплементира своята помощна програма само в 18 реда в Python:

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

Добавяне на нов коментар