Trap (tarpit) za dolazne SSH veze

Nije tajna da je Internet vrlo neprijateljsko okruženje. Čim podignete poslužitelj, on je trenutno podvrgnut masivnim napadima i višestrukim skeniranjima. Na primjer honeypot od zaštitara možete procijeniti razmjere ovog prometa smećem. Zapravo, na prosječnom poslužitelju 99% prometa može biti zlonamjerno.

Tarpit je trap port koji se koristi za usporavanje dolaznih veza. Ako se sustav treće strane spoji na ovaj priključak, nećete moći brzo zatvoriti vezu. Morat će trošiti svoje sistemske resurse i čekati dok veza ne istekne ili je ručno prekinuti.

Najčešće se za zaštitu koriste cerade. Tehnika je prvo razvijena za zaštitu od računalnih crva. A sada se može koristiti za uništavanje života spamera i istraživača koji se bave širokim skeniranjem svih IP adresa zaredom (primjeri na Habréu: Austrija, Ukrajina).

Jednom od sistemskih administratora po imenu Chris Wellons očito je dosadilo gledati ovu sramotu - te je napisao mali program Beskrajno, tarpit za SSH koji usporava dolazne veze. Program otvara port (default port za testiranje je 2222) i pretvara se da je SSH poslužitelj, ali u stvarnosti uspostavlja beskrajnu vezu s dolaznim klijentom sve dok ovaj ne odustane. To se može nastaviti nekoliko dana ili više dok klijent ne padne.

Instalacija uslužnog programa:

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

Pravilno implementiran tarpit oduzet će više resursa od napadača nego od vas. Ali nije čak ni stvar u resursima. Autor piše:da program stvara ovisnost. Trenutno ima 27 zarobljenih klijenata, neki od njih povezani su tjednima. Na vrhuncu aktivnosti 1378 klijenata bilo je zarobljeno 20 sati!

U načinu rada, 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 zapisa za red veličine.

Chris Wellons kaže da njegov program iskorištava 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: "Poslužitelj MOŽE poslati druge retke podataka prije slanja retka verzije", i nema ograničenja o količini ovih podataka, samo trebate započeti svaki redak s SSH-.

Upravo to čini program Endlessh: to šalje beskrajan tok nasumično generiranih podataka, koji su u skladu s RFC 4253, odnosno šalju se prije autentifikacije, a svaki red počinje s SSH- i ne prelazi 255 znakova, uključujući znak završetka retka. Općenito, sve je prema standardu.

Prema zadanim postavkama, program čeka 10 sekundi između slanja paketa. Ovo sprječava da klijent istekne, tako da će klijent zauvijek biti zarobljen.

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

Autor je pokušao osigurati da uslužni program troši najmanje resursa i radi potpuno neprimjetno na stroju. Za razliku od modernih antivirusa i drugih "sigurnosnih sustava", ne bi trebao usporavati vaše računalo. Uspio je minimizirati i promet i potrošnju memorije zahvaljujući malo lukavijoj programskoj implementaciji. Ako je jednostavno pokrenuo zaseban proces na novoj vezi, tada bi potencijalni napadači mogli pokrenuti DDoS napad otvaranjem više veza kako bi iscrpili resurse na računalu. Jedna nit po vezi također nije najbolja opcija, jer će kernel uzalud trošiti resurse na upravljanje nitima.

Zato je Chris Wellons odabrao najlakšu opciju za Endlessh: poslužitelj s jednom niti poll(2), gdje klijenti u zamci ne troše praktički nikakve dodatne resurse, ne računajući socket objekt u kernelu i još 78 bajtova za praćenje u Endlesshu. Kako bi se izbjeglo dodjeljivanje međuspremnika za primanje i slanje za svakog klijenta, Endlessh otvara utičnicu s izravnim pristupom i izravno prevodi TCP pakete, zaobilazeći gotovo cijeli TCP/IP stog operativnog sustava. Dolazni međuspremnik uopće nije potreban, jer nas ne zanimaju dolazni podaci.

Autor kaže da u vrijeme svog programa nisam znao o postojanju Pythonovog asycia i drugih tarpita. Kad bi znao za asycio, mogao bi implementirati svoj uslužni program u samo 18 redaka 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 se pokušava spojiti na vaš HTTP poslužitelj 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 izvrstan alat za kažnjavanje online nasilnika. Istina, postoji određeni rizik, naprotiv, privlačenja njihove pozornosti na neobično ponašanje određenog poslužitelja. Netko mogli razmišljati o osveti i ciljani DDoS napad na vaš IP. No, dosad nije bilo takvih slučajeva, a tarpiti rade odlično.

čvorišta:
Python, Informacijska sigurnost, Softver, Administracija sustava

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

Nije tajna da je Internet vrlo neprijateljsko okruženje. Čim podignete poslužitelj, on je trenutno podvrgnut masivnim napadima i višestrukim skeniranjima. Na primjer honeypot od zaštitara možete procijeniti razmjere ovog prometa smećem. Zapravo, na prosječnom poslužitelju 99% prometa može biti zlonamjerno.

Tarpit je trap port koji se koristi za usporavanje dolaznih veza. Ako se sustav treće strane spoji na ovaj priključak, nećete moći brzo zatvoriti vezu. Morat će trošiti svoje sistemske resurse i čekati dok veza ne istekne ili je ručno prekinuti.

Najčešće se za zaštitu koriste cerade. Tehnika je prvo razvijena za zaštitu od računalnih crva. A sada se može koristiti za uništavanje života spamera i istraživača koji se bave širokim skeniranjem svih IP adresa zaredom (primjeri na Habréu: Austrija, Ukrajina).

Jednom od sistemskih administratora po imenu Chris Wellons očito je dosadilo gledati ovu sramotu - te je napisao mali program Beskrajno, tarpit za SSH koji usporava dolazne veze. Program otvara port (default port za testiranje je 2222) i pretvara se da je SSH poslužitelj, ali u stvarnosti uspostavlja beskrajnu vezu s dolaznim klijentom sve dok ovaj ne odustane. To se može nastaviti nekoliko dana ili više dok klijent ne padne.

Instalacija uslužnog programa:

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

Pravilno implementiran tarpit oduzet će više resursa od napadača nego od vas. Ali nije čak ni stvar u resursima. Autor piše:da program stvara ovisnost. Trenutno ima 27 zarobljenih klijenata, neki od njih povezani su tjednima. Na vrhuncu aktivnosti 1378 klijenata bilo je zarobljeno 20 sati!

U načinu rada, 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 zapisa za red veličine.

Chris Wellons kaže da njegov program iskorištava 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: "Poslužitelj MOŽE poslati druge retke podataka prije slanja retka verzije", i nema ograničenja o količini ovih podataka, samo trebate započeti svaki redak s SSH-.

Upravo to čini program Endlessh: to šalje beskrajan tok nasumično generiranih podataka, koji su u skladu s RFC 4253, odnosno šalju se prije autentifikacije, a svaki red počinje s SSH- i ne prelazi 255 znakova, uključujući znak završetka retka. Općenito, sve je prema standardu.

Prema zadanim postavkama, program čeka 10 sekundi između slanja paketa. Ovo sprječava da klijent istekne, tako da će klijent zauvijek biti zarobljen.

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

Autor je pokušao osigurati da uslužni program troši najmanje resursa i radi potpuno neprimjetno na stroju. Za razliku od modernih antivirusa i drugih "sigurnosnih sustava", ne bi trebao usporavati vaše računalo. Uspio je minimizirati i promet i potrošnju memorije zahvaljujući malo lukavijoj programskoj implementaciji. Ako je jednostavno pokrenuo zaseban proces na novoj vezi, tada bi potencijalni napadači mogli pokrenuti DDoS napad otvaranjem više veza kako bi iscrpili resurse na računalu. Jedna nit po vezi također nije najbolja opcija, jer će kernel uzalud trošiti resurse na upravljanje nitima.

Zato je Chris Wellons odabrao najlakšu opciju za Endlessh: poslužitelj s jednom niti poll(2), gdje klijenti u zamci ne troše praktički nikakve dodatne resurse, ne računajući socket objekt u kernelu i još 78 bajtova za praćenje u Endlesshu. Kako bi se izbjeglo dodjeljivanje međuspremnika za primanje i slanje za svakog klijenta, Endlessh otvara utičnicu s izravnim pristupom i izravno prevodi TCP pakete, zaobilazeći gotovo cijeli TCP/IP stog operativnog sustava. Dolazni međuspremnik uopće nije potreban, jer nas ne zanimaju dolazni podaci.

Autor kaže da u vrijeme svog programa nisam znao o postojanju Pythonovog asycia i drugih tarpita. Kad bi znao za asycio, mogao bi implementirati svoj uslužni program u samo 18 redaka 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 se pokušava spojiti na vaš HTTP poslužitelj 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 izvrstan alat za kažnjavanje online nasilnika. Istina, postoji određeni rizik, naprotiv, privlačenja njihove pozornosti na neobično ponašanje određenog poslužitelja. Netko mogli razmišljati o osveti i ciljani DDoS napad na vaš IP. No, dosad nije bilo takvih slučajeva, a tarpiti rade odlično.

Trap (tarpit) za dolazne SSH veze

Izvor: www.habr.com

Dodajte komentar