Пастка (тарпіт) для ўваходных SSH-злучэнняў

Не сакрэт, што інтэрнэт - вельмі варожае асяроддзе. Як толькі вы паднімаеце сервер, ён імгненна падвяргаецца масіраваным нападам і множным сканаванням. На прыкладзе ханіпоту ад бяспечнікаў можна ацаніць маштаб гэтага смеццевага трафіку. Фактычна, на сярэднім сэрвэры 99% трафіку можа быць шкоднасным.

Tarpit - гэта порт-пастка, які выкарыстоўваецца для запаволення ўваходзяць злучэнняў. Калі іншая сістэма падлучаецца да гэтага порта, то хутка зачыніць злучэнне не атрымаецца. Ёй давядзецца марнаваць свае сістэмныя рэсурсы і чакаць, пакуль злучэнне не перарвецца па таймаўце, або ўручную разрываць яго.

Часцей за ўсё тарпіты ўжываюць для абароны. Тэхніку ўпершыню распрацавалі для абароны ад камп'ютарных чарвякоў. А цяпер яе можна выкарыстоўваць, каб сапсаваць жыццё спамерам і даследнікам, якія займаюцца шырокім сканаваннем усіх IP-адрасоў запар (прыклады на Хабре: Аўстрыя, Украіна).

Аднаму з сісадмінаў па імені Крыс Велонс, мабыць, надакучыла назіраць за гэтым бязладдзем - і ён напісаў маленькую праграмку Endlessh, тарпіць для SSH, які запавольвае ўваходныя злучэнні. Праграма адчыняе порт (па змаўчанні для тэставання паказаны порт 2222) і прыкідваецца SSH-серверам, а насамрэч усталёўвае бясконцае злучэнне з уваходным кліентам, пакуль той не здасца. Гэта можа працягвацца некалькі дзён ці больш, пакуль кліент не адваліцца.

Устаноўка ўтыліты:

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

Правільна рэалізаваны тарпіт адбярэ ў зламысніка больш рэсурсаў, чым у вас. Але справа нават не ў рэсурсах. Аўтар піша, Што праграма выклікае прывыканне. Прама зараз у яго пастцы 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 аперацыйнай сістэмы. Уваходны буфер наогул не патрэбен, таму што ўваходныя дадзеныя нас не цікавяць.

Аўтар кажа, што на момант сваёй праграмы не ведаў аб існаванні пітонаўскага asycio і іншых тарпітаў. Калі б ён ведаў пра asycio, то сваю ўтыліту мог бы рэалізаваць усяго ў 18-ці радках на 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 ідэальна падыходзіць для напісання тарпітаў. Напрыклад, такая пастка на шмат гадзін падвесіць 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())

Тарпіт - выдатны інструмент для пакарання інтэрнэт-хуліганаў. Праўда, ёсць некаторая рызыка, наадварот, прыцягнуць іх увагу да незвычайных паводзін канкрэтнага сервера. Хтосьці можа падумаць аб помсце і нацэленай DDoS-нападу на ваш IP. Зрэшты, пакуль такіх выпадкаў не было, і тарпіты выдатна працуюць.

Хабы:
Python, Інфармацыйная бяспека, Софт, Сістэмнае адміністраванне

Пазнакі:
SSH, Endlessh, tarpit, тарпіт, пастка, asycio
Пастка (тарпіт) для ўваходных SSH-злучэнняў

Не сакрэт, што інтэрнэт - вельмі варожае асяроддзе. Як толькі вы паднімаеце сервер, ён імгненна падвяргаецца масіраваным нападам і множным сканаванням. На прыкладзе ханіпоту ад бяспечнікаў можна ацаніць маштаб гэтага смеццевага трафіку. Фактычна, на сярэднім сэрвэры 99% трафіку можа быць шкоднасным.

Tarpit - гэта порт-пастка, які выкарыстоўваецца для запаволення ўваходзяць злучэнняў. Калі іншая сістэма падлучаецца да гэтага порта, то хутка зачыніць злучэнне не атрымаецца. Ёй давядзецца марнаваць свае сістэмныя рэсурсы і чакаць, пакуль злучэнне не перарвецца па таймаўце, або ўручную разрываць яго.

Часцей за ўсё тарпіты ўжываюць для абароны. Тэхніку ўпершыню распрацавалі для абароны ад камп'ютарных чарвякоў. А цяпер яе можна выкарыстоўваць, каб сапсаваць жыццё спамерам і даследнікам, якія займаюцца шырокім сканаваннем усіх IP-адрасоў запар (прыклады на Хабре: Аўстрыя, Украіна).

Аднаму з сісадмінаў па імені Крыс Велонс, мабыць, надакучыла назіраць за гэтым бязладдзем - і ён напісаў маленькую праграмку Endlessh, тарпіць для SSH, які запавольвае ўваходныя злучэнні. Праграма адчыняе порт (па змаўчанні для тэставання паказаны порт 2222) і прыкідваецца SSH-серверам, а насамрэч усталёўвае бясконцае злучэнне з уваходным кліентам, пакуль той не здасца. Гэта можа працягвацца некалькі дзён ці больш, пакуль кліент не адваліцца.

Устаноўка ўтыліты:

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

Правільна рэалізаваны тарпіт адбярэ ў зламысніка больш рэсурсаў, чым у вас. Але справа нават не ў рэсурсах. Аўтар піша, Што праграма выклікае прывыканне. Прама зараз у яго пастцы 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 аперацыйнай сістэмы. Уваходны буфер наогул не патрэбен, таму што ўваходныя дадзеныя нас не цікавяць.

Аўтар кажа, што на момант сваёй праграмы не ведаў аб існаванні пітонаўскага asycio і іншых тарпітаў. Калі б ён ведаў пра asycio, то сваю ўтыліту мог бы рэалізаваць усяго ў 18-ці радках на 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 ідэальна падыходзіць для напісання тарпітаў. Напрыклад, такая пастка на шмат гадзін падвесіць 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())

Тарпіт - выдатны інструмент для пакарання інтэрнэт-хуліганаў. Праўда, ёсць некаторая рызыка, наадварот, прыцягнуць іх увагу да незвычайных паводзін канкрэтнага сервера. Хтосьці можа падумаць аб помсце і нацэленай DDoS-нападу на ваш IP. Зрэшты, пакуль такіх выпадкаў не было, і тарпіты выдатна працуюць.

Пастка (тарпіт) для ўваходных SSH-злучэнняў

Крыніца: habr.com

Дадаць каментар