Nie jest tajemnicą, że internet to bardzo wrogo nastawione środowisko. Gdy tylko uruchamiasz serwer, natychmiast staje się on celem masowych ataków i wielokrotnych skanowań. Na przykładzie można ocenić skalę tego szkodliwego ruchu. W rzeczywistości na przeciętnym serwerze nawet 99% ruchu może być złośliwe.
Tarpit to pułapka portowa, która służy do spowalniania połączeń przychodzących. Gdy zewnętrzny system łączy się z tym portem, nie można szybko zamknąć połączenia. Musi on zużywać swoje zasoby systemowe i czekać, aż połączenie zostanie przerwane z powodu przekroczenia czasu oczekiwania lub ręcznie je zerwać.
Najczęściej tarpitów używa się w celach ochrony. Technika ta została po raz pierwszy opracowana w celu obrony przed robakami komputerowymi. Teraz można ją wykorzystać, aby uprzykrzyć życie spammerom i badaczom zajmującym się szerokim skanowaniem wszystkich adresów IP (przykłady na Habrze: , ).
Jednemu z administratorów systemów o imieniu Chris Wellons najwyraźniej znudziło się obserwowanie tego bałaganu – napisał mały program , tarpit dla SSH, spowalniający połączenia przychodzące. Program otwiera port (domyślnie do testów port 2222) i udaje serwer SSH, a tak naprawdę nawiązuje nieskończone połączenie z przychodzącym klientem, aż ten się podda. Może to trwać kilka dni lub dłużej, aż klient zrezygnuje.
Instalacja narzędzia:
$ make
$ ./endlessh &
$ ssh -p2222 localhostDobrze zaimplementowany tarpit odciągnie od agresora więcej zasobów niż od Ciebie. Ale w tym przypadku chodzi nie tylko o zasoby. Autor , że program wywołuje uzależnienie. Obecnie w jego pułapce jest 27 klientów, niektórzy z nich są połączeni od tygodni. W szczytowym momencie aktywności w pułapce siedziało 1378 klientów przez 20 godzin!
W trybie roboczym serwer Endlessh należy zainstalować na standardowym porcie 22, gdzie masowo atakują chuligani. Standardowe zalecenia dotyczące bezpieczeństwa zawsze sugerują przeniesienie SSH na inny port, co od razu znacząco zmniejsza rozmiar logów.
Chris Wellons mówi, że jego program wykorzystuje jeden akapit ze specyfikacji dla protokołu SSH. Natychmiast po nawiązaniu połączenia TCP, ale przed zastosowaniem kryptografii, obie strony muszą wysłać identyfikator. I tam także dodano: „Serwer MOŻE wysłać inne ciągi danych przed wysłaniem ciągu z wersją“. I brak ograniczeń na objętość tych danych, po prostu każdy ciąg musi zaczynać się od SSH-.
Właśnie tym zajmuje się program Endlessh: on wysyła nieskończony strumień losowo generowanych danych, które są zgodne z RFC 4253, co oznacza wysyłanie przed identyfikacją, a każdy ciąg zaczyna się od SSH- i nie przekracza 255 znaków, w tym znaków końca linii. Ogólnie rzecz biorąc, wszystko zgodnie ze standardem.
Domyślnie program oczekuje 10 sekund między wysyłkami pakietów. Zatrzymuje to rozłączenie z powodu timeoutu, więc klient będzie uwięziony wiecznie.
Ponieważ wysyłanie danych odbywa się przed zastosowaniem kryptografii, program jest wyjątkowo prosty. Nie ma potrzeby wprowadzania jakichkolwiek szyfrów ani wsparcia dla wielu protokołów.
Autor postarał się, aby narzędzie konsumowało minimalną ilość zasobów i działało całkowicie niezauważalnie na urządzeniu. W przeciwieństwie do nowoczesnych antywirusów i innych „systemów bezpieczeństwa” nie powinno spowalniać komputera. Udało mu się zminimalizować zarówno ruch, jak i zużycie pamięci dzięki nieco bardziej złożonej realizacji programowej. Gdyby po prostu uruchomił osobny proces na nowe połączenie, potencjalni napastnicy mogliby przeprowadzić atak DDoS, otwierając wiele połączeń w celu wyczerpania zasobów na maszynie. Po jednym wątku na połączenie — to również nie najlepsza opcja, ponieważ jądro marnowałoby zasoby na zarządzanie wątkami.
Dlatego Chris Wellons wybrał dla Endlessh najlżejszą opcję: serwer jednowątkowy poll(2), gdzie klienci w pułapce praktycznie nie zużywają dodatkowych zasobów, z wyjątkiem obiektu gniazda w jądrze oraz jeszcze 78 bajtów do śledzenia w Endlessh. Aby nie przydzielać buforów odbioru i wysyłania dla każdego klienta, Endlessh otwiera gniazdo dostępu bezpośredniego i bezpośrednio streamuje pakiety TCP, ignorując prawie cały stos TCP/IP systemu operacyjnego. Bufor wejściowy w ogóle nie jest potrzebny, ponieważ dane przychodzące nas nie interesują.
Autor mówi, że w momencie pisania programu o istnieniu Pythona asycio i innych podobnych narzędzi. Gdyby wiedział o asycio, to swoją aplikację mógłby zrealizować w zaledwie 18 linijkach 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 jest idealny do pisania pułapek. Na przykład, taka pułapka przez wiele godzin zawiesi Firefox, Chrome lub innego klienta, który próbuje połączyć się z Twoim serwerem 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())Pułapka to doskonałe narzędzie do karania internetowych chuliganów. Jednak istnieje pewne ryzyko, że mogą oni zwrócić uwagę na nietypowe zachowanie konkretnego serwera. Ktoś i skoncentrowanym ataku DDoS na Twój IP. Niemniej jednak, jak dotąd nie było takich przypadków, a pułapki działają doskonale.
Huby:
Python, Bezpieczeństwo informacji, Oprogramowanie, Administracja systemami
Tagi:
SSH, Endlessh, tarpit, pułapka, asyncio
Pułapka (tar pit) dla przychodzących połączeń SSH.
Nie jest tajemnicą, że internet to bardzo wrogo nastawione środowisko. Gdy tylko uruchamiasz serwer, natychmiast staje się on celem masowych ataków i wielokrotnych skanowań. Na przykładzie można ocenić skalę tego szkodliwego ruchu. W rzeczywistości na przeciętnym serwerze nawet 99% ruchu może być złośliwe.
Tarpit to pułapka portowa, która służy do spowalniania połączeń przychodzących. Gdy zewnętrzny system łączy się z tym portem, nie można szybko zamknąć połączenia. Musi on zużywać swoje zasoby systemowe i czekać, aż połączenie zostanie przerwane z powodu przekroczenia czasu oczekiwania lub ręcznie je zerwać.
Najczęściej tarpitów używa się w celach ochrony. Technika ta została po raz pierwszy opracowana w celu obrony przed robakami komputerowymi. Teraz można ją wykorzystać, aby uprzykrzyć życie spammerom i badaczom zajmującym się szerokim skanowaniem wszystkich adresów IP (przykłady na Habrze: , ).
Jednemu z administratorów systemów o imieniu Chris Wellons najwyraźniej znudziło się obserwowanie tego bałaganu – napisał mały program , tarpit dla SSH, spowalniający połączenia przychodzące. Program otwiera port (domyślnie do testów port 2222) i udaje serwer SSH, a tak naprawdę nawiązuje nieskończone połączenie z przychodzącym klientem, aż ten się podda. Może to trwać kilka dni lub dłużej, aż klient zrezygnuje.
Instalacja narzędzia:
$ make
$ ./endlessh &
$ ssh -p2222 localhostDobrze zaimplementowany tarpit odciągnie od agresora więcej zasobów niż od Ciebie. Ale w tym przypadku chodzi nie tylko o zasoby. Autor , że program wywołuje uzależnienie. Obecnie w jego pułapce jest 27 klientów, niektórzy z nich są połączeni od tygodni. W szczytowym momencie aktywności w pułapce siedziało 1378 klientów przez 20 godzin!
W trybie roboczym serwer Endlessh należy zainstalować na standardowym porcie 22, gdzie masowo atakują chuligani. Standardowe zalecenia dotyczące bezpieczeństwa zawsze sugerują przeniesienie SSH na inny port, co od razu znacząco zmniejsza rozmiar logów.
Chris Wellons mówi, że jego program wykorzystuje jeden akapit ze specyfikacji dla protokołu SSH. Natychmiast po nawiązaniu połączenia TCP, ale przed zastosowaniem kryptografii, obie strony muszą wysłać identyfikator. I tam także dodano: „Serwer MOŻE wysłać inne ciągi danych przed wysłaniem ciągu z wersją“. I brak ograniczeń na objętość tych danych, po prostu każdy ciąg musi zaczynać się od SSH-.
Właśnie tym zajmuje się program Endlessh: on wysyła nieskończony strumień losowo generowanych danych, które są zgodne z RFC 4253, co oznacza wysyłanie przed identyfikacją, a każdy ciąg zaczyna się od SSH- i nie przekracza 255 znaków, w tym znaków końca linii. Ogólnie rzecz biorąc, wszystko zgodnie ze standardem.
Domyślnie program oczekuje 10 sekund między wysyłkami pakietów. Zatrzymuje to rozłączenie z powodu timeoutu, więc klient będzie uwięziony wiecznie.
Ponieważ wysyłanie danych odbywa się przed zastosowaniem kryptografii, program jest wyjątkowo prosty. Nie ma potrzeby wprowadzania jakichkolwiek szyfrów ani wsparcia dla wielu protokołów.
Autor postarał się, aby narzędzie konsumowało minimalną ilość zasobów i działało całkowicie niezauważalnie na urządzeniu. W przeciwieństwie do nowoczesnych antywirusów i innych „systemów bezpieczeństwa” nie powinno spowalniać komputera. Udało mu się zminimalizować zarówno ruch, jak i zużycie pamięci dzięki nieco bardziej złożonej realizacji programowej. Gdyby po prostu uruchomił osobny proces na nowe połączenie, potencjalni napastnicy mogliby przeprowadzić atak DDoS, otwierając wiele połączeń w celu wyczerpania zasobów na maszynie. Po jednym wątku na połączenie — to również nie najlepsza opcja, ponieważ jądro marnowałoby zasoby na zarządzanie wątkami.
Dlatego Chris Wellons wybrał dla Endlessh najlżejszą opcję: serwer jednowątkowy poll(2), gdzie klienci w pułapce praktycznie nie zużywają dodatkowych zasobów, z wyjątkiem obiektu gniazda w jądrze oraz jeszcze 78 bajtów do śledzenia w Endlessh. Aby nie przydzielać buforów odbioru i wysyłania dla każdego klienta, Endlessh otwiera gniazdo dostępu bezpośredniego i bezpośrednio streamuje pakiety TCP, ignorując prawie cały stos TCP/IP systemu operacyjnego. Bufor wejściowy w ogóle nie jest potrzebny, ponieważ dane przychodzące nas nie interesują.
Autor mówi, że w momencie pisania programu o istnieniu Pythona asycio i innych podobnych narzędzi. Gdyby wiedział o asycio, to swoją aplikację mógłby zrealizować w zaledwie 18 linijkach 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 jest idealny do pisania pułapek. Na przykład, taka pułapka przez wiele godzin zawiesi Firefox, Chrome lub innego klienta, który próbuje połączyć się z Twoim serwerem 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())Pułapka to doskonałe narzędzie do karania internetowych chuliganów. Jednak istnieje pewne ryzyko, że mogą oni zwrócić uwagę na nietypowe zachowanie konkretnego serwera. Ktoś i skoncentrowanym ataku DDoS na Twój IP. Niemniej jednak, jak dotąd nie było takich przypadków, a pułapki działają doskonale.
Źródło: habr.com
