Þ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
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
Uppsetning tólsins:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Ré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
Í 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 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 viðskiptavinirnir í gildrunni neyta nánast engra aukaauðlinda, ótalinn socket hluturinn í kjarnanum og önnur 78 bæti til að rekja í Endlessh. Til að forðast að þurfa að úthluta móttöku og senda biðminni fyrir hvern viðskiptavin, opnar Endlessh beinan aðgangsstöng og þýðir TCP pakka beint og framhjá næstum öllum TCP/IP stafla stýrikerfisins. Komandi biðminni er alls ekki þörf, vegna þess að við höfum ekki áhuga á komandi gögnum.
Höfundur segir að á þeim tíma sem dagskrá hans
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
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
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
Uppsetning tólsins:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Ré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
Í 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 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 viðskiptavinirnir í gildrunni neyta nánast engra aukaauðlinda, ótalinn socket hluturinn í kjarnanum og önnur 78 bæti til að rekja í Endlessh. Til að forðast að þurfa að úthluta móttöku og senda biðminni fyrir hvern viðskiptavin, opnar Endlessh beinan aðgangsstöng og þýðir TCP pakka beint og framhjá næstum öllum TCP/IP stafla stýrikerfisins. Komandi biðminni er alls ekki þörf, vegna þess að við höfum ekki áhuga á komandi gögnum.
Höfundur segir að á þeim tíma sem dagskrá hans
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
Heimild: www.habr.com