Það er ekkert leyndarmál að internetið er mjög fjandsamlegt umhverfi. Um leið og þú hækkar netþjón verður hann samstundis fyrir miklum árásum og mörgum skönnunum. Til dæmis þú getur áætlað umfang þessarar ruslaumferðar. Reyndar, á meðalþjóni, gæti 99% af umferð verið illgjarn.
Tarpit er gildruhöfn sem notuð er til að hægja á komandi tengingum. Ef kerfi þriðja aðila tengist þessari höfn muntu ekki geta lokað tengingunni fljótt. Hún verður að sóa kerfisauðlindum sínum og bíða þar til tengingin rennur út, eða slíta því handvirkt.
Oftast eru presenningar notaðir til verndar. Tæknin var fyrst þróuð til að verjast tölvuormum. Og nú er hægt að nota það til að eyðileggja líf ruslpóstsenda og vísindamanna sem stunda víðtæka skönnun á öllum IP tölum í röð (dæmi á Habré: , ).
Einn kerfisstjóranna að nafni Chris Wellons varð greinilega þreyttur á að horfa á þessa svívirðingu - og hann skrifaði lítið forrit , tarpit fyrir SSH sem hægir á komandi tengingum. Forritið opnar port (sjálfgefið tengi fyrir prófun er 2222) og gefur sig út fyrir að vera SSH þjónn, en í rauninni kemur það á endalausri tengingu við viðskiptavininn sem kemur inn þar til hann gefst upp. Þetta getur haldið áfram í nokkra daga eða lengur þar til viðskiptavinurinn dettur frá.
Uppsetning tólsins:
$ make
$ ./endlessh &
$ ssh -p2222 localhostRétt útfærð tarpit mun taka meira fjármagn frá árásarmanninum en frá þér. En þetta er ekki einu sinni spurning um fjármagn. Höfundur að forritið sé ávanabindandi. Núna eru 27 viðskiptavinir fastir, sumir þeirra tengdir í margar vikur. Þegar virkni var sem hæst voru 1378 viðskiptavinir fastir í 20 klukkustundir!
Í rekstrarham þarf Endlessh þjónninn að vera settur upp á venjulegu porti 22, þar sem hooligans banka í fjöldann. Staðlaðar öryggisráðleggingar ráðleggja alltaf að færa SSH í aðra höfn, sem dregur strax úr stærð loganna um stærðargráðu.
Chris Wellons segir að forritið hans nýti eina málsgrein í forskriftinni við SSH samskiptareglur. Strax eftir að TCP-tenging er komið á, en áður en dulmáli er beitt, verða báðir aðilar að senda auðkennisstreng. Og það er líka athugasemd: „Þjónninn Gætir sent aðrar raðir af gögnum áður en hann sendir útgáfulínuna“. Og engin takmörk á magni þessara gagna, þú þarft bara að byrja hverja línu með SSH-.
Þetta er nákvæmlega það sem Endlessh forritið gerir: það sendir endalaus straumur af handahófskenntum gögnum, sem eru í samræmi við RFC 4253, það er að senda fyrir auðkenningu, og hver lína byrjar á SSH- og fer ekki yfir 255 stafi, að meðtöldum línulokastafnum. Almennt séð er allt samkvæmt staðlinum.
Sjálfgefið er að forritið bíður í 10 sekúndur á milli þess að pakka er sent. Þetta kemur í veg fyrir að skjólstæðingurinn fái tíma út, þannig að skjólstæðingurinn verður fastur að eilífu.
Þar sem gögnin eru send áður en dulmáli er beitt er forritið afar einfalt. Það þarf ekki að innleiða neinar dulmál og styður margar samskiptareglur.
Höfundur reyndi að tryggja að tólið neyti lágmarks fjármagns og virki algjörlega óséður á vélinni. Ólíkt nútíma vírusvörnum og öðrum „öryggiskerfum“ ætti það ekki að hægja á tölvunni þinni. Honum tókst að lágmarka bæði umferð og minnisnotkun vegna aðeins slægari hugbúnaðarútfærslu. Ef það einfaldlega setti af stað sérstakt ferli á nýrri tengingu, þá gætu hugsanlegir árásarmenn sett af stað DDoS árás með því að opna margar tengingar til að tæma auðlindir á vélinni. Einn þráður í hverja tengingu er heldur ekki besti kosturinn, vegna þess að kjarninn mun sóa auðlindum í að stjórna þráðum.
Þess vegna valdi Chris Wellons léttasta valkostinn fyrir Endlessh: einn-þráða netþjóninn poll(2), þar sem fastir viðskiptavinir nota nánast engar viðbótarauðlindir, fyrir utan kjarna-socket hlutinn og 78 bæti til viðbótar fyrir rakningu í Endlessh. Til að forðast að úthluta móttöku- og sendingarbiðminni fyrir hvern viðskiptavin opnar Endlessh beinan aðgangs-socket og sendir TCP pakka beint áfram, án þess að taka tillit til nánast alls staflans. TCP/IP stýrikerfi. Inntaksbiðminnið er alls ekki nauðsynlegt því við höfum engan áhuga á gögnunum sem berast.
Höfundur segir að á þeim tíma sem dagskrá hans um tilvist Python's asycio og annarra tarpits. Ef hann vissi um asycio gæti hann innleitt gagnsemi sína í aðeins 18 línum í Python:
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 er tilvalið til að skrifa tarpits. Til dæmis mun þessi krók frysta Firefox, Chrome eða hvaða viðskiptavin sem er að reyna að tengjast HTTP netþjóninum þínum í margar klukkustundir:
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 er frábært tæki til að refsa hrekkjum á netinu. Að vísu er einhver hætta á því, þvert á móti, að vekja athygli þeirra á óvenjulegri hegðun tiltekins netþjóns. Einhver og markvissa DDoS árás á IP þinn. Hins vegar hafa engin slík tilfelli verið uppi enn sem komið er og tjaldstæði virka frábærlega.
Miðstöðvar:
Python, Upplýsingaöryggi, Hugbúnaður, Kerfisstjórnun
Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Gilda (tarpit) fyrir komandi SSH tengingar
Það er ekkert leyndarmál að internetið er mjög fjandsamlegt umhverfi. Um leið og þú hækkar netþjón verður hann samstundis fyrir miklum árásum og mörgum skönnunum. Til dæmis þú getur áætlað umfang þessarar ruslaumferðar. Reyndar, á meðalþjóni, gæti 99% af umferð verið illgjarn.
Tarpit er gildruhöfn sem notuð er til að hægja á komandi tengingum. Ef kerfi þriðja aðila tengist þessari höfn muntu ekki geta lokað tengingunni fljótt. Hún verður að sóa kerfisauðlindum sínum og bíða þar til tengingin rennur út, eða slíta því handvirkt.
Oftast eru presenningar notaðir til verndar. Tæknin var fyrst þróuð til að verjast tölvuormum. Og nú er hægt að nota það til að eyðileggja líf ruslpóstsenda og vísindamanna sem stunda víðtæka skönnun á öllum IP tölum í röð (dæmi á Habré: , ).
Einn kerfisstjóranna að nafni Chris Wellons varð greinilega þreyttur á að horfa á þessa svívirðingu - og hann skrifaði lítið forrit , tarpit fyrir SSH sem hægir á komandi tengingum. Forritið opnar port (sjálfgefið tengi fyrir prófun er 2222) og gefur sig út fyrir að vera SSH þjónn, en í rauninni kemur það á endalausri tengingu við viðskiptavininn sem kemur inn þar til hann gefst upp. Þetta getur haldið áfram í nokkra daga eða lengur þar til viðskiptavinurinn dettur frá.
Uppsetning tólsins:
$ make
$ ./endlessh &
$ ssh -p2222 localhostRétt útfærð tarpit mun taka meira fjármagn frá árásarmanninum en frá þér. En þetta er ekki einu sinni spurning um fjármagn. Höfundur að forritið sé ávanabindandi. Núna eru 27 viðskiptavinir fastir, sumir þeirra tengdir í margar vikur. Þegar virkni var sem hæst voru 1378 viðskiptavinir fastir í 20 klukkustundir!
Í rekstrarham þarf Endlessh þjónninn að vera settur upp á venjulegu porti 22, þar sem hooligans banka í fjöldann. Staðlaðar öryggisráðleggingar ráðleggja alltaf að færa SSH í aðra höfn, sem dregur strax úr stærð loganna um stærðargráðu.
Chris Wellons segir að forritið hans nýti eina málsgrein í forskriftinni við SSH samskiptareglur. Strax eftir að TCP-tenging er komið á, en áður en dulmáli er beitt, verða báðir aðilar að senda auðkennisstreng. Og það er líka athugasemd: „Þjónninn Gætir sent aðrar raðir af gögnum áður en hann sendir útgáfulínuna“. Og engin takmörk á magni þessara gagna, þú þarft bara að byrja hverja línu með SSH-.
Þetta er nákvæmlega það sem Endlessh forritið gerir: það sendir endalaus straumur af handahófskenntum gögnum, sem eru í samræmi við RFC 4253, það er að senda fyrir auðkenningu, og hver lína byrjar á SSH- og fer ekki yfir 255 stafi, að meðtöldum línulokastafnum. Almennt séð er allt samkvæmt staðlinum.
Sjálfgefið er að forritið bíður í 10 sekúndur á milli þess að pakka er sent. Þetta kemur í veg fyrir að skjólstæðingurinn fái tíma út, þannig að skjólstæðingurinn verður fastur að eilífu.
Þar sem gögnin eru send áður en dulmáli er beitt er forritið afar einfalt. Það þarf ekki að innleiða neinar dulmál og styður margar samskiptareglur.
Höfundur reyndi að tryggja að tólið neyti lágmarks fjármagns og virki algjörlega óséður á vélinni. Ólíkt nútíma vírusvörnum og öðrum „öryggiskerfum“ ætti það ekki að hægja á tölvunni þinni. Honum tókst að lágmarka bæði umferð og minnisnotkun vegna aðeins slægari hugbúnaðarútfærslu. Ef það einfaldlega setti af stað sérstakt ferli á nýrri tengingu, þá gætu hugsanlegir árásarmenn sett af stað DDoS árás með því að opna margar tengingar til að tæma auðlindir á vélinni. Einn þráður í hverja tengingu er heldur ekki besti kosturinn, vegna þess að kjarninn mun sóa auðlindum í að stjórna þráðum.
Þess vegna valdi Chris Wellons léttasta valkostinn fyrir Endlessh: einn-þráða netþjóninn poll(2), þar sem fastir viðskiptavinir nota nánast engar viðbótarauðlindir, fyrir utan kjarna-socket hlutinn og 78 bæti til viðbótar fyrir rakningu í Endlessh. Til að forðast að úthluta móttöku- og sendingarbiðminni fyrir hvern viðskiptavin opnar Endlessh beinan aðgangs-socket og sendir TCP pakka beint áfram, án þess að taka tillit til nánast alls staflans. TCP/IP stýrikerfi. Inntaksbiðminnið er alls ekki nauðsynlegt því við höfum engan áhuga á gögnunum sem berast.
Höfundur segir að á þeim tíma sem dagskrá hans um tilvist Python's asycio og annarra tarpits. Ef hann vissi um asycio gæti hann innleitt gagnsemi sína í aðeins 18 línum í Python:
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 er tilvalið til að skrifa tarpits. Til dæmis mun þessi krók frysta Firefox, Chrome eða hvaða viðskiptavin sem er að reyna að tengjast HTTP netþjóninum þínum í margar klukkustundir:
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 er frábært tæki til að refsa hrekkjum á netinu. Að vísu er einhver hætta á því, þvert á móti, að vekja athygli þeirra á óvenjulegri hegðun tiltekins netþjóns. Einhver og markvissa DDoS árás á IP þinn. Hins vegar hafa engin slík tilfelli verið uppi enn sem komið er og tjaldstæði virka frábærlega.
Heimild: www.habr.com
