Trap (tarpit) za dolazne SSH veze

Nije tajna da je internet veoma neprijateljsko okruženje. Čim podignete server, on je trenutno podvrgnut masovnim napadima i višestrukim skeniranjima. Na primjer lonac od zaštitara možete procijeniti razmjere ovog smeća. Zapravo, na prosječnom serveru, 99% saobraćaja može biti zlonamjerno.

Tarpit je trap port koji se koristi za usporavanje dolaznih veza. Ako se sistem treće strane poveže na ovaj port, nećete moći brzo da zatvorite vezu. Morat će potrošiti svoje sistemske resurse i pričekati da istekne vremensko ograničenje veze ili je ručno prekinuti.

Najčešće se tarpiti koriste za zaštitu. Tehnika je prvo razvijena za zaštitu od kompjuterskih crva. A sada se može iskoristiti da uništi živote spamera i istraživača koji se bave širokim skeniranjem svih IP adresa zaredom (primjeri na Habré-u: Austrija, Ukrajina).

Jedan od sistemskih administratora po imenu Chris Wellons očigledno se umorio od gledanja ove sramote - i napisao je mali program Beskrajno, tarpit za SSH koji usporava dolazne veze. Program otvara port (podrazumevani port za testiranje je 2222) i pretvara se da je SSH server, ali u stvarnosti uspostavlja beskrajnu vezu sa dolaznim klijentom sve dok ne odustane. To može trajati nekoliko dana ili više dok klijent ne padne.

Instalacija uslužnog programa:

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

Pravilno implementiran tarpit će oduzeti više resursa od napadača nego od vas. Ali nije čak ni u pitanju resursa. Autor on pišeda program izaziva ovisnost. Trenutno ima 27 klijenata u zamci, od kojih su neki povezani nedeljama. Na vrhuncu aktivnosti, 1378 klijenata je bilo zarobljeno 20 sati!

U radnom režimu, Endlessh server treba instalirati na uobičajeni port 22, gdje huligani masovno kucaju. Standardne sigurnosne preporuke uvijek savjetuju premještanje SSH-a na drugi port, što odmah smanjuje veličinu dnevnika za red veličine.

Chris Wellons kaže da njegov program koristi jedan paragraf specifikacije RFC 4253 na SSH protokol. Odmah nakon uspostavljanja TCP veze, ali prije primjene kriptografije, obje strane moraju poslati identifikacijski niz. A tu je i napomena: "Server MOŽE poslati druge redove podataka prije slanja reda verzije". I nema ograničenja o količini ovih podataka, samo trebate započeti svaki red sa SSH-.

To je upravo ono što Endlessh program radi: it šalje beskonačno tok nasumično generiranih podataka, koji su u skladu s RFC 4253, odnosno šalju prije provjere autentičnosti, a svaki red počinje sa SSH- i ne prelazi 255 znakova, uključujući znak za završetak reda. Generalno, sve je po standardu.

Standardno, program čeka 10 sekundi između slanja paketa. Ovo sprečava da klijent bude istekao, tako da će klijent biti zauvek zarobljen.

Budući da se podaci šalju prije primjene kriptografije, program je izuzetno jednostavan. Ne mora implementirati nikakve šifre i podržava više protokola.

Autor je pokušao osigurati da uslužni program troši minimum resursa i radi potpuno neprimjetno na mašini. Za razliku od modernih antivirusa i drugih „sigurnosnih sistema“, ne bi trebalo da usporava vaš računar. Uspio je minimizirati i promet i potrošnju memorije zbog malo lukavije softverske implementacije. Ako bi jednostavno pokrenuo poseban proces na novoj vezi, onda bi potencijalni napadači mogli pokrenuti DDoS napad otvaranjem više veza kako bi iscrpili resurse na mašini. Jedna nit po vezi takođe nije najbolja opcija, jer će kernel trošiti resurse na upravljanje nitima.

Zato je Chris Wellons odabrao najlakšu opciju za Endlessh: server s jednim niti poll(2), gdje klijenti u trap-u ne troše praktično nikakve dodatne resurse, ne računajući socket objekat u kernelu i još 78 bajtova za praćenje u Endlesshu. Kako bi se izbjeglo dodjeljivanje bafera za primanje i slanje za svakog klijenta, Endlessh otvara utičnicu za direktni pristup i direktno prevodi TCP pakete, zaobilazeći gotovo cijeli TCP/IP stog operativnog sistema. Dolazni bafer uopšte nije potreban, jer nas ne zanimaju dolazni podaci.

Autor to kaže u vrijeme svog programa nisam znala o postojanju Pythonovog asycio-a i drugih tarpita. Da je znao za asycio, mogao bi implementirati svoj uslužni program u samo 18 redova u 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 idealan za pisanje tarpita. Na primjer, ova kuka će zamrznuti Firefox, Chrome ili bilo koji drugi klijent koji pokušava da se poveže na vaš HTTP server na mnogo sati:

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 onlajn nasilnika. Istina, postoji određeni rizik, naprotiv, da im se skrene pažnja na neobično ponašanje određenog servera. Neko možda razmišljati o osveti i ciljani DDoS napad na vaš IP. Međutim, do sada takvih slučajeva nije bilo, a cerade odlično funkcioniraju.

čvorišta:
Python, Sigurnost informacija, Softver, Administracija sistema

Tagovi:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) za dolazne SSH veze

Nije tajna da je internet veoma neprijateljsko okruženje. Čim podignete server, on je trenutno podvrgnut masovnim napadima i višestrukim skeniranjima. Na primjer lonac od zaštitara možete procijeniti razmjere ovog smeća. Zapravo, na prosječnom serveru, 99% saobraćaja može biti zlonamjerno.

Tarpit je trap port koji se koristi za usporavanje dolaznih veza. Ako se sistem treće strane poveže na ovaj port, nećete moći brzo da zatvorite vezu. Morat će potrošiti svoje sistemske resurse i pričekati da istekne vremensko ograničenje veze ili je ručno prekinuti.

Najčešće se tarpiti koriste za zaštitu. Tehnika je prvo razvijena za zaštitu od kompjuterskih crva. A sada se može iskoristiti da uništi živote spamera i istraživača koji se bave širokim skeniranjem svih IP adresa zaredom (primjeri na Habré-u: Austrija, Ukrajina).

Jedan od sistemskih administratora po imenu Chris Wellons očigledno se umorio od gledanja ove sramote - i napisao je mali program Beskrajno, tarpit za SSH koji usporava dolazne veze. Program otvara port (podrazumevani port za testiranje je 2222) i pretvara se da je SSH server, ali u stvarnosti uspostavlja beskrajnu vezu sa dolaznim klijentom sve dok ne odustane. To može trajati nekoliko dana ili više dok klijent ne padne.

Instalacija uslužnog programa:

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

Pravilno implementiran tarpit će oduzeti više resursa od napadača nego od vas. Ali nije čak ni u pitanju resursa. Autor on pišeda program izaziva ovisnost. Trenutno ima 27 klijenata u zamci, od kojih su neki povezani nedeljama. Na vrhuncu aktivnosti, 1378 klijenata je bilo zarobljeno 20 sati!

U radnom režimu, Endlessh server treba instalirati na uobičajeni port 22, gdje huligani masovno kucaju. Standardne sigurnosne preporuke uvijek savjetuju premještanje SSH-a na drugi port, što odmah smanjuje veličinu dnevnika za red veličine.

Chris Wellons kaže da njegov program koristi jedan paragraf specifikacije RFC 4253 na SSH protokol. Odmah nakon uspostavljanja TCP veze, ali prije primjene kriptografije, obje strane moraju poslati identifikacijski niz. A tu je i napomena: "Server MOŽE poslati druge redove podataka prije slanja reda verzije". I nema ograničenja o količini ovih podataka, samo trebate započeti svaki red sa SSH-.

To je upravo ono što Endlessh program radi: it šalje beskonačno tok nasumično generiranih podataka, koji su u skladu s RFC 4253, odnosno šalju prije provjere autentičnosti, a svaki red počinje sa SSH- i ne prelazi 255 znakova, uključujući znak za završetak reda. Generalno, sve je po standardu.

Standardno, program čeka 10 sekundi između slanja paketa. Ovo sprečava da klijent bude istekao, tako da će klijent biti zauvek zarobljen.

Budući da se podaci šalju prije primjene kriptografije, program je izuzetno jednostavan. Ne mora implementirati nikakve šifre i podržava više protokola.

Autor je pokušao osigurati da uslužni program troši minimum resursa i radi potpuno neprimjetno na mašini. Za razliku od modernih antivirusa i drugih „sigurnosnih sistema“, ne bi trebalo da usporava vaš računar. Uspio je minimizirati i promet i potrošnju memorije zbog malo lukavije softverske implementacije. Ako bi jednostavno pokrenuo poseban proces na novoj vezi, onda bi potencijalni napadači mogli pokrenuti DDoS napad otvaranjem više veza kako bi iscrpili resurse na mašini. Jedna nit po vezi takođe nije najbolja opcija, jer će kernel trošiti resurse na upravljanje nitima.

Zato je Chris Wellons odabrao najlakšu opciju za Endlessh: server s jednim niti poll(2), gdje klijenti u trap-u ne troše praktično nikakve dodatne resurse, ne računajući socket objekat u kernelu i još 78 bajtova za praćenje u Endlesshu. Kako bi se izbjeglo dodjeljivanje bafera za primanje i slanje za svakog klijenta, Endlessh otvara utičnicu za direktni pristup i direktno prevodi TCP pakete, zaobilazeći gotovo cijeli TCP/IP stog operativnog sistema. Dolazni bafer uopšte nije potreban, jer nas ne zanimaju dolazni podaci.

Autor to kaže u vrijeme svog programa nisam znala o postojanju Pythonovog asycio-a i drugih tarpita. Da je znao za asycio, mogao bi implementirati svoj uslužni program u samo 18 redova u 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 idealan za pisanje tarpita. Na primjer, ova kuka će zamrznuti Firefox, Chrome ili bilo koji drugi klijent koji pokušava da se poveže na vaš HTTP server na mnogo sati:

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 onlajn nasilnika. Istina, postoji određeni rizik, naprotiv, da im se skrene pažnja na neobično ponašanje određenog servera. Neko možda razmišljati o osveti i ciljani DDoS napad na vaš IP. Međutim, do sada takvih slučajeva nije bilo, a cerade odlično funkcioniraju.

Trap (tarpit) za dolazne SSH veze

izvor: www.habr.com

Dodajte komentar