SSH ühenduste lõks (tarpit)

Ei ole saladus, et internet on äärmiselt vaenulik keskkond. Niipea kui server üles tõstate, on see kohe massiliste rünnakute ja mitmekesiste skannimiste objektiks. Selle näite põhjal ohutuse ekspertide honeypotist võib hinnata selle prügitrafiku ulatust. Tegelikult võib keskmisel serveril kuni 99% liiklusest olla pahatahtlik.

Tarpit on sadama lõks, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui kolmas osapool ühendub sellele sadamale, ei saa ühendust kiiresti sulgeda. See peab kulutama oma süsteemi ressursse ja ootama, kuni ühendus katkeb ajaülesande tõttu või murdmise korral.

Tavaliselt kasutatakse tarpite kaitseks. Tehnika loodi esmakordselt arvutikiirte kaitseks. Praegu saab seda kasutada, et rikkuda spämmerite ja uurijate elu, kes tegelevad kõigi IP-aadresside suvalise skannimisega (näited Habr’s: Austria, Ukraina).

Ühel süsteemiadministraatoril nimega Chris Vellons näib, et on küllalt vaadanud seda hämarust — ja ta kirjutas väikese programmi Endlessh, SSH tarpit, mis aeglustab sissetulevaid ühendusi. Programm avab sadama (vaikimisi on katsetamiseks määratud sadam 2222) ja teeb nägu nagu oleks see SSH-server, kuid tegelikult loob see lõputu ühenduse sissetuleva kliendiga, kuni see alla annab. See võib kesta mitu päeva või rohkem, kuni klient katkeb.

Utiliidi installimine:

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

Hästi rakendatud tarpit võtab ründajalt rohkem ressursse kui teil endal. Aga asi ei ole üksi ressurssides. Autor kirjutab, et programm tekitab sõltuvust. Praegu on tema lõksus 27 klienti, mõned neist on olnud ühenduses nädalate viisi. Haripunktis oli lõksus 1378 klienti 20 tunni vältel!

Töökorras tuleb server Endlessh paigaldada tavapäraselt sadamale 22, kuhu massiliselt koputavad kurjategijad. Standardid soovitavad alati muuta SSH teisele sadamale, mis vähendab päevikute mahtu järsult.

Chris Vellons ütleb, et tema programm kasutab ära ühe lõigu spetsifikatsioonist RFC 4253 SSH-protokollil. Kohe pärast TCP-ühenduse loomist, kuid enne krüptograafia rakendamist peavad mõlemad osapooled saatma identifitseerimise rea. Seal on ka lisamine: „Server võib saata teisi andmereale enne versiooni rea saatmist“. Ja ei ole piirangut nende andmete mahule, lihtsalt iga rida tuleb alustada SSH-.

Just sellega tegeleb programm Endlessh: see saadab lõputu juhuslikult genereeritud andmete voogu, mis vastavad RFC 4253-le, see tähendab, et need saadetakse enne identifitseerimist ja iga rida algab SSH- ja ei ületa 255 märki, sealhulgas rea lõppemärki. Ühesõnaga, kõik vastab standardile.

Vaikimisi ootab programm 10 sekundit pakettide saatmise vahel. See takistab ajautumise tõttu katkestamist, nii et klient jääb lõksu igavesti.

Kuna andmete saatmine toimub enne krüptograafia rakendamist, on programm äärmiselt lihtne. Seal ei ole vaja sisse viia krüptimist ega toetada mitmeid protokolle.

Autor püüdis, et utiliit tarbiks minimaalselt ressursse ja töötaks täiesti märkamatult masinas. Erinevalt kaasaegsetest viirusetõrjetest ja muudest „turvasüsteemidest“ ei tohiks see arvutit pidurdada. Tal õnnestus minimiseerida nii liiklus kui ka mälu tarbimine veidi nutikama tarkvarateostusega. Kui ta lihtsalt käivitaks eraldi protsessi uue ühenduse jaoks, võiksid potentsiaalsed kurikaelad korraldada DDoS-rünnaku, avades mitmeid ühendusi, et ammendada masina ressursse. Ühe vooga ühenduse kohta - ka mitte parim valik, sest tuum kulutab ressursse voogude haldamiseks.

Seetõttu valis Chris Wellons Endlesshi jaoks kõige kergema variandi: üksiklõime serveri poll(2), kus lõksus olevad kliendid ei tarbi praktiliselt lisandeid, välja arvatud tuuma soketi objekt ja veel 78 baiti jälgimiseks Endlesshis. Et mitte eraldada vastuvõtu ja saatmise puhver iga kliendi jaoks, avab Endlessh otsepöördussoketi ja edastab TCP-paketid otse, ignoreerides peaaegu kogu TCP/IP protokolli virna. Sissetulev puffer ei ole üldse vajalik, kuna sissetulevad andmed meid ei huvita.

Autor ütleb, et oma programmi loomise ajal ei teadnud Python'i asycio ja teiste tarpitite olemasolust. Kui ta oleks teadnud asyciost, oleks ta oma utiliidi saanud ellu viia vaid 18 realise Python koodiga:

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 sobib ideaalselt tarpitite kirjutamiseks. Näiteks selline lõks võib mitu tundi peatada Firefoxi, Chrome'i või muu kliendi, kes püüab teie HTTP-serveriga ühendust luua:

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 on suurepärane tööriist interneti tigedate kasutajate karistamiseks. Tõsi, on mingisugune risk, et see tõmbab küll tähelepanu serveri ebatavalisele käitumisele. Keegi võib mõelda kättemaksu ja suunatud DDoS-rünnakule teie IP-aadressile. Kuid seni pole selliseid juhtumeid olnud ja tarpitid toimivad suurepäraselt.

Sildid:
Python, Teabe turve, Tarkvara, Süsteemi haldus

Märksõnad:
SSH, Endlessh, tarpit, lõks, asycio
SSH ühenduste lõks (tarpit)

Ei ole saladus, et internet on äärmiselt vaenulik keskkond. Niipea kui server üles tõstate, on see kohe massiliste rünnakute ja mitmekesiste skannimiste objektiks. Selle näite põhjal ohutuse ekspertide honeypotist võib hinnata selle prügitrafiku ulatust. Tegelikult võib keskmisel serveril kuni 99% liiklusest olla pahatahtlik.

Tarpit on sadama lõks, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui kolmas osapool ühendub sellele sadamale, ei saa ühendust kiiresti sulgeda. See peab kulutama oma süsteemi ressursse ja ootama, kuni ühendus katkeb ajaülesande tõttu või murdmise korral.

Tavaliselt kasutatakse tarpite kaitseks. Tehnika loodi esmakordselt arvutikiirte kaitseks. Praegu saab seda kasutada, et rikkuda spämmerite ja uurijate elu, kes tegelevad kõigi IP-aadresside suvalise skannimisega (näited Habr’s: Austria, Ukraina).

Ühel süsteemiadministraatoril nimega Chris Vellons näib, et on küllalt vaadanud seda hämarust — ja ta kirjutas väikese programmi Endlessh, SSH tarpit, mis aeglustab sissetulevaid ühendusi. Programm avab sadama (vaikimisi on katsetamiseks määratud sadam 2222) ja teeb nägu nagu oleks see SSH-server, kuid tegelikult loob see lõputu ühenduse sissetuleva kliendiga, kuni see alla annab. See võib kesta mitu päeva või rohkem, kuni klient katkeb.

Utiliidi installimine:

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

Hästi rakendatud tarpit võtab ründajalt rohkem ressursse kui teil endal. Aga asi ei ole üksi ressurssides. Autor kirjutab, et programm tekitab sõltuvust. Praegu on tema lõksus 27 klienti, mõned neist on olnud ühenduses nädalate viisi. Haripunktis oli lõksus 1378 klienti 20 tunni vältel!

Töökorras tuleb server Endlessh paigaldada tavapäraselt sadamale 22, kuhu massiliselt koputavad kurjategijad. Standardid soovitavad alati muuta SSH teisele sadamale, mis vähendab päevikute mahtu järsult.

Chris Vellons ütleb, et tema programm kasutab ära ühe lõigu spetsifikatsioonist RFC 4253 SSH-protokollil. Kohe pärast TCP-ühenduse loomist, kuid enne krüptograafia rakendamist peavad mõlemad osapooled saatma identifitseerimise rea. Seal on ka lisamine: „Server võib saata teisi andmereale enne versiooni rea saatmist“. Ja ei ole piirangut nende andmete mahule, lihtsalt iga rida tuleb alustada SSH-.

Just sellega tegeleb programm Endlessh: see saadab lõputu juhuslikult genereeritud andmete voogu, mis vastavad RFC 4253-le, see tähendab, et need saadetakse enne identifitseerimist ja iga rida algab SSH- ja ei ületa 255 märki, sealhulgas rea lõppemärki. Ühesõnaga, kõik vastab standardile.

Vaikimisi ootab programm 10 sekundit pakettide saatmise vahel. See takistab ajautumise tõttu katkestamist, nii et klient jääb lõksu igavesti.

Kuna andmete saatmine toimub enne krüptograafia rakendamist, on programm äärmiselt lihtne. Seal ei ole vaja sisse viia krüptimist ega toetada mitmeid protokolle.

Autor püüdis, et utiliit tarbiks minimaalselt ressursse ja töötaks täiesti märkamatult masinas. Erinevalt kaasaegsetest viirusetõrjetest ja muudest „turvasüsteemidest“ ei tohiks see arvutit pidurdada. Tal õnnestus minimiseerida nii liiklus kui ka mälu tarbimine veidi nutikama tarkvarateostusega. Kui ta lihtsalt käivitaks eraldi protsessi uue ühenduse jaoks, võiksid potentsiaalsed kurikaelad korraldada DDoS-rünnaku, avades mitmeid ühendusi, et ammendada masina ressursse. Ühe vooga ühenduse kohta - ka mitte parim valik, sest tuum kulutab ressursse voogude haldamiseks.

Seetõttu valis Chris Wellons Endlesshi jaoks kõige kergema variandi: üksiklõime serveri poll(2), kus lõksus olevad kliendid ei tarbi praktiliselt lisandeid, välja arvatud tuuma soketi objekt ja veel 78 baiti jälgimiseks Endlesshis. Et mitte eraldada vastuvõtu ja saatmise puhver iga kliendi jaoks, avab Endlessh otsepöördussoketi ja edastab TCP-paketid otse, ignoreerides peaaegu kogu TCP/IP protokolli virna. Sissetulev puffer ei ole üldse vajalik, kuna sissetulevad andmed meid ei huvita.

Autor ütleb, et oma programmi loomise ajal ei teadnud Python'i asycio ja teiste tarpitite olemasolust. Kui ta oleks teadnud asyciost, oleks ta oma utiliidi saanud ellu viia vaid 18 realise Python koodiga:

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 sobib ideaalselt tarpitite kirjutamiseks. Näiteks selline lõks võib mitu tundi peatada Firefoxi, Chrome'i või muu kliendi, kes püüab teie HTTP-serveriga ühendust luua:

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 on suurepärane tööriist interneti tigedate kasutajate karistamiseks. Tõsi, on mingisugune risk, et see tõmbab küll tähelepanu serveri ebatavalisele käitumisele. Keegi võib mõelda kättemaksu ja suunatud DDoS-rünnakule teie IP-aadressile. Kuid seni pole selliseid juhtumeid olnud ja tarpitid toimivad suurepäraselt.

SSH ühenduste lõks (tarpit)

Allikas: habr.com

Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster