Pułapka (tarpit) dla przychodzących połączeń SSH

Nie jest tajemnicą, że Internet to bardzo wrogie środowisko. Gdy tylko podniesiesz poziom serwera, jest on natychmiast poddawany masowym atakom i wielokrotnym skanom. Na przykład Honeypot od ochroniarzy można oszacować skalę tego ruchu śmieciowego. W rzeczywistości na przeciętnym serwerze 99% ruchu może być złośliwe.

Tarpit to port pułapki używany do spowalniania połączeń przychodzących. Jeśli do tego portu podłączy się system innej firmy, nie będzie można szybko zamknąć połączenia. Będzie musiała marnować zasoby systemowe i czekać na przekroczenie limitu czasu połączenia lub ręcznie je zakończyć.

Najczęściej do ochrony stosuje się plandeki. Technikę tę opracowano po raz pierwszy w celu ochrony przed robakami komputerowymi. A teraz można go wykorzystać do zrujnowania życia spamerom i badaczom, którzy zajmują się szerokim skanowaniem wszystkich adresów IP z rzędu (przykłady na Habré: Austria, Ukraina).

Jeden z administratorów systemu, Chris Wellons, najwyraźniej znudził się oglądaniem tej hańby - i napisał mały program Nieskończony, plandeka dla SSH, która spowalnia połączenia przychodzące. Program otwiera port (domyślny port do testów to 2222) i udaje serwer SSH, ale w rzeczywistości nawiązuje niekończące się połączenie z przychodzącym klientem, dopóki się nie podda. Może to trwać kilka dni lub dłużej, aż klient odpadnie.

Instalacja narzędzia:

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

Prawidłowo zaimplementowany tarpit będzie wymagał więcej zasobów od atakującego niż od ciebie. Ale to nawet nie jest kwestia zasobów. Autor пишетże program uzależnia. W tej chwili 27 klientów jest uwięzionych, niektórzy z nich są połączeni od tygodni. W szczytowym momencie 1378 klientów zostało uwięzionych na 20 godzin!

W trybie operacyjnym serwer Endlessh musi być zainstalowany na zwykłym porcie 22, do którego masowo pukają chuligani. Standardowe zalecenia dotyczące bezpieczeństwa zawsze zalecają przeniesienie SSH na inny port, co natychmiast zmniejsza rozmiar logów o rząd wielkości.

Chris Wellons twierdzi, że jego program wykorzystuje jeden akapit specyfikacji RFC 4253 do protokołu SSH. Natychmiast po nawiązaniu połączenia TCP, ale przed zastosowaniem kryptografii, obie strony muszą przesłać ciąg identyfikacyjny. Jest też uwaga: „Serwer MOŻE wysłać inne wiersze danych przed wysłaniem wiersza wersji”. I bez limitu od ilości tych danych wystarczy zacząć każdą linię od SSH-.

To jest dokładnie to, co robi program Endlessh: to wysyła nieskończony strumień losowo generowanych danych, które są zgodne z RFC 4253, czyli wysyłane przed uwierzytelnieniem, a każda linia zaczyna się od SSH- i nie przekracza 255 znaków, łącznie ze znakiem kończącym linię. Generalnie wszystko zgodnie ze standardem.

Domyślnie program czeka 10 sekund pomiędzy wysłaniem pakietów. Zapobiega to przekroczeniu limitu czasu klienta, przez co klient zostanie uwięziony na zawsze.

Ponieważ dane są przesyłane przed zastosowaniem kryptografii, program jest niezwykle prosty. Nie wymaga implementowania żadnych szyfrów i obsługuje wiele protokołów.

Autor starał się, aby narzędzie zużywało minimum zasobów i działało całkowicie niezauważone na komputerze. W przeciwieństwie do nowoczesnych programów antywirusowych i innych „systemów bezpieczeństwa”, nie powinien on spowalniać komputera. Udało mu się zminimalizować zarówno ruch, jak i zużycie pamięci dzięki nieco bardziej przebiegłej implementacji oprogramowania. Gdyby po prostu uruchomił oddzielny proces na nowym połączeniu, potencjalni atakujący mogliby przeprowadzić atak DDoS, otwierając wiele połączeń w celu wyczerpania zasobów komputera. Jeden wątek na połączenie również nie jest najlepszą opcją, ponieważ jądro będzie marnować zasoby na zarządzanie wątkami.

Właśnie dlatego Chris Wellons wybrał najlżejszą opcję dla Endlessh: serwer jednowątkowy poll(2), gdzie klienci w pułapce praktycznie nie zużywają żadnych dodatkowych zasobów, nie licząc obiektu gniazda w jądrze i kolejnych 78 bajtów do śledzenia w Endlessh. Aby uniknąć konieczności przydzielania buforów odbioru i wysyłania każdemu klientowi, Endlessh otwiera gniazdo bezpośredniego dostępu i bezpośrednio tłumaczy pakiety TCP, omijając prawie cały stos TCP/IP systemu operacyjnego. Bufor przychodzący nie jest w ogóle potrzebny, ponieważ nie interesują nas przychodzące dane.

Autor twierdzi, że w czasie swojego programu nie wiedziałem o istnieniu asycio i innych tarpitów w Pythonie. Gdyby wiedział o asycio, mógłby zaimplementować swoje narzędzie w zaledwie 18 liniach w Pythonie:

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 idealnie nadaje się do pisania plandek. Na przykład ten hak zawiesza przeglądarkę Firefox, Chrome lub dowolnego innego klienta, który próbuje połączyć się z twoim serwerem HTTP na wiele godzin:

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 to świetne narzędzie do karania internetowych prześladowców. To prawda, że ​​wręcz przeciwnie, istnieje pewne ryzyko zwrócenia ich uwagi na nietypowe zachowanie konkretnego serwera. Ktoś może pomyśleć o zemście oraz ukierunkowany atak DDoS na Twój adres IP. Jednak jak dotąd nie było takich przypadków, a plandeki sprawdzają się świetnie.

Piasty:
Python, Bezpieczeństwo informacji, Oprogramowanie, Administracja systemem

Tagi:
SSH, Endlessh, tarpit, tarpit, pułapka, asycio
Pułapka (tarpit) dla przychodzących połączeń SSH

Nie jest tajemnicą, że Internet to bardzo wrogie środowisko. Gdy tylko podniesiesz poziom serwera, jest on natychmiast poddawany masowym atakom i wielokrotnym skanom. Na przykład Honeypot od ochroniarzy można oszacować skalę tego ruchu śmieciowego. W rzeczywistości na przeciętnym serwerze 99% ruchu może być złośliwe.

Tarpit to port pułapki używany do spowalniania połączeń przychodzących. Jeśli do tego portu podłączy się system innej firmy, nie będzie można szybko zamknąć połączenia. Będzie musiała marnować zasoby systemowe i czekać na przekroczenie limitu czasu połączenia lub ręcznie je zakończyć.

Najczęściej do ochrony stosuje się plandeki. Technikę tę opracowano po raz pierwszy w celu ochrony przed robakami komputerowymi. A teraz można go wykorzystać do zrujnowania życia spamerom i badaczom, którzy zajmują się szerokim skanowaniem wszystkich adresów IP z rzędu (przykłady na Habré: Austria, Ukraina).

Jeden z administratorów systemu, Chris Wellons, najwyraźniej znudził się oglądaniem tej hańby - i napisał mały program Nieskończony, plandeka dla SSH, która spowalnia połączenia przychodzące. Program otwiera port (domyślny port do testów to 2222) i udaje serwer SSH, ale w rzeczywistości nawiązuje niekończące się połączenie z przychodzącym klientem, dopóki się nie podda. Może to trwać kilka dni lub dłużej, aż klient odpadnie.

Instalacja narzędzia:

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

Prawidłowo zaimplementowany tarpit będzie wymagał więcej zasobów od atakującego niż od ciebie. Ale to nawet nie jest kwestia zasobów. Autor пишетże program uzależnia. W tej chwili 27 klientów jest uwięzionych, niektórzy z nich są połączeni od tygodni. W szczytowym momencie 1378 klientów zostało uwięzionych na 20 godzin!

W trybie operacyjnym serwer Endlessh musi być zainstalowany na zwykłym porcie 22, do którego masowo pukają chuligani. Standardowe zalecenia dotyczące bezpieczeństwa zawsze zalecają przeniesienie SSH na inny port, co natychmiast zmniejsza rozmiar logów o rząd wielkości.

Chris Wellons twierdzi, że jego program wykorzystuje jeden akapit specyfikacji RFC 4253 do protokołu SSH. Natychmiast po nawiązaniu połączenia TCP, ale przed zastosowaniem kryptografii, obie strony muszą przesłać ciąg identyfikacyjny. Jest też uwaga: „Serwer MOŻE wysłać inne wiersze danych przed wysłaniem wiersza wersji”. I bez limitu od ilości tych danych wystarczy zacząć każdą linię od SSH-.

To jest dokładnie to, co robi program Endlessh: to wysyła nieskończony strumień losowo generowanych danych, które są zgodne z RFC 4253, czyli wysyłane przed uwierzytelnieniem, a każda linia zaczyna się od SSH- i nie przekracza 255 znaków, łącznie ze znakiem kończącym linię. Generalnie wszystko zgodnie ze standardem.

Domyślnie program czeka 10 sekund pomiędzy wysłaniem pakietów. Zapobiega to przekroczeniu limitu czasu klienta, przez co klient zostanie uwięziony na zawsze.

Ponieważ dane są przesyłane przed zastosowaniem kryptografii, program jest niezwykle prosty. Nie wymaga implementowania żadnych szyfrów i obsługuje wiele protokołów.

Autor starał się, aby narzędzie zużywało minimum zasobów i działało całkowicie niezauważone na komputerze. W przeciwieństwie do nowoczesnych programów antywirusowych i innych „systemów bezpieczeństwa”, nie powinien on spowalniać komputera. Udało mu się zminimalizować zarówno ruch, jak i zużycie pamięci dzięki nieco bardziej przebiegłej implementacji oprogramowania. Gdyby po prostu uruchomił oddzielny proces na nowym połączeniu, potencjalni atakujący mogliby przeprowadzić atak DDoS, otwierając wiele połączeń w celu wyczerpania zasobów komputera. Jeden wątek na połączenie również nie jest najlepszą opcją, ponieważ jądro będzie marnować zasoby na zarządzanie wątkami.

Właśnie dlatego Chris Wellons wybrał najlżejszą opcję dla Endlessh: serwer jednowątkowy poll(2), gdzie klienci w pułapce praktycznie nie zużywają żadnych dodatkowych zasobów, nie licząc obiektu gniazda w jądrze i kolejnych 78 bajtów do śledzenia w Endlessh. Aby uniknąć konieczności przydzielania buforów odbioru i wysyłania każdemu klientowi, Endlessh otwiera gniazdo bezpośredniego dostępu i bezpośrednio tłumaczy pakiety TCP, omijając prawie cały stos TCP/IP systemu operacyjnego. Bufor przychodzący nie jest w ogóle potrzebny, ponieważ nie interesują nas przychodzące dane.

Autor twierdzi, że w czasie swojego programu nie wiedziałem o istnieniu asycio i innych tarpitów w Pythonie. Gdyby wiedział o asycio, mógłby zaimplementować swoje narzędzie w zaledwie 18 liniach w Pythonie:

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 idealnie nadaje się do pisania plandek. Na przykład ten hak zawiesza przeglądarkę Firefox, Chrome lub dowolnego innego klienta, który próbuje połączyć się z twoim serwerem HTTP na wiele godzin:

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 to świetne narzędzie do karania internetowych prześladowców. To prawda, że ​​wręcz przeciwnie, istnieje pewne ryzyko zwrócenia ich uwagi na nietypowe zachowanie konkretnego serwera. Ktoś może pomyśleć o zemście oraz ukierunkowany atak DDoS na Twój adres IP. Jednak jak dotąd nie było takich przypadków, a plandeki sprawdzają się świetnie.

Pułapka (tarpit) dla przychodzących połączeń SSH

Źródło: www.habr.com

Dodaj komentarz