Nobena skrivnost ni, da je internet zelo sovražno okolje. Takoj ko dvignete strežnik, je takoj izpostavljen množičnim napadom in večkratnim pregledom. Na primer
Tarpit so vrata pasti, ki se uporabljajo za upočasnitev dohodnih povezav. Če se na ta vrata poveže sistem drugega proizvajalca, povezave ne boste mogli hitro prekiniti. Morala bo zapraviti svoje sistemske vire in počakati, da poteče časovna omejitev povezave, ali pa jo ročno prekiniti.
Najpogosteje se za zaščito uporabljajo ponjave. Tehnika je bila najprej razvita za zaščito pred računalniškimi črvi. In zdaj ga je mogoče uporabiti za uničenje življenja pošiljateljem neželene pošte in raziskovalcem, ki se ukvarjajo s širokim pregledovanjem vseh naslovov IP zaporedoma (primeri na Habréju:
Eden od sistemskih administratorjev po imenu Chris Wellons se je očitno naveličal gledati te sramote - in napisal je majhen program
Namestitev pripomočka:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Pravilno implementiran tarpit bo vzel več sredstev od napadalca kot od vas. A niti ne gre za vire. Avtor
V načinu delovanja je treba strežnik Endlessh namestiti na običajna vrata 22, kjer huligani množično trkajo. Standardna varnostna priporočila vedno svetujejo premik SSH na druga vrata, kar takoj zmanjša velikost dnevnikov za red velikosti.
Chris Wellons pravi, da njegov program izkorišča en odstavek specifikacije SSH-
.
Točno to počne program Endlessh: to pošilja neskončno tok naključno ustvarjenih podatkov, ki so v skladu z RFC 4253, to pomeni, da pošljejo pred preverjanjem pristnosti in vsaka vrstica se začne z SSH-
in ne presega 255 znakov, vključno z znakom za konec vrstice. Na splošno je vse v skladu s standardom.
Privzeto program med pošiljanjem paketov čaka 10 sekund. To preprečuje odjemalcu časovno omejitev, tako da bo odjemalec za vedno ujet.
Ker se podatki pošljejo pred uporabo kriptografije, je program izjemno preprost. Ni mu treba implementirati nobenih šifer in podpira več protokolov.
Avtor je poskušal zagotoviti, da pripomoček porabi najmanj virov in na stroju deluje popolnoma neopaženo. Za razliko od sodobnih protivirusnih programov in drugih »varnostnih sistemov« ne bi smel upočasniti vašega računalnika. Tako promet kot porabo pomnilnika mu je uspelo minimizirati zaradi nekoliko bolj premetene programske implementacije. Če bi preprosto zagnal ločen proces na novi povezavi, bi lahko morebitni napadalci sprožili napad DDoS z odpiranjem več povezav, da bi izčrpali vire v napravi. Ena nit na povezavo prav tako ni najboljša možnost, ker bo jedro zapravljalo sredstva za upravljanje niti.
Zato je Chris Wellons izbral najlažjo možnost za Endlessh: strežnik z eno nitjo poll(2)
, kjer odjemalci v pasti praktično ne porabijo dodatnih virov, ne da bi upoštevali objekt vtičnice v jedru in dodatnih 78 bajtov za sledenje v Endlessh. Da se izogne dodelitvi medpomnilnikov za sprejem in pošiljanje za vsakega odjemalca, Endlessh odpre vtičnico za neposredni dostop in neposredno prevede pakete TCP, tako da zaobide skoraj celoten sklad TCP/IP operacijskega sistema. Vhodni medpomnilnik sploh ni potreben, ker nas vhodni podatki ne zanimajo.
Avtor pravi, da v času svojega programa
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 idealen za pisanje tarpitov. Na primer, ta kavelj bo zamrznil Firefox, Chrome ali katerega koli drugega odjemalca, ki se poskuša povezati z vašim strežnikom HTTP za več ur:
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čno orodje za kaznovanje spletnih ustrahovalcev. Res je, nasprotno, obstaja nekaj tveganja, da bi jih opozorili na nenavadno vedenje določenega strežnika. Nekdo
vozlišča:
Python, Informacijska varnost, Programska oprema, Sistemska administracija
Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) za dohodne povezave SSH
Nobena skrivnost ni, da je internet zelo sovražno okolje. Takoj ko dvignete strežnik, je takoj izpostavljen množičnim napadom in večkratnim pregledom. Na primer
Tarpit so vrata pasti, ki se uporabljajo za upočasnitev dohodnih povezav. Če se na ta vrata poveže sistem drugega proizvajalca, povezave ne boste mogli hitro prekiniti. Morala bo zapraviti svoje sistemske vire in počakati, da poteče časovna omejitev povezave, ali pa jo ročno prekiniti.
Najpogosteje se za zaščito uporabljajo ponjave. Tehnika je bila najprej razvita za zaščito pred računalniškimi črvi. In zdaj ga je mogoče uporabiti za uničenje življenja pošiljateljem neželene pošte in raziskovalcem, ki se ukvarjajo s širokim pregledovanjem vseh naslovov IP zaporedoma (primeri na Habréju:
Eden od sistemskih administratorjev po imenu Chris Wellons se je očitno naveličal gledati te sramote - in napisal je majhen program
Namestitev pripomočka:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Pravilno implementiran tarpit bo vzel več sredstev od napadalca kot od vas. A niti ne gre za vire. Avtor
V načinu delovanja je treba strežnik Endlessh namestiti na običajna vrata 22, kjer huligani množično trkajo. Standardna varnostna priporočila vedno svetujejo premik SSH na druga vrata, kar takoj zmanjša velikost dnevnikov za red velikosti.
Chris Wellons pravi, da njegov program izkorišča en odstavek specifikacije SSH-
.
Točno to počne program Endlessh: to pošilja neskončno tok naključno ustvarjenih podatkov, ki so v skladu z RFC 4253, to pomeni, da pošljejo pred preverjanjem pristnosti in vsaka vrstica se začne z SSH-
in ne presega 255 znakov, vključno z znakom za konec vrstice. Na splošno je vse v skladu s standardom.
Privzeto program med pošiljanjem paketov čaka 10 sekund. To preprečuje odjemalcu časovno omejitev, tako da bo odjemalec za vedno ujet.
Ker se podatki pošljejo pred uporabo kriptografije, je program izjemno preprost. Ni mu treba implementirati nobenih šifer in podpira več protokolov.
Avtor je poskušal zagotoviti, da pripomoček porabi najmanj virov in na stroju deluje popolnoma neopaženo. Za razliko od sodobnih protivirusnih programov in drugih »varnostnih sistemov« ne bi smel upočasniti vašega računalnika. Tako promet kot porabo pomnilnika mu je uspelo minimizirati zaradi nekoliko bolj premetene programske implementacije. Če bi preprosto zagnal ločen proces na novi povezavi, bi lahko morebitni napadalci sprožili napad DDoS z odpiranjem več povezav, da bi izčrpali vire v napravi. Ena nit na povezavo prav tako ni najboljša možnost, ker bo jedro zapravljalo sredstva za upravljanje niti.
Zato je Chris Wellons izbral najlažjo možnost za Endlessh: strežnik z eno nitjo poll(2)
, kjer odjemalci v pasti praktično ne porabijo dodatnih virov, ne da bi upoštevali objekt vtičnice v jedru in dodatnih 78 bajtov za sledenje v Endlessh. Da se izogne dodelitvi medpomnilnikov za sprejem in pošiljanje za vsakega odjemalca, Endlessh odpre vtičnico za neposredni dostop in neposredno prevede pakete TCP, tako da zaobide skoraj celoten sklad TCP/IP operacijskega sistema. Vhodni medpomnilnik sploh ni potreben, ker nas vhodni podatki ne zanimajo.
Avtor pravi, da v času svojega programa
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 idealen za pisanje tarpitov. Na primer, ta kavelj bo zamrznil Firefox, Chrome ali katerega koli drugega odjemalca, ki se poskuša povezati z vašim strežnikom HTTP za več ur:
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čno orodje za kaznovanje spletnih ustrahovalcev. Res je, nasprotno, obstaja nekaj tveganja, da bi jih opozorili na nenavadno vedenje določenega strežnika. Nekdo
Vir: www.habr.com