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
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é:
Jeden z administratorów systemu, Chris Wellons, najwyraźniej znudził się oglądaniem tej hańby - i napisał mały program
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
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 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
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ś
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
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é:
Jeden z administratorów systemu, Chris Wellons, najwyraźniej znudził się oglądaniem tej hańby - i napisał mały program
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
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 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
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ś
Źródło: www.habr.com