Nije tajna da je internet vrlo neprijateljsko okruženje. Čim podignete server, odmah je izložen masovnim napadima i brojnim skeniranjima. Na primjeru može se procijeniti razmjer ovog smešnog prometa. U stvari, na prosječnom serveru 99% prometa može biti zlonamjernog.
Tarpit je port-zamka koja se koristi za usporavanje ulaznih veza. Ako se vanjski sustav poveže na ovu točku, neće moći brzo zatvoriti vezu. Mora trošiti svoje sistemske resurse i čekati dok veza ne prekine zbog isteka vremena, ili je ručno prekinuti.
Tarpiti se najčešće koriste za zaštitu. Tehnika je prvotno razvijena za zaštitu od računalnih crva. A sada se može koristiti da bi se otežao život spammerima i istraživačima koji se bave opsežnim skeniranjem svih IP adresa (primjeri na Habr: , ).
Jednom od sysadmina po imenu Chris Wellons, očigledno je dosadilo promatrati ovu nepravdu – i napisao je mali program , tarpit za SSH, koji usporava ulazne veze. Program otvara port (po defaultu je postavljen port 2222 za testiranje) i pretvara se da je SSH server, dok zapravo uspostavlja beskonačnu vezu s ulaznim klijentom, sve dok ne odustane. To može trajati nekoliko dana ili više, sve dok klijent ne ispadne.
Instalacija alata:
$ make
$ ./endlessh &
$ ssh -p2222 localhostIspravno implementiran tarpit oduzima više resursa napadaču nego vama. No, stvar nije samo u resursima. Autor , napominje da program izaziva ovisnost. Upravo sada u njegovoj zamci je 27 klijenata, neki od njih su povezani već tjednima. Na vrhuncu aktivnosti u zamci je bilo 1378 klijenata tijekom 20 sati!
U operativnom režimu, server Endlessh treba postaviti na uobičajeni port 22, gdje se masovno pokušavaju spojiti huligani. Standardne sigurnosne preporuke uvijek savjetuju premještanje SSH na drugi port, što odmah znatno smanjuje veličinu logova.
Chris Wellons kaže da njegov program iskorištava jedan pasus iz specifikacije za protokol SSH. Odmah nakon uspostavljanja TCP veze, ali prije primjene kriptografije, obje strane trebaju poslati identifikacijsku oznaku. I tamo je zabilješka: „Poslužitelj MOŽE poslati druge nizove podataka prije slanja niza s verzijom“. I nema ograničenja na količinu ovih podataka, samo svaki niz treba početi s SSH-.
Ovo je ono čime se bavi program Endlessh: on šalje neprekidan tok nasumično generiranih podataka, koji su u skladu s RFC 4253, tj. slanje prije identifikacije, a svaki niz počinje s SSH- i ne prelazi 255 znakova, uključujući znak završetka niza. Ukratko, sve je po standardu.
Po defaultu, program čeka 10 sekundi između slanja paketa. To sprječava isključenje zbog vremena čekanja, tako da klijent zauvijek ostaje u zamci.
Budući da se podaci šalju prije primjene kriptografije, program je iznimno jednostavan. Nema potrebe uključivati nikakve šifre i podršku za brojne protokole.
Autor se potrudili da alat konzumira minimalne resurse i radi potpuno neprimjetno na računalu. Za razliku od modernih antivirusnih programa i drugih „sigurnosnih sustava“, ne bi trebao usporavati računal. Uspio je minimizirati i promet i potrošnju memorije zahvaljujući malo složenijoj softverskoj realizaciji. Da je samo pokrenuo zaseban proces za novu vezu, potencijalni zlonamjernici mogli bi provesti DDoS napad otvarajući brojne veze kako bi iscrpili resurse na račalu. Jedan tok po vezi – također nije najbolja opcija, jer bi jezgra trošila resurse na upravljanje tokovima.
Stoga je Chris Velons odabrao za Endlessh najlakšu opciju: jednonitni poslužitelj poll(2), gdje klijenti u zamci gotovo ne troše dodatne resurse, osim objekta socket u jezgri i još 78 bajtova za praćenje u Endlessh. Kako ne bi odvajao preuzimanje i slanje jaslica za svakog klijenta, Endlessh otvara socket s izravnim pristupom i izravno prenosi TCP pakete, ignorirajući gotovo cijeli TCP/IP sloj operativnog sustava. Ulazni bafer uopće nije potreban, jer nas dolazni podaci ne zanimaju.
Autor kaže da u trenutku izrade svog programa za postojanje Pythonovog asycia i drugih trapa. Da je znao za asycio, mogao bi svoju korisnu aplikaciju implementirati u samo 18 redaka na Pythonu:
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 je savršen za pisanje tarpitova. Na primjer, ovakva zamka može na dugotrajne sate blokirati Firefox, Chrome ili drugog klijenta koji se pokušava povezati na vaš HTTP server:
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 je odličan alat za kažnjavanje internet huligana. Ipak, postoji određeni rizik da ih, umjesto toga, privuče neobično ponašanje određenog servera. Neko i ciljana DDoS napad na vaš IP. No, do sada nije bilo takvih slučajeva, i tarpiti dobro rade.
Kategorije:
Python, Informatička sigurnost, Softver, Sistemska administracija
Oznake:
SSH, Endlessh, tarpit, zamka, asyncio
Zamka (tar pit) za ulazne SSH veze
Nije tajna da je internet vrlo neprijateljsko okruženje. Čim podignete server, odmah je izložen masovnim napadima i brojnim skeniranjima. Na primjeru može se procijeniti razmjer ovog smešnog prometa. U stvari, na prosječnom serveru 99% prometa može biti zlonamjernog.
Tarpit je port-zamka koja se koristi za usporavanje ulaznih veza. Ako se vanjski sustav poveže na ovu točku, neće moći brzo zatvoriti vezu. Mora trošiti svoje sistemske resurse i čekati dok veza ne prekine zbog isteka vremena, ili je ručno prekinuti.
Tarpiti se najčešće koriste za zaštitu. Tehnika je prvotno razvijena za zaštitu od računalnih crva. A sada se može koristiti da bi se otežao život spammerima i istraživačima koji se bave opsežnim skeniranjem svih IP adresa (primjeri na Habr: , ).
Jednom od sysadmina po imenu Chris Wellons, očigledno je dosadilo promatrati ovu nepravdu – i napisao je mali program , tarpit za SSH, koji usporava ulazne veze. Program otvara port (po defaultu je postavljen port 2222 za testiranje) i pretvara se da je SSH server, dok zapravo uspostavlja beskonačnu vezu s ulaznim klijentom, sve dok ne odustane. To može trajati nekoliko dana ili više, sve dok klijent ne ispadne.
Instalacija alata:
$ make
$ ./endlessh &
$ ssh -p2222 localhostIspravno implementiran tarpit oduzima više resursa napadaču nego vama. No, stvar nije samo u resursima. Autor , napominje da program izaziva ovisnost. Upravo sada u njegovoj zamci je 27 klijenata, neki od njih su povezani već tjednima. Na vrhuncu aktivnosti u zamci je bilo 1378 klijenata tijekom 20 sati!
U operativnom režimu, server Endlessh treba postaviti na uobičajeni port 22, gdje se masovno pokušavaju spojiti huligani. Standardne sigurnosne preporuke uvijek savjetuju premještanje SSH na drugi port, što odmah znatno smanjuje veličinu logova.
Chris Wellons kaže da njegov program iskorištava jedan pasus iz specifikacije za protokol SSH. Odmah nakon uspostavljanja TCP veze, ali prije primjene kriptografije, obje strane trebaju poslati identifikacijsku oznaku. I tamo je zabilješka: „Poslužitelj MOŽE poslati druge nizove podataka prije slanja niza s verzijom“. I nema ograničenja na količinu ovih podataka, samo svaki niz treba početi s SSH-.
Ovo je ono čime se bavi program Endlessh: on šalje neprekidan tok nasumično generiranih podataka, koji su u skladu s RFC 4253, tj. slanje prije identifikacije, a svaki niz počinje s SSH- i ne prelazi 255 znakova, uključujući znak završetka niza. Ukratko, sve je po standardu.
Po defaultu, program čeka 10 sekundi između slanja paketa. To sprječava isključenje zbog vremena čekanja, tako da klijent zauvijek ostaje u zamci.
Budući da se podaci šalju prije primjene kriptografije, program je iznimno jednostavan. Nema potrebe uključivati nikakve šifre i podršku za brojne protokole.
Autor se potrudili da alat konzumira minimalne resurse i radi potpuno neprimjetno na računalu. Za razliku od modernih antivirusnih programa i drugih „sigurnosnih sustava“, ne bi trebao usporavati računal. Uspio je minimizirati i promet i potrošnju memorije zahvaljujući malo složenijoj softverskoj realizaciji. Da je samo pokrenuo zaseban proces za novu vezu, potencijalni zlonamjernici mogli bi provesti DDoS napad otvarajući brojne veze kako bi iscrpili resurse na račalu. Jedan tok po vezi – također nije najbolja opcija, jer bi jezgra trošila resurse na upravljanje tokovima.
Stoga je Chris Velons odabrao za Endlessh najlakšu opciju: jednonitni poslužitelj poll(2), gdje klijenti u zamci gotovo ne troše dodatne resurse, osim objekta socket u jezgri i još 78 bajtova za praćenje u Endlessh. Kako ne bi odvajao preuzimanje i slanje jaslica za svakog klijenta, Endlessh otvara socket s izravnim pristupom i izravno prenosi TCP pakete, ignorirajući gotovo cijeli TCP/IP sloj operativnog sustava. Ulazni bafer uopće nije potreban, jer nas dolazni podaci ne zanimaju.
Autor kaže da u trenutku izrade svog programa za postojanje Pythonovog asycia i drugih trapa. Da je znao za asycio, mogao bi svoju korisnu aplikaciju implementirati u samo 18 redaka na Pythonu:
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 je savršen za pisanje tarpitova. Na primjer, ovakva zamka može na dugotrajne sate blokirati Firefox, Chrome ili drugog klijenta koji se pokušava povezati na vaš HTTP server:
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 je odličan alat za kažnjavanje internet huligana. Ipak, postoji određeni rizik da ih, umjesto toga, privuče neobično ponašanje određenog servera. Neko i ciljana DDoS napad na vaš IP. No, do sada nije bilo takvih slučajeva, i tarpiti dobro rade.
Izvor: habr.com
