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 hunangspotti frá öryggisvörðum þú 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é: Austurríki, Úkraína).

Einn kerfisstjóranna að nafni Chris Wellons varð greinilega þreyttur á að horfa á þessa svívirðingu - og hann skrifaði lítið forrit Endalaus, 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 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 пишет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 RFC 4253 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 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 vissi ekki 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 gæti hugsað um hefnd 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 hunangspotti frá öryggisvörðum þú 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é: Austurríki, Úkraína).

Einn kerfisstjóranna að nafni Chris Wellons varð greinilega þreyttur á að horfa á þessa svívirðingu - og hann skrifaði lítið forrit Endalaus, 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 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 пишет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 RFC 4253 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 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 vissi ekki 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 gæti hugsað um hefnd 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.

Gilda (tarpit) fyrir komandi SSH tengingar

Heimild: www.habr.com

Bæta við athugasemd