Kapja (tarpit) për lidhje hyrëse SSH

Nukë është sekret që interneti është një ambient shumë armiqësor. Sa herë që ngrini një server, ai menjëherë përballet me sulme masive dhe scans të shumta. Në shembullin e hunipotit nga siguria mund të vlerësohet madhësia e këtij trafiku të padëshiruar. Në fakt, në një server mesatar, 99% e trafikut mund të jetë keqbërëse.

Tarpit është një port-pastër që përdoret për të ngadalësuar lidhjet hyrëse. Nëse një sistem i jashtëm lidhet me këtë port, nuk do të jetë e lehtë ta mbyllni shpejt lidhjen. Ai do të duhet të shpenzojë burimet e veta sistemike dhe të presë derisa lidhja të ndërpritet për shkak të kohës së pritjes, ose ta ndërpresë manualisht atë.

Më së shumti, tarpitet përdoren për mbrojtje. Kjo teknikë u zhvillua për herë të parë për mbrojtjen nga vermet kompjuterike. Tani ajo mund të përdoret për të prishur jetën spamerëve dhe studiuesve, të cilët merren me skanimin e gjerë të të gjitha adresave IP një pas një (shembuj në Habrë: Austri, Ukraina).

Një nga administratorët e sistemeve, emri i të cilit është Kris Vellons, duket se iu mërzit të vëzhgojë këtë kaos dhe shkroi një program të vogël Endlessh, një tarpit për SSH, që ngadalëson lidhjet hyrëse. Programi hap një port (me parazgjedhje për testim është caktuar porti 2222) dhe pretendon të jetë një server SSH, ndërsa në të vërtetë krijon një lidhje të pafundme me klientin e hyrjes, derisa ai të dorëzohet. Kjo mund të vazhdojë disa ditë ose më shumë, derisa klienti të dorëzohet.

Instalimi i utilitarit:

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

Një tarpit i implementuar siç duhet do të marrë më shumë burime nga keqbërësi se sa nga ju. Por çështja nuk është vetëm burimet. Autori CNBC, në periudhën nga 2000 deri në 2018 Facebook, Alphabet, Microsoft, Apple dhe Amazon kanë punësuar më shumë se një milion punonjës të rinj. Të tilla biznese akumullojnë mjaft burime, përveç aktivitetit të tyre kryesor, për të realizuar kërkime dhe zhvillime masive në fusha të reja, ndonjëherë me rrezikshmëri të lartë. Për më tepër, kompanitë formojnë dhe ekosistemin e tyre, brenda të cilit përdoruesit i zgjidhin një gamë të gjerë problemesh - porositin menjëherë të gjitha produktet e nevojshme, nga ushqimi deri te teknika, në Amazon. Sipas parashikimeve të analistëve, deri në vitin 2021 aithotë se programi krijon varësi. Tani në grackën e tij janë 27 klientë, disa prej të cilëve janë lidhur për javë. Në kulmin e aktivitetit, 1378 klientë ishin në grackë për 20 orë!

Në operacionin normal, serveri Endlessh duhet vendosur në portin e zakonshëm 22, ku huliganët e godasin masivisht. Rekomandimet standarde për siguri gjithmonë sugjerojnë të zhvendosin SSH në një port tjetër, gjë që menjëherë e zvogëlon ndjeshëm madhësinë e logëve.

Kris Vellons thotë se programi i tij shfrytëzon një paragraf nga specifikimi RFC 4253 për protokollin SSH. Menjëherë pas vendosjes së lidhjes TCP, por para se të përdoret kriptografia, të dy palët duhet të dërgojnë një string identifikimi. Dhe aty ka një shtesë: «Serveri MUND të dërgojë rreshta të tjerë të dhënash para se të dërgojë rreshtin me versionin». Dhe nuk ka kufizim në volum të këtyre të dhënave, thjesht çdo rresht duhet të fillojë me SSH-.

Kjo është ajo që bën programi Endlessh: ai dërgon të pafund rrjedhën e të dhënave të rastësishme të gjeneruara, që përputhen me RFC 4253, domethënë dërgimi para identifikimit, dhe çdo rresht fillon me SSH- dhe nuk kalon 255 karaktere, duke përfshirë karakterin e përfundimit të rreshtit. Në përgjithësi, gjithçka sipas standardit.

Me default, programi pret 10 sekonda midis dërgesave të pakove. Kjo parandalon ndërprerjen për shkak të kohës, kështu që klienti do të ngecë përgjithmonë.

Duke qenë se dërgimi i të dhënave bëhet përpara se të aplikohet kriptografia, programi është jashtëzakonisht i thjeshtë. Nuk ka nevojë për implementimin e ndonjë cifrimi dhe mbështetje për shumë protokolle.

Autori është përpjekur që utilitarja të konsumojë minimumin e burimeve dhe të funksionojë absolutisht padukshëm në makinën. Ndryshe nga antivirusët modernë dhe sistemet e tjera «të sigurisë», ajo nuk duhet të ngadalësojë kompjuterin. Ai ka arritur të minimizojë si trafikun, ashtu edhe konsumimin e memories përmes një realizimi disi më të sofistikuar të programit. Nëse ai do të kishte vetëm një proces të veçantë për një lidhje të re, atëherë sulmuesit potencialë mund të kryenin një sulm DDoS duke hapur shumë lidhje për të shteruar burimet në makinë. Një rrjedhë për lidhje — gjithashtu nuk është opsioni më i mirë, sepse bërthama do të shpenzojë burimet për menaxhimin e rrjedhave.

Prandaj, Chris Wellons zgjodhi opsionin më të lehtë për Endlessh: serveri një rrjedhëshe poll(2), ku klientët në ngacmim praktikisht nuk konsumojnë burime të tepërta, përveç Objektit të socketit në bërthamë dhe 78 byte të tjera për ndjekjen në Endlessh. Për të mos ndarë buferat e marrjes dhe dërgimit për çdo klient, Endlessh hap një socket të aksesit të drejtpërdrejtë dhe transmeton drejtpërdrejt paketat TCP, duke injoruar pothuajse të gjithë stek TCP/IP të sistemit operativ. Bufferi i hyrjes nuk është aspak i nevojshëm, sepse të dhënat e hyra nuk na interesojnë.

Autori thotë se në momentin e programit të tij nuk e dinte për ekzistencën e asycio në Python dhe kapakët e tjerë. Nëse do të kishte ditur për asycio, atëherë utilitarin e tij do ta kishte realizuar në vetëm 18 rreshta në 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 është ideale për të shkruar tarpita. Për shembull, një kapje e tillë mund të bllokojë Firefox, Chrome ose një klient tjetër që përpiqet të lidhet me serverin tuaj HTTP për disa orë:

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())

Tarpiti është një mjet e shkëlqyer për të ndëshkuar hakerët e internetit. Megjithatë, ekziston një rrezik i caktuar që tërheq vëmendjen ndaj sjelljes së pazakontë të serverit tuaj. Disa mund të mendojnë për hakmarrje dhe për një sulm të synuar DDoS ndaj IP-së tuaj. Megjithatë, deri tani nuk ka pasur raste të tilla dhe tarpitat funksionojnë shumë mirë.

Kategoritë:
Python, Siguria Informative, Softueri, Administrimi i Sistemeve

Etiketat:
SSH, Endlessh, tarpit, kapje, asycio
Kapja (tarpit) për lidhje hyrëse SSH

Nukë është sekret që interneti është një ambient shumë armiqësor. Sa herë që ngrini një server, ai menjëherë përballet me sulme masive dhe scans të shumta. Në shembullin e hunipotit nga siguria mund të vlerësohet madhësia e këtij trafiku të padëshiruar. Në fakt, në një server mesatar, 99% e trafikut mund të jetë keqbërëse.

Tarpit është një port-pastër që përdoret për të ngadalësuar lidhjet hyrëse. Nëse një sistem i jashtëm lidhet me këtë port, nuk do të jetë e lehtë ta mbyllni shpejt lidhjen. Ai do të duhet të shpenzojë burimet e veta sistemike dhe të presë derisa lidhja të ndërpritet për shkak të kohës së pritjes, ose ta ndërpresë manualisht atë.

Më së shumti, tarpitet përdoren për mbrojtje. Kjo teknikë u zhvillua për herë të parë për mbrojtjen nga vermet kompjuterike. Tani ajo mund të përdoret për të prishur jetën spamerëve dhe studiuesve, të cilët merren me skanimin e gjerë të të gjitha adresave IP një pas një (shembuj në Habrë: Austri, Ukraina).

Një nga administratorët e sistemeve, emri i të cilit është Kris Vellons, duket se iu mërzit të vëzhgojë këtë kaos dhe shkroi një program të vogël Endlessh, një tarpit për SSH, që ngadalëson lidhjet hyrëse. Programi hap një port (me parazgjedhje për testim është caktuar porti 2222) dhe pretendon të jetë një server SSH, ndërsa në të vërtetë krijon një lidhje të pafundme me klientin e hyrjes, derisa ai të dorëzohet. Kjo mund të vazhdojë disa ditë ose më shumë, derisa klienti të dorëzohet.

Instalimi i utilitarit:

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

Një tarpit i implementuar siç duhet do të marrë më shumë burime nga keqbërësi se sa nga ju. Por çështja nuk është vetëm burimet. Autori CNBC, në periudhën nga 2000 deri në 2018 Facebook, Alphabet, Microsoft, Apple dhe Amazon kanë punësuar më shumë se një milion punonjës të rinj. Të tilla biznese akumullojnë mjaft burime, përveç aktivitetit të tyre kryesor, për të realizuar kërkime dhe zhvillime masive në fusha të reja, ndonjëherë me rrezikshmëri të lartë. Për më tepër, kompanitë formojnë dhe ekosistemin e tyre, brenda të cilit përdoruesit i zgjidhin një gamë të gjerë problemesh - porositin menjëherë të gjitha produktet e nevojshme, nga ushqimi deri te teknika, në Amazon. Sipas parashikimeve të analistëve, deri në vitin 2021 aithotë se programi krijon varësi. Tani në grackën e tij janë 27 klientë, disa prej të cilëve janë lidhur për javë. Në kulmin e aktivitetit, 1378 klientë ishin në grackë për 20 orë!

Në operacionin normal, serveri Endlessh duhet vendosur në portin e zakonshëm 22, ku huliganët e godasin masivisht. Rekomandimet standarde për siguri gjithmonë sugjerojnë të zhvendosin SSH në një port tjetër, gjë që menjëherë e zvogëlon ndjeshëm madhësinë e logëve.

Kris Vellons thotë se programi i tij shfrytëzon një paragraf nga specifikimi RFC 4253 për protokollin SSH. Menjëherë pas vendosjes së lidhjes TCP, por para se të përdoret kriptografia, të dy palët duhet të dërgojnë një string identifikimi. Dhe aty ka një shtesë: «Serveri MUND të dërgojë rreshta të tjerë të dhënash para se të dërgojë rreshtin me versionin». Dhe nuk ka kufizim në volum të këtyre të dhënave, thjesht çdo rresht duhet të fillojë me SSH-.

Kjo është ajo që bën programi Endlessh: ai dërgon të pafund rrjedhën e të dhënave të rastësishme të gjeneruara, që përputhen me RFC 4253, domethënë dërgimi para identifikimit, dhe çdo rresht fillon me SSH- dhe nuk kalon 255 karaktere, duke përfshirë karakterin e përfundimit të rreshtit. Në përgjithësi, gjithçka sipas standardit.

Me default, programi pret 10 sekonda midis dërgesave të pakove. Kjo parandalon ndërprerjen për shkak të kohës, kështu që klienti do të ngecë përgjithmonë.

Duke qenë se dërgimi i të dhënave bëhet përpara se të aplikohet kriptografia, programi është jashtëzakonisht i thjeshtë. Nuk ka nevojë për implementimin e ndonjë cifrimi dhe mbështetje për shumë protokolle.

Autori është përpjekur që utilitarja të konsumojë minimumin e burimeve dhe të funksionojë absolutisht padukshëm në makinën. Ndryshe nga antivirusët modernë dhe sistemet e tjera «të sigurisë», ajo nuk duhet të ngadalësojë kompjuterin. Ai ka arritur të minimizojë si trafikun, ashtu edhe konsumimin e memories përmes një realizimi disi më të sofistikuar të programit. Nëse ai do të kishte vetëm një proces të veçantë për një lidhje të re, atëherë sulmuesit potencialë mund të kryenin një sulm DDoS duke hapur shumë lidhje për të shteruar burimet në makinë. Një rrjedhë për lidhje — gjithashtu nuk është opsioni më i mirë, sepse bërthama do të shpenzojë burimet për menaxhimin e rrjedhave.

Prandaj, Chris Wellons zgjodhi opsionin më të lehtë për Endlessh: serveri një rrjedhëshe poll(2), ku klientët në ngacmim praktikisht nuk konsumojnë burime të tepërta, përveç Objektit të socketit në bërthamë dhe 78 byte të tjera për ndjekjen në Endlessh. Për të mos ndarë buferat e marrjes dhe dërgimit për çdo klient, Endlessh hap një socket të aksesit të drejtpërdrejtë dhe transmeton drejtpërdrejt paketat TCP, duke injoruar pothuajse të gjithë stek TCP/IP të sistemit operativ. Bufferi i hyrjes nuk është aspak i nevojshëm, sepse të dhënat e hyra nuk na interesojnë.

Autori thotë se në momentin e programit të tij nuk e dinte për ekzistencën e asycio në Python dhe kapakët e tjerë. Nëse do të kishte ditur për asycio, atëherë utilitarin e tij do ta kishte realizuar në vetëm 18 rreshta në 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 është ideale për të shkruar tarpita. Për shembull, një kapje e tillë mund të bllokojë Firefox, Chrome ose një klient tjetër që përpiqet të lidhet me serverin tuaj HTTP për disa orë:

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())

Tarpiti është një mjet e shkëlqyer për të ndëshkuar hakerët e internetit. Megjithatë, ekziston një rrezik i caktuar që tërheq vëmendjen ndaj sjelljes së pazakontë të serverit tuaj. Disa mund të mendojnë për hakmarrje dhe për një sulm të synuar DDoS ndaj IP-së tuaj. Megjithatë, deri tani nuk ka pasur raste të tilla dhe tarpitat funksionojnë shumë mirë.

Kapja (tarpit) për lidhje hyrëse SSH

Burimi: habr.com

Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS 🔥 Blini hosting të besueshëm për faqe interneti me mbrojtje nga DDoS, serverë VPS VDS | ProHoster