Не е тайна, че интернетът е много враждебна среда. Веднага щом стартирате сървър, той моментално бива подложен на масирани атаки и многобройни сканирания. На примера може да се оцени мащабът на този боклук трафик. Всъщност, на среден сървър 99% от трафика може да е злонамерен.
Tarpit е порт-капан, който се използва за забавяне на входящите връзки. Ако външна система се свърже с този порт, тя не може бързо да прекрати връзката. Тя ще трябва да изразходи своите системни ресурси и да чака, докато връзката не бъде прекъсната по времеви лимит или ръчно да я прекъсне.
Най-често тарпитите се използват за защита. Техниката е разработена първи път, за да предпазва от компютърни червеи. Сега тя може да бъде използвана, за да направи живота труден на спамерите и изследователите, които правят широко сканиране на всички IP адреси последователно (примери на Хабра: , ).
Един от администраторите на системи, на име Крис Велонс, очевидно му е омръзнало да наблюдава това безобразие – и той е написал малка програма , тарпит за SSH, който забавя входящите връзки. Програмата отваря порт (по подразбиране за тестове е указан порт 2222) и се преструва на SSH сървър, а всъщност установява безкрайна връзка с входящия клиент, докато той не се откаже. Това може да продължи няколко дни или повече, докато клиентът не отпадне.
Инсталиране на утилитата:
$ make
$ ./endlessh &
$ ssh -p2222 localhostПравилно реализирания тарпит ще отнеме на нападателя повече ресурси, отколкото на вас. Но става въпрос не само за ресурсите. Авторът , посочва, че програмата води до привикване. В момента в неговия капан са 27 клиента, някои от тях са свързани в продължение на седмици. На върха на активността в капана е имало 1378 клиента в продължение на 20 часа!
В работен режим сървърът Endlessh трябва да бъде поставен на стандартния порт 22, където масово се свързват хулигани. Стандартните препоръки за сигурност винаги съветват да се премести SSH на друг порт, което незабавно намалява размера на логовете.
Крис Велонс казва, че неговата програма експлоатира един абзац от спецификацията за протокола SSH. Веднага след установяване на TCP връзката, но преди прилагането на криптография, двете страни трябва да изпратят идентификационна низ. И там също е написано: «Сървърът МОЖЕ да изпрати други редове данни преди да изпрати ред с версия». И без ограничения на обема на тези данни, просто всеки ред трябва да започва с SSH-.
Това е именно задачата на програмата Endlessh: тя изпраща безкраен поток от случайно генерирани данни, които отговарят на RFC 4253, тоест изпращането е преди идентификацията, а всеки ред започва с SSH- и не надвишава 255 символа, включително символа за край на реда. В общи линии, всичко е по стандарта.
По подразбиране програмата очаква 10 секунди между изпращането на пакетите. Това предотвратява прекъсването поради таймаут, така че клиентът ще остане в капан завинаги.
Тъй като изпращането на данни се извършва преди приложението на криптография, програмата е изключително проста. В нея не е необходимо внедряване на никакви шифри и поддръжка на многобройни протоколи.
Авторът се е постарал да направи утилитата да консумира минимално количество ресурси и да работи напълно незабележимо на машината. В отличие от съвременните антивируси и други „системи за сигурност“, тя не трябва да забавя компютъра. Успя да минимизира както трафика, така и потреблението на памет чрез малко по-умна програмна реализация. Ако беше пуснал отделен процес на ново свързване, потенциалните злонамерени лица биха могли да проведат DDoS атака, отваряйки множество свързвания за изчерпване на ресурсите на машината. По един поток на свързване — също не е най-добрият вариант, защото ядро ще харчи ресурси за управление на потоките.
Затова Крис Велонс избра за Endlessh най-лековесния вариант: еднопоточен сървър poll(2), където клиентите в капан почти не консумират излишни ресурси, без да се считат обектите на сокет в ядрото и още 78 байта за проследяване в Endlessh. За да не се отделят буфери за получаване и изпращане за всеки клиент, Endlessh отваря сокет за директен достъп и директно предава TCP пакети, игнорирайки почти целия TCP/IP стек на операционната система. Входящият буфер изобщо не е нужен, защото входящите данни не ни интересуват.
Авторът казва, че по време на написването на програмата си за съществуването на Python асинхронно и други средства. Ако беше знаел за асинхронното, щеше да реализира утилитата си само с 18 реда на Python:
внесете asyncio
внесете random
асинхронный определитель (чтец, писатель):
попробуйте:
в то время как True:
ожидание asyncio.sleep(10)
писатель.запись(b'%xrn' % random.randint(0, 2**32))
ожидание писатель.слив()
исключение ConnectionResetError:
пропустить
асинхронный главный():
сервер = ожидание asyncio.start_server(определитель, '0.0.0.0', 2222)
асинхронно с сервером:
ожидание сервер.служить_вечно()
асинхронно.работать(главный())Asyncio е идеален за писане на капани. Например, такава капана за много часове ще замрази Firefox, Chrome или друг клиент, който се опитва да се свърже с вашия HTTP сървър:
внесете asyncio
внесете random
асинхронный определитель (чтец, писатель):
писатель.запись(b'HTTP/1.1 200 OKrn')
попробуйте:
в то время как True:
ожидание asyncio.sleep(5)
заголовок = random.randint(0, 2**32)
значение = random.randint(0, 2**32)
писатель.запись(b'X-%x: %xrn' % (заголовок, значение))
ожидание писатель.слив()
исключение ConnectionResetError:
пропустить
асинхронный главный():
сервер = ожидание asyncio.start_server(определитель, '0.0.0.0', 8080)
асинхронно с сервером:
ожидание сервер.служить_вечно()
асинхронно.работать(главный())Капанът е отличен инструмент за наказване на интернет хулиганите. Въпреки това, съществува известен риск, че ще привлечете вниманието им към необичайното поведение на конкретен сървър. Някой и целенасочена DDoS атака срещу вашия IP. Въпреки това, досега не е имало такива случаи и капаните работят отлично.
Хъбове:
Python, Информационна безопасност, Софтуер, Системно администриране
Етикети:
SSH, Endlessh, капан, капан, асинхронно
Капан (тарпит) за входящи SSH съединения
Не е тайна, че интернетът е много враждебна среда. Веднага щом стартирате сървър, той моментално бива подложен на масирани атаки и многобройни сканирания. На примера може да се оцени мащабът на този боклук трафик. Всъщност, на среден сървър 99% от трафика може да е злонамерен.
Tarpit е порт-капан, който се използва за забавяне на входящите връзки. Ако външна система се свърже с този порт, тя не може бързо да прекрати връзката. Тя ще трябва да изразходи своите системни ресурси и да чака, докато връзката не бъде прекъсната по времеви лимит или ръчно да я прекъсне.
Най-често тарпитите се използват за защита. Техниката е разработена първи път, за да предпазва от компютърни червеи. Сега тя може да бъде използвана, за да направи живота труден на спамерите и изследователите, които правят широко сканиране на всички IP адреси последователно (примери на Хабра: , ).
Един от администраторите на системи, на име Крис Велонс, очевидно му е омръзнало да наблюдава това безобразие – и той е написал малка програма , тарпит за SSH, който забавя входящите връзки. Програмата отваря порт (по подразбиране за тестове е указан порт 2222) и се преструва на SSH сървър, а всъщност установява безкрайна връзка с входящия клиент, докато той не се откаже. Това може да продължи няколко дни или повече, докато клиентът не отпадне.
Инсталиране на утилитата:
$ make
$ ./endlessh &
$ ssh -p2222 localhostПравилно реализирания тарпит ще отнеме на нападателя повече ресурси, отколкото на вас. Но става въпрос не само за ресурсите. Авторът , посочва, че програмата води до привикване. В момента в неговия капан са 27 клиента, някои от тях са свързани в продължение на седмици. На върха на активността в капана е имало 1378 клиента в продължение на 20 часа!
В работен режим сървърът Endlessh трябва да бъде поставен на стандартния порт 22, където масово се свързват хулигани. Стандартните препоръки за сигурност винаги съветват да се премести SSH на друг порт, което незабавно намалява размера на логовете.
Крис Велонс казва, че неговата програма експлоатира един абзац от спецификацията за протокола SSH. Веднага след установяване на TCP връзката, но преди прилагането на криптография, двете страни трябва да изпратят идентификационна низ. И там също е написано: «Сървърът МОЖЕ да изпрати други редове данни преди да изпрати ред с версия». И без ограничения на обема на тези данни, просто всеки ред трябва да започва с SSH-.
Това е именно задачата на програмата Endlessh: тя изпраща безкраен поток от случайно генерирани данни, които отговарят на RFC 4253, тоест изпращането е преди идентификацията, а всеки ред започва с SSH- и не надвишава 255 символа, включително символа за край на реда. В общи линии, всичко е по стандарта.
По подразбиране програмата очаква 10 секунди между изпращането на пакетите. Това предотвратява прекъсването поради таймаут, така че клиентът ще остане в капан завинаги.
Тъй като изпращането на данни се извършва преди приложението на криптография, програмата е изключително проста. В нея не е необходимо внедряване на никакви шифри и поддръжка на многобройни протоколи.
Авторът се е постарал да направи утилитата да консумира минимално количество ресурси и да работи напълно незабележимо на машината. В отличие от съвременните антивируси и други „системи за сигурност“, тя не трябва да забавя компютъра. Успя да минимизира както трафика, така и потреблението на памет чрез малко по-умна програмна реализация. Ако беше пуснал отделен процес на ново свързване, потенциалните злонамерени лица биха могли да проведат DDoS атака, отваряйки множество свързвания за изчерпване на ресурсите на машината. По един поток на свързване — също не е най-добрият вариант, защото ядро ще харчи ресурси за управление на потоките.
Затова Крис Велонс избра за Endlessh най-лековесния вариант: еднопоточен сървър poll(2), където клиентите в капан почти не консумират излишни ресурси, без да се считат обектите на сокет в ядрото и още 78 байта за проследяване в Endlessh. За да не се отделят буфери за получаване и изпращане за всеки клиент, Endlessh отваря сокет за директен достъп и директно предава TCP пакети, игнорирайки почти целия TCP/IP стек на операционната система. Входящият буфер изобщо не е нужен, защото входящите данни не ни интересуват.
Авторът казва, че по време на написването на програмата си за съществуването на Python асинхронно и други средства. Ако беше знаел за асинхронното, щеше да реализира утилитата си само с 18 реда на Python:
внесете asyncio
внесете random
асинхронный определитель (чтец, писатель):
пробвайте:
в то время как True:
ожидание asyncio.sleep(10)
писатель.запись(b'%xrn' % random.randint(0, 2**32))
ожидание писатель.слив()
изключение ConnectionResetError:
пропуснете
асинхронный главный():
сървър = очакване asyncio.start_server(определител, '0.0.0.0', 2222)
асинхронно с сървъра:
очаквайте сървъра.служете_вечно()
асинхронно.работа(главния())Asyncio е идеален за писане на капани. Например, такава капана за много часове ще замрази Firefox, Chrome или друг клиент, който се опитва да се свърже с вашия HTTP сървър:
внесете asyncio
внесете random
асинхронный определитель (чтец, писатель):
писатель.запись(b'HTTP/1.1 200 OKrn')
пробвайте:
в то время как True:
ожидание asyncio.sleep(5)
заголовок = random.randint(0, 2**32)
значение = random.randint(0, 2**32)
писатель.запись(b'X-%x: %xrn' % (заголовок, значение))
ожидание писатель.слив()
изключение ConnectionResetError:
пропуснете
асинхронный главный():
сървър = очакване asyncio.start_server(определител, '0.0.0.0', 8080)
асинхронно с сървъра:
очаквайте сървъра.служете_вечно()
асинхронно.работа(главния())Капанът е отличен инструмент за наказване на интернет хулиганите. Въпреки това, съществува известен риск, че ще привлечете вниманието им към необичайното поведение на конкретен сървър. Някой и целенасочена DDoS атака срещу вашия IP. Въпреки това, досега не е имало такива случаи и капаните работят отлично.
Източник: habr.com
