Жасыратыны жоқ, Интернет өте жауласатын орта. Серверді көтерген бойда ол бірден жаппай шабуылдарға және бірнеше сканерлеуге ұшырайды. Мысалы
Tarpit - кіріс қосылымдарын баяулату үшін қолданылатын қақпақ порты. Осы портқа үшінші тарап жүйесі қосылса, қосылымды жылдам жабу мүмкін болмайды. Ол өзінің жүйелік ресурстарын ысырап етіп, қосылым күту уақыты біткенше күтуге немесе оны қолмен тоқтатуға мәжбүр болады.
Көбінесе брезент қорғаныс үшін қолданылады. Техника алғаш рет компьютерлік құрттардан қорғау үшін жасалған. Енді оны қатарынан барлық IP мекенжайларын кең көлемде сканерлеумен айналысатын спам жіберушілер мен зерттеушілердің өмірін бұзу үшін пайдалануға болады (Хабредегі мысалдар:
Крис Веллонс есімді жүйелік әкімшілердің бірі бұл масқараны көруден шаршаған сияқты - және ол шағын бағдарлама жазды.
Утилитаны орнату:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Дұрыс орындалған тарпит сізге қарағанда шабуылдаушыдан көбірек ресурстарды алады. Бірақ бұл тіпті ресурстар мәселесі емес. Автор
Жұмыс режимінде Endlessh серверін бұзақылар жаппай ұратын кәдімгі 22 портқа орнату қажет. Стандартты қауіпсіздік ұсыныстары әрқашан SSH-ті басқа портқа жылжытуға кеңес береді, бұл журналдардың өлшемін шама ретімен бірден азайтады.
Крис Уэллонс оның бағдарламасы спецификацияның бір параграфын пайдаланады дейді SSH-
.
Endlessh бағдарламасы дәл осылай жасайды: ол жібереді шексіз кездейсоқ құрылған деректер ағыны, ол RFC 4253 сәйкес келеді, яғни аутентификациядан бұрын жібереді және әрбір жол келесіден басталады: SSH-
және жол соңындағы таңбаны қосқанда 255 таңбадан аспайды. Жалпы, барлығы стандартқа сай.
Әдепкі бойынша, бағдарлама пакеттерді жіберу арасында 10 секунд күтеді. Бұл клиенттің күту мерзімінің аяқталуын болдырмайды, сондықтан клиент мәңгілікке тұзаққа түседі.
Деректер криптография қолданбас бұрын жіберілетіндіктен, бағдарлама өте қарапайым. Ол ешқандай шифрларды енгізудің қажеті жоқ және бірнеше хаттамаларды қолдайды.
Автор утилитаның ең аз ресурстарды тұтынатынын және машинада мүлдем байқалмай жұмыс істейтінін қамтамасыз етуге тырысты. Заманауи антивирустар мен басқа «қауіпсіздік жүйелерінен» айырмашылығы, ол компьютерді баяулатпауы керек. Ол бағдарламалық жасақтаманы біршама айлакер енгізудің арқасында трафикті де, жадты тұтынуды да азайта алды. Егер ол жай ғана жаңа қосылымда бөлек процесті іске қосса, әлеуетті шабуылдаушылар құрылғыдағы ресурстарды пайдалану үшін бірнеше қосылымдарды ашу арқылы DDoS шабуылын бастауы мүмкін. Әр қосылымға бір ағын да ең жақсы нұсқа емес, себебі ядро ағындарды басқару үшін ресурстарды босқа жұмсайды.
Сондықтан Крис Уэллонс Endlessh үшін ең жеңіл опцияны таңдады: бір ағынды сервер poll(2)
, мұнда тұзақтағы клиенттер іс жүзінде ешқандай қосымша ресурстарды тұтынбайды, ядродағы ұяшық нысанын және Endlessh жүйесінде бақылау үшін тағы 78 байтты есептемегенде. Әрбір клиент үшін қабылдау және жіберу буферлерін бөлуді болдырмау үшін Endlessh тікелей кіру ұясын ашады және TCP/IP операциялық жүйесінің барлық дерлік стегін айналып өтіп, TCP пакеттерін тікелей аударады. Кіріс буфері мүлдем қажет емес, өйткені біз кіріс деректеріне қызығушылық танытпаймыз.
Бұл туралы автор өз бағдарламасы кезінде айтады
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 - желідегі бұзақыларды жазалаудың тамаша құралы. Рас, олардың назарын белгілі бір сервердің әдеттен тыс әрекетіне аударудың кейбір қаупі бар. Біреу
Хабтар:
Python, Ақпараттық қауіпсіздік, Бағдарламалық қамтамасыз ету, Жүйені басқару
Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Кіріс SSH қосылымдары үшін қақпақ (tarpit).
Жасыратыны жоқ, Интернет өте жауласатын орта. Серверді көтерген бойда ол бірден жаппай шабуылдарға және бірнеше сканерлеуге ұшырайды. Мысалы
Tarpit - кіріс қосылымдарын баяулату үшін қолданылатын қақпақ порты. Осы портқа үшінші тарап жүйесі қосылса, қосылымды жылдам жабу мүмкін болмайды. Ол өзінің жүйелік ресурстарын ысырап етіп, қосылым күту уақыты біткенше күтуге немесе оны қолмен тоқтатуға мәжбүр болады.
Көбінесе брезент қорғаныс үшін қолданылады. Техника алғаш рет компьютерлік құрттардан қорғау үшін жасалған. Енді оны қатарынан барлық IP мекенжайларын кең көлемде сканерлеумен айналысатын спам жіберушілер мен зерттеушілердің өмірін бұзу үшін пайдалануға болады (Хабредегі мысалдар:
Крис Веллонс есімді жүйелік әкімшілердің бірі бұл масқараны көруден шаршаған сияқты - және ол шағын бағдарлама жазды.
Утилитаны орнату:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Дұрыс орындалған тарпит сізге қарағанда шабуылдаушыдан көбірек ресурстарды алады. Бірақ бұл тіпті ресурстар мәселесі емес. Автор
Жұмыс режимінде Endlessh серверін бұзақылар жаппай ұратын кәдімгі 22 портқа орнату қажет. Стандартты қауіпсіздік ұсыныстары әрқашан SSH-ті басқа портқа жылжытуға кеңес береді, бұл журналдардың өлшемін шама ретімен бірден азайтады.
Крис Уэллонс оның бағдарламасы спецификацияның бір параграфын пайдаланады дейді SSH-
.
Endlessh бағдарламасы дәл осылай жасайды: ол жібереді шексіз кездейсоқ құрылған деректер ағыны, ол RFC 4253 сәйкес келеді, яғни аутентификациядан бұрын жібереді және әрбір жол келесіден басталады: SSH-
және жол соңындағы таңбаны қосқанда 255 таңбадан аспайды. Жалпы, барлығы стандартқа сай.
Әдепкі бойынша, бағдарлама пакеттерді жіберу арасында 10 секунд күтеді. Бұл клиенттің күту мерзімінің аяқталуын болдырмайды, сондықтан клиент мәңгілікке тұзаққа түседі.
Деректер криптография қолданбас бұрын жіберілетіндіктен, бағдарлама өте қарапайым. Ол ешқандай шифрларды енгізудің қажеті жоқ және бірнеше хаттамаларды қолдайды.
Автор утилитаның ең аз ресурстарды тұтынатынын және машинада мүлдем байқалмай жұмыс істейтінін қамтамасыз етуге тырысты. Заманауи антивирустар мен басқа «қауіпсіздік жүйелерінен» айырмашылығы, ол компьютерді баяулатпауы керек. Ол бағдарламалық жасақтаманы біршама айлакер енгізудің арқасында трафикті де, жадты тұтынуды да азайта алды. Егер ол жай ғана жаңа қосылымда бөлек процесті іске қосса, әлеуетті шабуылдаушылар құрылғыдағы ресурстарды пайдалану үшін бірнеше қосылымдарды ашу арқылы DDoS шабуылын бастауы мүмкін. Әр қосылымға бір ағын да ең жақсы нұсқа емес, себебі ядро ағындарды басқару үшін ресурстарды босқа жұмсайды.
Сондықтан Крис Уэллонс Endlessh үшін ең жеңіл опцияны таңдады: бір ағынды сервер poll(2)
, мұнда тұзақтағы клиенттер іс жүзінде ешқандай қосымша ресурстарды тұтынбайды, ядродағы ұяшық нысанын және Endlessh жүйесінде бақылау үшін тағы 78 байтты есептемегенде. Әрбір клиент үшін қабылдау және жіберу буферлерін бөлуді болдырмау үшін Endlessh тікелей кіру ұясын ашады және TCP/IP операциялық жүйесінің барлық дерлік стегін айналып өтіп, TCP пакеттерін тікелей аударады. Кіріс буфері мүлдем қажет емес, өйткені біз кіріс деректеріне қызығушылық танытпаймыз.
Бұл туралы автор өз бағдарламасы кезінде айтады
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 - желідегі бұзақыларды жазалаудың тамаша құралы. Рас, олардың назарын белгілі бір сервердің әдеттен тыс әрекетіне аударудың кейбір қаупі бар. Біреу
Ақпарат көзі: www.habr.com