Не сакрэт, што інтэрнэт - вельмі варожае асяроддзе. Як толькі вы паднімаеце сервер, ён імгненна падвяргаецца масіраваным нападам і множным сканаванням. На прыкладзе
Tarpit - гэта порт-пастка, які выкарыстоўваецца для запаволення ўваходзяць злучэнняў. Калі іншая сістэма падлучаецца да гэтага порта, то хутка зачыніць злучэнне не атрымаецца. Ёй давядзецца марнаваць свае сістэмныя рэсурсы і чакаць, пакуль злучэнне не перарвецца па таймаўце, або ўручную разрываць яго.
Часцей за ўсё тарпіты ўжываюць для абароны. Тэхніку ўпершыню распрацавалі для абароны ад камп'ютарных чарвякоў. А цяпер яе можна выкарыстоўваць, каб сапсаваць жыццё спамерам і даследнікам, якія займаюцца шырокім сканаваннем усіх IP-адрасоў запар (прыклады на Хабре:
Аднаму з сісадмінаў па імені Крыс Велонс, мабыць, надакучыла назіраць за гэтым бязладдзем - і ён напісаў маленькую праграмку
Устаноўка ўтыліты:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Правільна рэалізаваны тарпіт адбярэ ў зламысніка больш рэсурсаў, чым у вас. Але справа нават не ў рэсурсах. Аўтар
У працоўным рэжыме сервер Endlessh трэба ставіць на звычайны порт 22, куды масава стукаюцца хуліганы. Стандартныя рэкамендацыі па бяспецы заўсёды раяць перамясціць SSH на іншы порт, што адразу на парадак скарачае памер логаў.
Крыс Велонс кажа, што яго праграма эксплуатуе адзін абзац са спецыфікацыі. SSH-
.
Менавіта гэтым займаецца праграма Endlessh: яна адпраўляе бясконцы паток выпадкова згенераваных дадзеных, якія адпавядаюць RFC 4253, гэта значыць адпраўка перад ідэнтыфікацыяй, а кожны радок пачынаецца з SSH-
і не перавышае 255 сімвалаў, уключаючы сімвал заканчэння радка. Увогуле, усё па стандарце.
Па змаўчанні праграма чакае 10 секунд паміж адпраўкамі пакетаў. Гэта прадухіляе адключэнне па таймаўце, так што кліент будзе сядзець у пастцы вечна.
Паколькі адпраўка дадзеных ажыццяўляецца да прымянення крыптаграфіі, праграма выключна простая. У ёй не трэба ўкараняць ніякіх шыфраў і падтрымку мноства пратаколаў.
Аўтар пастараўся, каб утыліта спажывала мінімум рэсурсаў і працавала абсалютна незаўважна на машыне. У адрозненне ад сучасных антывірусаў і іншых "сістэм бяспекі", яна не павінна тармазіць кампутар. Яму ўдалося мінімізаваць і трафік, і спажыванне памяці за кошт крыху больш хітрай праграмнай рэалізацыі. Калі б ён проста запускаў асобны працэс на новае злучэнне, то патэнцыйныя зламыснікі маглі б правесці DDoS-напад, адкрыўшы мноства злучэнняў для вычарпання рэсурсаў на машыне. Па адным патоку на злучэнне - таксама не лепшы варыянт, таму што ядро будзе марнаваць рэсурсы на кіраванне патокамі.
Таму Крыс Велонс абраў для Endlessh самы легкаважны варыянт: аднаструменны сервер. poll(2)
, дзе кліенты ў пастцы практычна не спажываюць лішніх рэсурсаў, акрамя аб'екта сокета ў ядры і яшчэ 78 байт для адсочвання ў Endlessh. Каб не вылучаць буферы атрымання і адпраўкі для кожнага кліента, Endlessh адчыняе сокет прамога доступу і напроста транслюе пакеты TCP, ігнаруючы амаль увесь стэк TCP/IP аперацыйнай сістэмы. Уваходны буфер наогул не патрэбен, таму што ўваходныя дадзеныя нас не цікавяць.
Аўтар кажа, што на момант сваёй праграмы
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())
Тарпіт - выдатны інструмент для пакарання інтэрнэт-хуліганаў. Праўда, ёсць некаторая рызыка, наадварот, прыцягнуць іх увагу да незвычайных паводзін канкрэтнага сервера. Хтосьці
Хабы:
Python, Інфармацыйная бяспека, Софт, Сістэмнае адміністраванне
Пазнакі:
SSH, Endlessh, tarpit, тарпіт, пастка, asycio
Пастка (тарпіт) для ўваходных SSH-злучэнняў
Не сакрэт, што інтэрнэт - вельмі варожае асяроддзе. Як толькі вы паднімаеце сервер, ён імгненна падвяргаецца масіраваным нападам і множным сканаванням. На прыкладзе
Tarpit - гэта порт-пастка, які выкарыстоўваецца для запаволення ўваходзяць злучэнняў. Калі іншая сістэма падлучаецца да гэтага порта, то хутка зачыніць злучэнне не атрымаецца. Ёй давядзецца марнаваць свае сістэмныя рэсурсы і чакаць, пакуль злучэнне не перарвецца па таймаўце, або ўручную разрываць яго.
Часцей за ўсё тарпіты ўжываюць для абароны. Тэхніку ўпершыню распрацавалі для абароны ад камп'ютарных чарвякоў. А цяпер яе можна выкарыстоўваць, каб сапсаваць жыццё спамерам і даследнікам, якія займаюцца шырокім сканаваннем усіх IP-адрасоў запар (прыклады на Хабре:
Аднаму з сісадмінаў па імені Крыс Велонс, мабыць, надакучыла назіраць за гэтым бязладдзем - і ён напісаў маленькую праграмку
Устаноўка ўтыліты:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Правільна рэалізаваны тарпіт адбярэ ў зламысніка больш рэсурсаў, чым у вас. Але справа нават не ў рэсурсах. Аўтар
У працоўным рэжыме сервер Endlessh трэба ставіць на звычайны порт 22, куды масава стукаюцца хуліганы. Стандартныя рэкамендацыі па бяспецы заўсёды раяць перамясціць SSH на іншы порт, што адразу на парадак скарачае памер логаў.
Крыс Велонс кажа, што яго праграма эксплуатуе адзін абзац са спецыфікацыі. SSH-
.
Менавіта гэтым займаецца праграма Endlessh: яна адпраўляе бясконцы паток выпадкова згенераваных дадзеных, якія адпавядаюць RFC 4253, гэта значыць адпраўка перад ідэнтыфікацыяй, а кожны радок пачынаецца з SSH-
і не перавышае 255 сімвалаў, уключаючы сімвал заканчэння радка. Увогуле, усё па стандарце.
Па змаўчанні праграма чакае 10 секунд паміж адпраўкамі пакетаў. Гэта прадухіляе адключэнне па таймаўце, так што кліент будзе сядзець у пастцы вечна.
Паколькі адпраўка дадзеных ажыццяўляецца да прымянення крыптаграфіі, праграма выключна простая. У ёй не трэба ўкараняць ніякіх шыфраў і падтрымку мноства пратаколаў.
Аўтар пастараўся, каб утыліта спажывала мінімум рэсурсаў і працавала абсалютна незаўважна на машыне. У адрозненне ад сучасных антывірусаў і іншых "сістэм бяспекі", яна не павінна тармазіць кампутар. Яму ўдалося мінімізаваць і трафік, і спажыванне памяці за кошт крыху больш хітрай праграмнай рэалізацыі. Калі б ён проста запускаў асобны працэс на новае злучэнне, то патэнцыйныя зламыснікі маглі б правесці DDoS-напад, адкрыўшы мноства злучэнняў для вычарпання рэсурсаў на машыне. Па адным патоку на злучэнне - таксама не лепшы варыянт, таму што ядро будзе марнаваць рэсурсы на кіраванне патокамі.
Таму Крыс Велонс абраў для Endlessh самы легкаважны варыянт: аднаструменны сервер. poll(2)
, дзе кліенты ў пастцы практычна не спажываюць лішніх рэсурсаў, акрамя аб'екта сокета ў ядры і яшчэ 78 байт для адсочвання ў Endlessh. Каб не вылучаць буферы атрымання і адпраўкі для кожнага кліента, Endlessh адчыняе сокет прамога доступу і напроста транслюе пакеты TCP, ігнаруючы амаль увесь стэк TCP/IP аперацыйнай сістэмы. Уваходны буфер наогул не патрэбен, таму што ўваходныя дадзеныя нас не цікавяць.
Аўтар кажа, што на момант сваёй праграмы
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())
Тарпіт - выдатны інструмент для пакарання інтэрнэт-хуліганаў. Праўда, ёсць некаторая рызыка, наадварот, прыцягнуць іх увагу да незвычайных паводзін канкрэтнага сервера. Хтосьці
Крыніца: habr.com