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
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é:
Unu el la sistemadministrantoj nomita Chris Wellons ŝajne laciĝis rigardi ĉi tiun malhonorigon - kaj li skribis malgrandan programon.
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
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 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
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
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
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é:
Unu el la sistemadministrantoj nomita Chris Wellons ŝajne laciĝis rigardi ĉi tiun malhonorigon - kaj li skribis malgrandan programon.
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
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 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
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
fonto: www.habr.com