Trap (tarpit) įeinantiems SSH ryšiams

Ne paslaptis, kad internetas yra labai priešiška aplinka. Kai tik pakeliate serverį, jis akimirksniu patiria didžiulius atakas ir kelis kartus nuskaito. Pavyzdžiui medaus puodą iš apsaugos darbuotojų galite įvertinti šio šiukšlių srauto mastą. Tiesą sakant, vidutiniame serveryje 99% srauto gali būti kenkėjiški.

Tarpit yra gaudyklės prievadas, naudojamas įeinantiems ryšiams sulėtinti. Jei prie šio prievado prisijungs trečiosios šalies sistema, negalėsite greitai uždaryti ryšio. Ji turės eikvoti savo sistemos išteklius ir laukti, kol baigsis ryšio laikas, arba jį nutraukti rankiniu būdu.

Dažniausiai apsaugai naudojami tarpitai. Ši technika pirmą kartą buvo sukurta apsaugoti nuo kompiuterių kirminų. Ir dabar jis gali būti naudojamas sugadinti šiukšlių siuntėjų ir tyrėjų gyvenimus, kurie plačiai nuskaito visus IP adresus iš eilės (pavyzdžiai apie Habré: Austrijoje, Ukraina).

Vienas iš sistemos administratorių, vardu Chrisas Wellonsas, matyt, pavargo žiūrėti šią gėdą – ir jis parašė nedidelę programą. Begalinis, tarpit SSH, kuris sulėtina gaunamus ryšius. Programa atidaro prievadą (numatytasis bandymo prievadas yra 2222) ir apsimeta SSH serveriu, tačiau iš tikrųjų ji užmezga begalinį ryšį su gaunamu klientu, kol jis nepasiduoda. Tai gali tęstis kelias dienas ar ilgiau, kol klientas nukris.

Priemonės diegimas:

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

Tinkamai įdiegtas tarpitas atims daugiau išteklių iš užpuoliko nei iš jūsų. Bet tai net ne išteklių klausimas. Autorius rašokad programa sukelia priklausomybę. Šiuo metu įstrigę 27 klientai, kai kurie iš jų yra prisijungę prie kelių savaičių. Aktyvumo piko metu 1378 klientai buvo įstrigę 20 valandų!

Veikimo režimu Endlessh serverį reikia įdiegti į įprastą 22 prievadą, kur masiškai beldžiasi chuliganai. Standartinės saugos rekomendacijos visada pataria perkelti SSH į kitą prievadą, o tai iškart sumažina žurnalų dydį.

Chrisas Wellonsas sako, kad jo programa naudoja vieną specifikacijos pastraipą RFC 4253 prie SSH protokolo. Iš karto po TCP ryšio užmezgimo, bet prieš taikant kriptografiją, abi šalys turi išsiųsti identifikavimo eilutę. Taip pat yra pastaba: "Serveris GALI siųsti kitas duomenų eilutes prieš siųsdamas versijos eilutę". Ir jokios ribos apie šių duomenų kiekį, tereikia pradėti kiekvieną eilutę SSH-.

Kaip tik tai daro Endlessh programa: tai siunčia begalinis atsitiktinai sugeneruotų duomenų srautas, kurie atitinka RFC 4253, ty siunčiami prieš autentifikavimą ir kiekviena eilutė prasideda SSH- ir neviršija 255 simbolių, įskaitant eilutės pabaigos simbolį. Apskritai viskas pagal standartą.

Pagal numatytuosius nustatymus programa laukia 10 sekundžių tarp paketų siuntimo. Tai apsaugo nuo kliento laiko pabaigos, todėl klientas bus įstrigęs amžinai.

Kadangi duomenys siunčiami prieš taikant kriptografiją, programa itin paprasta. Jai nereikia įdiegti jokių šifrų ir jis palaiko kelis protokolus.

Autorius stengėsi užtikrinti, kad komunalinė programa sunaudotų kuo mažiau išteklių ir mašinoje veiktų visiškai nepastebimai. Skirtingai nuo šiuolaikinių antivirusinių ir kitų „saugos sistemų“, ji neturėtų sulėtinti kompiuterio. Dėl šiek tiek gudresnio programinės įrangos diegimo jam pavyko sumažinti srautą ir atminties suvartojimą. Jei jis tiesiog pradėtų atskirą naujo ryšio procesą, potencialūs užpuolikai galėtų pradėti DDoS ataką atidarydami kelias jungtis, kad išnaudotų įrenginio išteklius. Viena gija vienai jungtis taip pat nėra geriausias pasirinkimas, nes branduolys eikvoja išteklius tvarkydamas gijas.

Štai kodėl Chrisas Wellonsas pasirinko lengviausią „Endlessh“ parinktį: vienos gijos serverį poll(2), kur spąstuose esantys klientai praktiškai nenaudoja papildomų resursų, neskaičiuojant branduolyje esančio lizdo objekto ir dar 78 baitų sekimui Endlessh. Kad nereikėtų skirti priėmimo ir siuntimo buferių kiekvienam klientui, Endlessh atidaro tiesioginės prieigos lizdą ir tiesiogiai verčia TCP paketus, apeinant beveik visą operacinės sistemos TCP/IP steką. Įeinančio buferio visai nereikia, nes gaunami duomenys mums neįdomūs.

Autorius sako, kad savo programos metu Nežinau apie Python asycio ir kitų tarpitų egzistavimą. Jei jis žinotų apie asycio, jis galėtų įdiegti savo įrankį tik 18 Python eilučių:

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 idealiai tinka rašyti tarpitus. Pavyzdžiui, šis kabliukas užšaldys „Firefox“, „Chrome“ ar bet kurį kitą klientą, kuris daug valandų bando prisijungti prie jūsų HTTP serverio:

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 yra puiki priemonė bausti už interneto patyčias. Tiesa, yra tam tikra rizika, priešingai, atkreipti jų dėmesį į neįprastą konkretaus serverio elgesį. kas nors gali pagalvoti apie kerštą ir tikslinė DDoS ataka prieš jūsų IP. Tačiau iki šiol tokių atvejų nebuvo, o tarpitai puikiai veikia.

Stebulės:
Python, Informacijos sauga, Programinė įranga, Sistemų administravimas

Žymos:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) įeinantiems SSH ryšiams

Ne paslaptis, kad internetas yra labai priešiška aplinka. Kai tik pakeliate serverį, jis akimirksniu patiria didžiulius atakas ir kelis kartus nuskaito. Pavyzdžiui medaus puodą iš apsaugos darbuotojų galite įvertinti šio šiukšlių srauto mastą. Tiesą sakant, vidutiniame serveryje 99% srauto gali būti kenkėjiški.

Tarpit yra gaudyklės prievadas, naudojamas įeinantiems ryšiams sulėtinti. Jei prie šio prievado prisijungs trečiosios šalies sistema, negalėsite greitai uždaryti ryšio. Ji turės eikvoti savo sistemos išteklius ir laukti, kol baigsis ryšio laikas, arba jį nutraukti rankiniu būdu.

Dažniausiai apsaugai naudojami tarpitai. Ši technika pirmą kartą buvo sukurta apsaugoti nuo kompiuterių kirminų. Ir dabar jis gali būti naudojamas sugadinti šiukšlių siuntėjų ir tyrėjų gyvenimus, kurie plačiai nuskaito visus IP adresus iš eilės (pavyzdžiai apie Habré: Austrijoje, Ukraina).

Vienas iš sistemos administratorių, vardu Chrisas Wellonsas, matyt, pavargo žiūrėti šią gėdą – ir jis parašė nedidelę programą. Begalinis, tarpit SSH, kuris sulėtina gaunamus ryšius. Programa atidaro prievadą (numatytasis bandymo prievadas yra 2222) ir apsimeta SSH serveriu, tačiau iš tikrųjų ji užmezga begalinį ryšį su gaunamu klientu, kol jis nepasiduoda. Tai gali tęstis kelias dienas ar ilgiau, kol klientas nukris.

Priemonės diegimas:

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

Tinkamai įdiegtas tarpitas atims daugiau išteklių iš užpuoliko nei iš jūsų. Bet tai net ne išteklių klausimas. Autorius rašokad programa sukelia priklausomybę. Šiuo metu įstrigę 27 klientai, kai kurie iš jų yra prisijungę prie kelių savaičių. Aktyvumo piko metu 1378 klientai buvo įstrigę 20 valandų!

Veikimo režimu Endlessh serverį reikia įdiegti į įprastą 22 prievadą, kur masiškai beldžiasi chuliganai. Standartinės saugos rekomendacijos visada pataria perkelti SSH į kitą prievadą, o tai iškart sumažina žurnalų dydį.

Chrisas Wellonsas sako, kad jo programa naudoja vieną specifikacijos pastraipą RFC 4253 prie SSH protokolo. Iš karto po TCP ryšio užmezgimo, bet prieš taikant kriptografiją, abi šalys turi išsiųsti identifikavimo eilutę. Taip pat yra pastaba: "Serveris GALI siųsti kitas duomenų eilutes prieš siųsdamas versijos eilutę". Ir jokios ribos apie šių duomenų kiekį, tereikia pradėti kiekvieną eilutę SSH-.

Kaip tik tai daro Endlessh programa: tai siunčia begalinis atsitiktinai sugeneruotų duomenų srautas, kurie atitinka RFC 4253, ty siunčiami prieš autentifikavimą ir kiekviena eilutė prasideda SSH- ir neviršija 255 simbolių, įskaitant eilutės pabaigos simbolį. Apskritai viskas pagal standartą.

Pagal numatytuosius nustatymus programa laukia 10 sekundžių tarp paketų siuntimo. Tai apsaugo nuo kliento laiko pabaigos, todėl klientas bus įstrigęs amžinai.

Kadangi duomenys siunčiami prieš taikant kriptografiją, programa itin paprasta. Jai nereikia įdiegti jokių šifrų ir jis palaiko kelis protokolus.

Autorius stengėsi užtikrinti, kad komunalinė programa sunaudotų kuo mažiau išteklių ir mašinoje veiktų visiškai nepastebimai. Skirtingai nuo šiuolaikinių antivirusinių ir kitų „saugos sistemų“, ji neturėtų sulėtinti kompiuterio. Dėl šiek tiek gudresnio programinės įrangos diegimo jam pavyko sumažinti srautą ir atminties suvartojimą. Jei jis tiesiog pradėtų atskirą naujo ryšio procesą, potencialūs užpuolikai galėtų pradėti DDoS ataką atidarydami kelias jungtis, kad išnaudotų įrenginio išteklius. Viena gija vienai jungtis taip pat nėra geriausias pasirinkimas, nes branduolys eikvoja išteklius tvarkydamas gijas.

Štai kodėl Chrisas Wellonsas pasirinko lengviausią „Endlessh“ parinktį: vienos gijos serverį poll(2), kur spąstuose esantys klientai praktiškai nenaudoja papildomų resursų, neskaičiuojant branduolyje esančio lizdo objekto ir dar 78 baitų sekimui Endlessh. Kad nereikėtų skirti priėmimo ir siuntimo buferių kiekvienam klientui, Endlessh atidaro tiesioginės prieigos lizdą ir tiesiogiai verčia TCP paketus, apeinant beveik visą operacinės sistemos TCP/IP steką. Įeinančio buferio visai nereikia, nes gaunami duomenys mums neįdomūs.

Autorius sako, kad savo programos metu Nežinau apie Python asycio ir kitų tarpitų egzistavimą. Jei jis žinotų apie asycio, jis galėtų įdiegti savo įrankį tik 18 Python eilučių:

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 idealiai tinka rašyti tarpitus. Pavyzdžiui, šis kabliukas užšaldys „Firefox“, „Chrome“ ar bet kurį kitą klientą, kuris daug valandų bando prisijungti prie jūsų HTTP serverio:

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 yra puiki priemonė bausti už interneto patyčias. Tiesa, yra tam tikra rizika, priešingai, atkreipti jų dėmesį į neįprastą konkretaus serverio elgesį. kas nors gali pagalvoti apie kerštą ir tikslinė DDoS ataka prieš jūsų IP. Tačiau iki šiol tokių atvejų nebuvo, o tarpitai puikiai veikia.

Trap (tarpit) įeinantiems SSH ryšiams

Šaltinis: www.habr.com

Добавить комментарий