Kaptilo (Tarpit) por envenantaj SSH-konektoj

Ne estas sekreto, ke Interreto estas tre malamika medio. Tuj kiam vi levas servilon, ĝi estas tuj submetita al amasaj atakoj kaj multoblaj skanadoj. Ekzemple mielpoto de sekurecaj gardistoj vi povas taksi la skalon de ĉi tiu rubotrafiko. Fakte, sur la averaĝa servilo, 99% de trafiko povas esti malica.

Tarpit estas kaptilhaveno uzata por malrapidigi envenantajn konektojn. Se triaparta sistemo konektas al ĉi tiu haveno, vi ne povos rapide fermi la konekton. Ŝi devos malŝpari siajn sistemajn rimedojn kaj atendi ĝis la konekto-tempiĝo, aŭ permane ĉesigi ĝin.

Plej ofte, tarpits estas uzataj por protekto. La tekniko unue estis evoluigita por protekti kontraŭ komputilvermoj. Kaj nun ĝi povas esti uzata por ruinigi la vivojn de spamistoj kaj esploristoj, kiuj okupiĝas pri larĝa skanado de ĉiuj IP-adresoj en vico (ekzemploj pri Habré: Aŭstrio, Ukrainio).

Unu el la sistemadministrantoj nomita Chris Wellons ŝajne laciĝis rigardi ĉi tiun malhonorigon - kaj li skribis malgrandan programon. Senfina, tarpito por SSH kiu bremsas alvenantajn konektojn. La programo malfermas havenon (la defaŭlta haveno por testado estas 2222) kaj ŝajnigas esti SSH-servilo, sed fakte ĝi establas senfinan ligon kun la envenanta kliento ĝis ĝi rezignas. Ĉi tio povas daŭri plurajn tagojn aŭ pli ĝis la kliento defalas.

Instalado de la utileco:

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

Taŭge efektivigita tarpit prenos pli da rimedoj de la atakanto ol de vi. Sed eĉ ne temas pri rimedoj. Aŭtoro li skribaske la programo estas dependiga. Ĝuste nun ĝi havas 27 klientojn kaptitaj, kelkaj el ili konektitaj dum semajnoj. Ĉe la pinto de agado, 1378 klientoj estis kaptitaj dum 20 horoj!

En funkcia reĝimo, la servilo Endlessh devas esti instalita sur la kutima haveno 22, kie huliganoj amase frapas. Normaj sekurecrekomendoj ĉiam konsilas movi SSH al malsama haveno, kiu tuj reduktas la grandecon de la ŝtipoj per ordo de grandeco.

Chris Wellons diras, ke lia programo ekspluatas unu alineon de la specifo RFC 4253 al la SSH-protokolo. Tuj post kiam TCP-konekto estas establita, sed antaŭ ol kriptografio estas aplikata, ambaŭ partioj devas sendi identigan ĉenon. Kaj estas ankaŭ noto: "La servilo POVAS sendi aliajn vicojn da datumoj antaŭ sendi la version vicon". Kaj neniu limo pri la volumo de ĉi tiuj datumoj, vi nur bezonas komenci ĉiun linion per SSH-.

Ĝuste tion faras la programo Endlessh: ĝi sendas malfinia fluo de hazarde generitaj datumoj, kiuj konformas al RFC 4253, tio estas, sendu antaŭ aŭtentigo, kaj ĉiu linio komenciĝas per SSH- kaj ne superas 255 signojn, inkluzive de la linifina signo. Ĝenerale ĉio estas laŭ la normo.

Defaŭlte, la programo atendas 10 sekundojn inter sendado de pakaĵoj. Ĉi tio malhelpas, ke la kliento estos elĉerpita, do la kliento estos kaptita por ĉiam.

Ĉar la datumoj estas senditaj antaŭ ol kriptografio estas aplikata, la programo estas ekstreme simpla. Ĝi ne bezonas efektivigi ajnajn ĉifrojn kaj subtenas plurajn protokolojn.

La aŭtoro provis certigi, ke la utileco konsumas minimumon da rimedoj kaj funkcias tute nerimarkite sur la maŝino. Male al modernaj antivirusoj kaj aliaj "sekurecaj sistemoj", ĝi ne devus malrapidigi vian komputilon. Li sukcesis minimumigi kaj trafikon kaj memorkonsumon pro iomete pli ruza programaro efektivigo. Se ĝi simple lanĉus apartan procezon sur nova konekto, tiam eblaj atakantoj povus lanĉi DDoS-atakon malfermante multoblajn konektojn por elĉerpi rimedojn sur la maŝino. Unu fadeno per konekto ankaŭ ne estas la plej bona elekto, ĉar la kerno malŝparos rimedojn administrante fadenojn.

Tial Chris Wellons elektis la plej malpezan opcion por Endlessh: unu-fadena servilo poll(2), kie la klientoj en la kaptilo konsumas preskaŭ neniujn ekstrajn rimedojn, ne kalkulante la ingobjekton en la kerno kaj aliajn 78 bajtojn por spurado en Endlessh. Por eviti devi asigni ricevi kaj sendi bufrojn por ĉiu kliento, Endlessh malfermas rektan aliron kaj tradukas TCP-pakaĵojn rekte, preterirante preskaŭ la tutan operaciumon TCP/IP-stako. La envenanta bufro tute ne estas bezonata, ĉar ni ne interesiĝas pri la envenantaj datumoj.

La aŭtoro diras tion en la momento de sia programo ne sciis pri la ekzisto de la asycio de Python kaj aliaj tarpitoj. Se li scius pri asycio, li povus efektivigi sian utilecon en nur 18 linioj en 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 estas ideala por skribi tarpitojn. Ekzemple, ĉi tiu hoko frostigos Firefox, Chrome aŭ ajnan alian klienton, kiu provas konektiĝi al via HTTP-servilo dum multaj horoj:

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 estas bonega ilo por puni interretajn ĉikanantojn. Vere, ekzistas iu risko, male, atentigi ilian atenton pri la nekutima konduto de aparta servilo. Iu povus pensi pri venĝo kaj celita DDoS-atako sur via IP. Tamen, ĝis nun ne estis tiaj kazoj, kaj tarpits funkcias bonege.

Naboj:
Python, Informa sekureco, Programaro, Sistemadministrado

Etikedoj:
SSH, Endlessh, tarpit, tarpit, kaptilo, asycio
Kaptilo (Tarpit) por envenantaj SSH-konektoj

Ne estas sekreto, ke Interreto estas tre malamika medio. Tuj kiam vi levas servilon, ĝi estas tuj submetita al amasaj atakoj kaj multoblaj skanadoj. Ekzemple mielpoto de sekurecaj gardistoj vi povas taksi la skalon de ĉi tiu rubotrafiko. Fakte, sur la averaĝa servilo, 99% de trafiko povas esti malica.

Tarpit estas kaptilhaveno uzata por malrapidigi envenantajn konektojn. Se triaparta sistemo konektas al ĉi tiu haveno, vi ne povos rapide fermi la konekton. Ŝi devos malŝpari siajn sistemajn rimedojn kaj atendi ĝis la konekto-tempiĝo, aŭ permane ĉesigi ĝin.

Plej ofte, tarpits estas uzataj por protekto. La tekniko unue estis evoluigita por protekti kontraŭ komputilvermoj. Kaj nun ĝi povas esti uzata por ruinigi la vivojn de spamistoj kaj esploristoj, kiuj okupiĝas pri larĝa skanado de ĉiuj IP-adresoj en vico (ekzemploj pri Habré: Aŭstrio, Ukrainio).

Unu el la sistemadministrantoj nomita Chris Wellons ŝajne laciĝis rigardi ĉi tiun malhonorigon - kaj li skribis malgrandan programon. Senfina, tarpito por SSH kiu bremsas alvenantajn konektojn. La programo malfermas havenon (la defaŭlta haveno por testado estas 2222) kaj ŝajnigas esti SSH-servilo, sed fakte ĝi establas senfinan ligon kun la envenanta kliento ĝis ĝi rezignas. Ĉi tio povas daŭri plurajn tagojn aŭ pli ĝis la kliento defalas.

Instalado de la utileco:

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

Taŭge efektivigita tarpit prenos pli da rimedoj de la atakanto ol de vi. Sed eĉ ne temas pri rimedoj. Aŭtoro li skribaske la programo estas dependiga. Ĝuste nun ĝi havas 27 klientojn kaptitaj, kelkaj el ili konektitaj dum semajnoj. Ĉe la pinto de agado, 1378 klientoj estis kaptitaj dum 20 horoj!

En funkcia reĝimo, la servilo Endlessh devas esti instalita sur la kutima haveno 22, kie huliganoj amase frapas. Normaj sekurecrekomendoj ĉiam konsilas movi SSH al malsama haveno, kiu tuj reduktas la grandecon de la ŝtipoj per ordo de grandeco.

Chris Wellons diras, ke lia programo ekspluatas unu alineon de la specifo RFC 4253 al la SSH-protokolo. Tuj post kiam TCP-konekto estas establita, sed antaŭ ol kriptografio estas aplikata, ambaŭ partioj devas sendi identigan ĉenon. Kaj estas ankaŭ noto: "La servilo POVAS sendi aliajn vicojn da datumoj antaŭ sendi la version vicon". Kaj neniu limo pri la volumo de ĉi tiuj datumoj, vi nur bezonas komenci ĉiun linion per SSH-.

Ĝuste tion faras la programo Endlessh: ĝi sendas malfinia fluo de hazarde generitaj datumoj, kiuj konformas al RFC 4253, tio estas, sendu antaŭ aŭtentigo, kaj ĉiu linio komenciĝas per SSH- kaj ne superas 255 signojn, inkluzive de la linifina signo. Ĝenerale ĉio estas laŭ la normo.

Defaŭlte, la programo atendas 10 sekundojn inter sendado de pakaĵoj. Ĉi tio malhelpas, ke la kliento estos elĉerpita, do la kliento estos kaptita por ĉiam.

Ĉar la datumoj estas senditaj antaŭ ol kriptografio estas aplikata, la programo estas ekstreme simpla. Ĝi ne bezonas efektivigi ajnajn ĉifrojn kaj subtenas plurajn protokolojn.

La aŭtoro provis certigi, ke la utileco konsumas minimumon da rimedoj kaj funkcias tute nerimarkite sur la maŝino. Male al modernaj antivirusoj kaj aliaj "sekurecaj sistemoj", ĝi ne devus malrapidigi vian komputilon. Li sukcesis minimumigi kaj trafikon kaj memorkonsumon pro iomete pli ruza programaro efektivigo. Se ĝi simple lanĉus apartan procezon sur nova konekto, tiam eblaj atakantoj povus lanĉi DDoS-atakon malfermante multoblajn konektojn por elĉerpi rimedojn sur la maŝino. Unu fadeno per konekto ankaŭ ne estas la plej bona elekto, ĉar la kerno malŝparos rimedojn administrante fadenojn.

Tial Chris Wellons elektis la plej malpezan opcion por Endlessh: unu-fadena servilo poll(2), kie la klientoj en la kaptilo konsumas preskaŭ neniujn ekstrajn rimedojn, ne kalkulante la ingobjekton en la kerno kaj aliajn 78 bajtojn por spurado en Endlessh. Por eviti devi asigni ricevi kaj sendi bufrojn por ĉiu kliento, Endlessh malfermas rektan aliron kaj tradukas TCP-pakaĵojn rekte, preterirante preskaŭ la tutan operaciumon TCP/IP-stako. La envenanta bufro tute ne estas bezonata, ĉar ni ne interesiĝas pri la envenantaj datumoj.

La aŭtoro diras tion en la momento de sia programo ne sciis pri la ekzisto de la asycio de Python kaj aliaj tarpitoj. Se li scius pri asycio, li povus efektivigi sian utilecon en nur 18 linioj en 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 estas ideala por skribi tarpitojn. Ekzemple, ĉi tiu hoko frostigos Firefox, Chrome aŭ ajnan alian klienton, kiu provas konektiĝi al via HTTP-servilo dum multaj horoj:

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 estas bonega ilo por puni interretajn ĉikanantojn. Vere, ekzistas iu risko, male, atentigi ilian atenton pri la nekutima konduto de aparta servilo. Iu povus pensi pri venĝo kaj celita DDoS-atako sur via IP. Tamen, ĝis nun ne estis tiaj kazoj, kaj tarpits funkcias bonege.

Kaptilo (Tarpit) por envenantaj SSH-konektoj

fonto: www.habr.com

Aldoni komenton