Թակարդ (tarpit) մուտքային SSH միացումների համար

Գաղտնիք չէ, որ ինտերնետը շատ թշնամական միջավայր է։ Հենց որ դուք բարձրացնում եք սերվերը, այն անմիջապես ենթարկվում է զանգվածային հարձակումների և բազմաթիվ սկանավորման: Օրինակ Honeypot-ը անվտանգության աշխատակիցներից դուք կարող եք գնահատել այս աղբի տրաֆիկի մասշտաբները: Փաստորեն, միջին սերվերի վրա տրաֆիկի 99%-ը կարող է վնասակար լինել:

Tarpit-ը ծուղակ է, որն օգտագործվում է մուտքային կապերը դանդաղեցնելու համար: Եթե ​​երրորդ կողմի համակարգը միանա այս պորտին, դուք չեք կարողանա արագ փակել կապը: Նա պետք է վատնի իր համակարգի ռեսուրսները և սպասի մինչև կապի ժամանակի վերջանալը կամ ձեռքով դադարեցնի այն:

Ամենից հաճախ բրեզենտները օգտագործվում են պաշտպանության համար: Տեխնիկան առաջին անգամ մշակվել է համակարգչային որդերից պաշտպանվելու համար: Եվ այժմ այն ​​կարող է օգտագործվել սպամերի և հետազոտողների կյանքը փչացնելու համար, ովքեր զբաղվում են անընդմեջ բոլոր IP հասցեների լայնածավալ սկանավորմամբ (օրինակներ Habré-ում. Австрия, Ուկրաինա).

Քրիս Ուելոնս անունով համակարգի ադմինիստրատորներից մեկը, ըստ երևույթին, հոգնել է այս խայտառակությունը դիտելուց, և նա գրել է մի փոքրիկ ծրագիր Անվերջ, tarpit SSH-ի համար, որը դանդաղեցնում է մուտքային կապերը։ Ծրագիրը բացում է պորտ (թեստավորման լռելյայն պորտը 2222-ն է) և ձևացնում է որպես SSH սերվեր, բայց իրականում այն ​​անվերջ կապ է հաստատում մուտքային հաճախորդի հետ, քանի դեռ նա չի հրաժարվել։ Սա կարող է շարունակվել մի քանի օր կամ ավելի, մինչև հաճախորդը ընկնի:

Կոմունալ ծառայության տեղադրում.

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

Պատշաճ կերպով իրականացված tarpit-ը հարձակվողից ավելի շատ ռեսուրսներ կխլի, քան ձեզանից: Բայց դա նույնիսկ ռեսուրսների խնդիր չէ: Հեղինակ գրումոր ծրագիրը կախվածություն է առաջացնում: Հենց այս պահին այն ունի 27 հաճախորդ, որոնցից ոմանք միացված են շաբաթներով: Ակտիվության գագաթնակետին 1378 հաճախորդներ մնացել են 20 ժամ թակարդում:

Գործառնական ռեժիմում Endlessh սերվերը պետք է տեղադրվի սովորական 22 պորտի վրա, որտեղ խուլիգանները զանգվածաբար թակում են: Անվտանգության ստանդարտ առաջարկությունները միշտ խորհուրդ են տալիս SSH-ը տեղափոխել այլ նավահանգիստ, որն անմիջապես նվազեցնում է տեղեկամատյանների չափը մեծության կարգով:

Քրիս Ուելոնսն ասում է, որ իր ծրագիրը օգտագործում է ճշգրտման մեկ պարբերությունը RFC 4253 SSH արձանագրությանը: TCP կապի հաստատումից անմիջապես հետո, բայց նախքան ծածկագրման կիրառումը, երկու կողմերը պետք է ուղարկեն նույնականացման տող: Եվ կա նաև նշում. «Սերվերը ԿԱՐՈՂ Է ուղարկել տվյալների այլ տողեր՝ նախքան տարբերակի տող ուղարկելը». Եվ ոչ մի սահման այս տվյալների ծավալի վրա, դուք պարզապես պետք է սկսեք յուրաքանչյուր տողով SSH-.

Սա հենց այն է, ինչ անում է Endlessh ծրագիրը ուղարկում է անվերջ պատահականորեն ստեղծված տվյալների հոսք, որոնք համապատասխանում են RFC 4253-ին, այսինքն՝ ուղարկում են մինչև իսկությունը, և յուրաքանչյուր տող սկսվում է SSH- և չի գերազանցում 255 նիշը, ներառյալ տողերի վերջավորության նիշը: Ընդհանուր առմամբ, ամեն ինչ ստանդարտի համաձայն է:

Լռելյայնորեն, ծրագիրը սպասում է 10 վայրկյան փաթեթներ ուղարկելու միջև: Սա թույլ չի տալիս հաճախորդին ժամանակավորել, ուստի հաճախորդը ընդմիշտ կմնա թակարդում:

Քանի որ տվյալները ուղարկվում են նախքան ծածկագրման կիրառումը, ծրագիրը չափազանց պարզ է: Այն կարիք չունի որևէ գաղտնագրման ներդրման և աջակցում է բազմաթիվ արձանագրությունների:

Հեղինակը փորձել է ապահովել, որ կոմունալը սպառում է նվազագույն ռեսուրսներ և ամբողջովին աննկատ աշխատում է մեքենայի վրա: Ի տարբերություն ժամանակակից հակավիրուսների և այլ «անվտանգության համակարգերի», այն չպետք է դանդաղեցնի ձեր համակարգիչը: Նրան հաջողվել է նվազագույնի հասցնել ինչպես երթևեկությունը, այնպես էլ հիշողության սպառումը մի փոքր ավելի խորամանկ ծրագրային ապահովման ներդրման շնորհիվ: Եթե ​​այն պարզապես գործարկի առանձին գործընթաց նոր կապի վրա, ապա պոտենցիալ հարձակվողները կարող են DDoS հարձակում սկսել՝ բացելով բազմաթիվ կապեր՝ սարքի ռեսուրսները սպառելու համար: Մեկ կապի համար մեկ շարանը նույնպես լավագույն տարբերակը չէ, քանի որ միջուկը կվատնի ռեսուրսները՝ կառավարելով թելերը:

Ահա թե ինչու Քրիս Ուելոնսն ընտրեց ամենաթեթև տարբերակը Endlessh-ի համար՝ մեկ թելերով սերվեր: poll(2), որտեղ ծուղակում գտնվող հաճախորդները գործնականում չեն սպառում լրացուցիչ ռեսուրսներ՝ չհաշված միջուկի վարդակից օբյեկտը և ևս 78 բայթ՝ Endlessh-ում հետևելու համար։ Յուրաքանչյուր հաճախորդի համար ստանալու և ուղարկելու բուֆերներ հատկացնելու անհրաժեշտությունից խուսափելու համար Endlessh-ը բացում է ուղղակի մուտքի վարդակ և ուղղակիորեն թարգմանում է TCP փաթեթները՝ շրջանցելով գրեթե ողջ օպերացիոն համակարգի TCP/IP փաթեթը: Մուտքային բուֆերն ընդհանրապես պետք չէ, քանի որ մեզ չեն հետաքրքրում մուտքային տվյալները։

Հեղինակն ասում է, որ իր հաղորդման ժամանակ չգիտեր Python-ի asycio-ի և այլ tarpits-ի գոյության մասին։ Եթե ​​նա իմանար asycio-ի մասին, նա կարող էր իրականացնել իր օգտակար ծրագիրը Python-ում ընդամենը 18 տողում.

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-ն իդեալական է թրթուրներ գրելու համար: Օրինակ, այս կեռիկը կսառեցնի Firefox-ը, Chrome-ը կամ ցանկացած այլ հաճախորդ, որը փորձում է միանալ ձեր HTTP սերվերին շատ ժամերով.

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-ը հիանալի գործիք է առցանց կռվարարներին պատժելու համար: Ճիշտ է, կա որոշակի ռիսկ, ընդհակառակը, նրանց ուշադրությունը հրավիրելու որոշակի սերվերի անսովոր պահվածքի վրա: Ինչ-որ մեկը կարող է մտածել վրեժի մասին և նպատակային DDoS հարձակում ձեր IP-ի վրա: Սակայն մինչ այժմ նման դեպքեր չեն եղել, իսկ բրեզենտները հիանալի են աշխատում։

Հանգույցներ:
Python, Տեղեկատվական անվտանգություն, Ծրագրեր, Համակարգի կառավարում

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Թակարդ (tarpit) մուտքային SSH միացումների համար

Գաղտնիք չէ, որ ինտերնետը շատ թշնամական միջավայր է։ Հենց որ դուք բարձրացնում եք սերվերը, այն անմիջապես ենթարկվում է զանգվածային հարձակումների և բազմաթիվ սկանավորման: Օրինակ Honeypot-ը անվտանգության աշխատակիցներից դուք կարող եք գնահատել այս աղբի տրաֆիկի մասշտաբները: Փաստորեն, միջին սերվերի վրա տրաֆիկի 99%-ը կարող է վնասակար լինել:

Tarpit-ը ծուղակ է, որն օգտագործվում է մուտքային կապերը դանդաղեցնելու համար: Եթե ​​երրորդ կողմի համակարգը միանա այս պորտին, դուք չեք կարողանա արագ փակել կապը: Նա պետք է վատնի իր համակարգի ռեսուրսները և սպասի մինչև կապի ժամանակի վերջանալը կամ ձեռքով դադարեցնի այն:

Ամենից հաճախ բրեզենտները օգտագործվում են պաշտպանության համար: Տեխնիկան առաջին անգամ մշակվել է համակարգչային որդերից պաշտպանվելու համար: Եվ այժմ այն ​​կարող է օգտագործվել սպամերի և հետազոտողների կյանքը փչացնելու համար, ովքեր զբաղվում են անընդմեջ բոլոր IP հասցեների լայնածավալ սկանավորմամբ (օրինակներ Habré-ում. Австрия, Ուկրաինա).

Քրիս Ուելոնս անունով համակարգի ադմինիստրատորներից մեկը, ըստ երևույթին, հոգնել է այս խայտառակությունը դիտելուց, և նա գրել է մի փոքրիկ ծրագիր Անվերջ, tarpit SSH-ի համար, որը դանդաղեցնում է մուտքային կապերը։ Ծրագիրը բացում է պորտ (թեստավորման լռելյայն պորտը 2222-ն է) և ձևացնում է որպես SSH սերվեր, բայց իրականում այն ​​անվերջ կապ է հաստատում մուտքային հաճախորդի հետ, քանի դեռ նա չի հրաժարվել։ Սա կարող է շարունակվել մի քանի օր կամ ավելի, մինչև հաճախորդը ընկնի:

Կոմունալ ծառայության տեղադրում.

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

Պատշաճ կերպով իրականացված tarpit-ը հարձակվողից ավելի շատ ռեսուրսներ կխլի, քան ձեզանից: Բայց դա նույնիսկ ռեսուրսների խնդիր չէ: Հեղինակ գրումոր ծրագիրը կախվածություն է առաջացնում: Հենց այս պահին այն ունի 27 հաճախորդ, որոնցից ոմանք միացված են շաբաթներով: Ակտիվության գագաթնակետին 1378 հաճախորդներ մնացել են 20 ժամ թակարդում:

Գործառնական ռեժիմում Endlessh սերվերը պետք է տեղադրվի սովորական 22 պորտի վրա, որտեղ խուլիգանները զանգվածաբար թակում են: Անվտանգության ստանդարտ առաջարկությունները միշտ խորհուրդ են տալիս SSH-ը տեղափոխել այլ նավահանգիստ, որն անմիջապես նվազեցնում է տեղեկամատյանների չափը մեծության կարգով:

Քրիս Ուելոնսն ասում է, որ իր ծրագիրը օգտագործում է ճշգրտման մեկ պարբերությունը RFC 4253 SSH արձանագրությանը: TCP կապի հաստատումից անմիջապես հետո, բայց նախքան ծածկագրման կիրառումը, երկու կողմերը պետք է ուղարկեն նույնականացման տող: Եվ կա նաև նշում. «Սերվերը ԿԱՐՈՂ Է ուղարկել տվյալների այլ տողեր՝ նախքան տարբերակի տող ուղարկելը». Եվ ոչ մի սահման այս տվյալների ծավալի վրա, դուք պարզապես պետք է սկսեք յուրաքանչյուր տողով SSH-.

Սա հենց այն է, ինչ անում է Endlessh ծրագիրը ուղարկում է անվերջ պատահականորեն ստեղծված տվյալների հոսք, որոնք համապատասխանում են RFC 4253-ին, այսինքն՝ ուղարկում են մինչև իսկությունը, և յուրաքանչյուր տող սկսվում է SSH- և չի գերազանցում 255 նիշը, ներառյալ տողերի վերջավորության նիշը: Ընդհանուր առմամբ, ամեն ինչ ստանդարտի համաձայն է:

Լռելյայնորեն, ծրագիրը սպասում է 10 վայրկյան փաթեթներ ուղարկելու միջև: Սա թույլ չի տալիս հաճախորդին ժամանակավորել, ուստի հաճախորդը ընդմիշտ կմնա թակարդում:

Քանի որ տվյալները ուղարկվում են նախքան ծածկագրման կիրառումը, ծրագիրը չափազանց պարզ է: Այն կարիք չունի որևէ գաղտնագրման ներդրման և աջակցում է բազմաթիվ արձանագրությունների:

Հեղինակը փորձել է ապահովել, որ կոմունալը սպառում է նվազագույն ռեսուրսներ և ամբողջովին աննկատ աշխատում է մեքենայի վրա: Ի տարբերություն ժամանակակից հակավիրուսների և այլ «անվտանգության համակարգերի», այն չպետք է դանդաղեցնի ձեր համակարգիչը: Նրան հաջողվել է նվազագույնի հասցնել ինչպես երթևեկությունը, այնպես էլ հիշողության սպառումը մի փոքր ավելի խորամանկ ծրագրային ապահովման ներդրման շնորհիվ: Եթե ​​այն պարզապես գործարկի առանձին գործընթաց նոր կապի վրա, ապա պոտենցիալ հարձակվողները կարող են DDoS հարձակում սկսել՝ բացելով բազմաթիվ կապեր՝ սարքի ռեսուրսները սպառելու համար: Մեկ կապի համար մեկ շարանը նույնպես լավագույն տարբերակը չէ, քանի որ միջուկը կվատնի ռեսուրսները՝ կառավարելով թելերը:

Ահա թե ինչու Քրիս Ուելոնսն ընտրեց ամենաթեթև տարբերակը Endlessh-ի համար՝ մեկ թելերով սերվեր: poll(2), որտեղ ծուղակում գտնվող հաճախորդները գործնականում չեն սպառում լրացուցիչ ռեսուրսներ՝ չհաշված միջուկի վարդակից օբյեկտը և ևս 78 բայթ՝ Endlessh-ում հետևելու համար։ Յուրաքանչյուր հաճախորդի համար ստանալու և ուղարկելու բուֆերներ հատկացնելու անհրաժեշտությունից խուսափելու համար Endlessh-ը բացում է ուղղակի մուտքի վարդակ և ուղղակիորեն թարգմանում է TCP փաթեթները՝ շրջանցելով գրեթե ողջ օպերացիոն համակարգի TCP/IP փաթեթը: Մուտքային բուֆերն ընդհանրապես պետք չէ, քանի որ մեզ չեն հետաքրքրում մուտքային տվյալները։

Հեղինակն ասում է, որ իր հաղորդման ժամանակ չգիտեր Python-ի asycio-ի և այլ tarpits-ի գոյության մասին։ Եթե ​​նա իմանար asycio-ի մասին, նա կարող էր իրականացնել իր օգտակար ծրագիրը Python-ում ընդամենը 18 տողում.

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-ն իդեալական է թրթուրներ գրելու համար: Օրինակ, այս կեռիկը կսառեցնի Firefox-ը, Chrome-ը կամ ցանկացած այլ հաճախորդ, որը փորձում է միանալ ձեր HTTP սերվերին շատ ժամերով.

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-ը հիանալի գործիք է առցանց կռվարարներին պատժելու համար: Ճիշտ է, կա որոշակի ռիսկ, ընդհակառակը, նրանց ուշադրությունը հրավիրելու որոշակի սերվերի անսովոր պահվածքի վրա: Ինչ-որ մեկը կարող է մտածել վրեժի մասին և նպատակային DDoS հարձակում ձեր IP-ի վրա: Սակայն մինչ այժմ նման դեպքեր չեն եղել, իսկ բրեզենտները հիանալի են աշխատում։

Թակարդ (tarpit) մուտքային SSH միացումների համար

Source: www.habr.com

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