Lõks (tarpit) sissetulevate SSH-ühenduste jaoks

Pole saladus, et Internet on väga vaenulik keskkond. Niipea, kui serveri üles tõstate, langeb see kohe tohutute rünnakute ja mitmekordse skannimise alla. Näiteks meepott turvameestelt saate hinnata selle prügiliikluse ulatust. Tegelikult võib keskmises serveris 99% liiklusest olla pahatahtlik.

Tarpit on lõksport, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui selle pordiga ühendub kolmanda osapoole süsteem, ei saa te ühendust kiiresti sulgeda. Ta peab raiskama oma süsteemiressursse ja ootama ühenduse ajalõpuni või selle käsitsi katkestama.

Kõige sagedamini kasutatakse kaitseks tarpiti. See tehnika töötati esmakordselt välja arvutiusside eest kaitsmiseks. Ja nüüd saab seda kasutada rämpspostitajate ja teadlaste elu rikkumiseks, kes tegelevad järjest kõigi IP-aadresside laialdase skannimisega (näited Habré kohta: Austria, Ukraina).

Üks süsteemiadministraator nimega Chris Wellons väsis ilmselt selle häbi vaatamisest - ja ta kirjutas väikese programmi Lõputu, SSH jaoks mõeldud tarpit, mis aeglustab sissetulevaid ühendusi. Programm avab pordi (testimise vaikimisi port on 2222) ja teeskleb SSH-serverit, kuid tegelikult loob sissetuleva kliendiga lõputu ühenduse, kuni see loobub. See võib kesta mitu päeva või kauem, kuni klient kukub maha.

Utiliidi paigaldamine:

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

Õigesti rakendatud tarpit võtab ründajalt rohkem ressursse kui teilt. Kuid see pole isegi ressursside küsimus. Autor kirjutabet programm tekitab sõltuvust. Praegu on sellel lõksus 27 klienti, mõned neist on ühendatud nädalateks. Aktiivsuse tippajal jäi 1378 tunniks lõksu 20 klienti!

Töörežiimis tuleb Endlesshi server paigaldada tavalisse porti 22, kus huligaanid massiliselt koputavad. Standardsed turvasoovitused soovitavad alati SSH teisaldamist teise porti, mis vähendab kohe logide suurust suurusjärgu võrra.

Chris Wellons ütleb, et tema programm kasutab spetsifikatsiooni ühte lõiku RFC 4253 SSH-protokollile. Kohe pärast TCP-ühenduse loomist, kuid enne krüptograafia rakendamist, peavad mõlemad pooled saatma identifitseerimisstringi. Ja seal on ka märkus: "Server VÕIB enne versioonirea saatmist saata muid andmeridasid". Ja Pole limiiti nende andmete mahu kohta peate lihtsalt iga rida alustama SSH-.

See on täpselt see, mida Endlesshi programm teeb: see saadab lõputu juhuslikult genereeritud andmete voog, mis vastavad standardile RFC 4253, st saadavad enne autentimist ja iga rida algab tähega SSH- ja ei ületa 255 tähemärki, sealhulgas rea lõpu märk. Üldiselt on kõik vastavalt standardile.

Vaikimisi ootab programm pakettide saatmise vahel 10 sekundit. See hoiab ära kliendi aegumise, mistõttu jääb klient igaveseks lõksu.

Kuna andmed saadetakse enne krüptograafia rakendamist, on programm äärmiselt lihtne. See ei vaja šifreid ja toetab mitut protokolli.

Autor püüdis tagada, et utiliit tarbiks minimaalselt ressursse ja töötaks masinal täiesti märkamatult. Erinevalt tänapäevastest viirusetõrjetest ja muudest "turvasüsteemidest" ei tohiks see teie arvutit aeglustada. Nii liiklus- kui mälukulu õnnestus tal tänu veidi kavalamale tarkvaralisele teostusele minimeerida. Kui see käivitaks uue ühenduse puhul lihtsalt eraldi protsessi, võivad potentsiaalsed ründajad käivitada DDoS-rünnaku, avades mitu ühendust, et masina ressursse ammendada. Üks lõim ühenduse kohta pole samuti parim valik, sest kernel raiskab lõimede haldamisele ressursse.

Seetõttu valis Chris Wellons Endlesshi jaoks kõige kergema variandi: ühe lõimega serveri poll(2), kus lõksus olevad kliendid ei tarbi praktiliselt mingeid lisaressursse, arvestamata tuumas olevat sokliobjekti ja veel 78 baiti Endlesshis jälgimiseks. Et vältida iga kliendi jaoks vastuvõtmis- ja saatmispuhvrite eraldamist, avab Endlessh otsejuurdepääsu pesa ja tõlgib TCP-paketid otse, jättes mööda peaaegu kogu operatsioonisüsteemi TCP/IP-pinust. Sissetulevat puhvrit pole üldse vaja, sest meid ei huvita sissetulevad andmed.

Autor ütleb, et oma programmi ajal ei teadnud Pythoni asycio ja muude tarpitide olemasolu kohta. Kui ta teadis asyciost, saaks ta oma utiliidi Pythonis rakendada vaid 18 real:

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 tarptite kirjutamiseks. Näiteks külmutab see konks Firefoxi, Chrome'i või mõne muu kliendi, mis proovib teie HTTP-serveriga ühendust luua mitmeks tunniks:

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 vahend võrgukiusajate karistamiseks. Tõsi, on teatud oht, vastupidi, juhtida nende tähelepanu konkreetse serveri ebatavalisele käitumisele. Keegi võiks mõelda kättemaksule ja sihitud DDoS-rünnak teie IP-le. Seni pole aga selliseid juhtumeid olnud ja tarpitid töötavad suurepäraselt.

Jaoturid:
Python, Infoturve, Tarkvara, Süsteemihaldus

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Lõks (tarpit) sissetulevate SSH-ühenduste jaoks

Pole saladus, et Internet on väga vaenulik keskkond. Niipea, kui serveri üles tõstate, langeb see kohe tohutute rünnakute ja mitmekordse skannimise alla. Näiteks meepott turvameestelt saate hinnata selle prügiliikluse ulatust. Tegelikult võib keskmises serveris 99% liiklusest olla pahatahtlik.

Tarpit on lõksport, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui selle pordiga ühendub kolmanda osapoole süsteem, ei saa te ühendust kiiresti sulgeda. Ta peab raiskama oma süsteemiressursse ja ootama ühenduse ajalõpuni või selle käsitsi katkestama.

Kõige sagedamini kasutatakse kaitseks tarpiti. See tehnika töötati esmakordselt välja arvutiusside eest kaitsmiseks. Ja nüüd saab seda kasutada rämpspostitajate ja teadlaste elu rikkumiseks, kes tegelevad järjest kõigi IP-aadresside laialdase skannimisega (näited Habré kohta: Austria, Ukraina).

Üks süsteemiadministraator nimega Chris Wellons väsis ilmselt selle häbi vaatamisest - ja ta kirjutas väikese programmi Lõputu, SSH jaoks mõeldud tarpit, mis aeglustab sissetulevaid ühendusi. Programm avab pordi (testimise vaikimisi port on 2222) ja teeskleb SSH-serverit, kuid tegelikult loob sissetuleva kliendiga lõputu ühenduse, kuni see loobub. See võib kesta mitu päeva või kauem, kuni klient kukub maha.

Utiliidi paigaldamine:

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

Õigesti rakendatud tarpit võtab ründajalt rohkem ressursse kui teilt. Kuid see pole isegi ressursside küsimus. Autor kirjutabet programm tekitab sõltuvust. Praegu on sellel lõksus 27 klienti, mõned neist on ühendatud nädalateks. Aktiivsuse tippajal jäi 1378 tunniks lõksu 20 klienti!

Töörežiimis tuleb Endlesshi server paigaldada tavalisse porti 22, kus huligaanid massiliselt koputavad. Standardsed turvasoovitused soovitavad alati SSH teisaldamist teise porti, mis vähendab kohe logide suurust suurusjärgu võrra.

Chris Wellons ütleb, et tema programm kasutab spetsifikatsiooni ühte lõiku RFC 4253 SSH-protokollile. Kohe pärast TCP-ühenduse loomist, kuid enne krüptograafia rakendamist, peavad mõlemad pooled saatma identifitseerimisstringi. Ja seal on ka märkus: "Server VÕIB enne versioonirea saatmist saata muid andmeridasid". Ja Pole limiiti nende andmete mahu kohta peate lihtsalt iga rida alustama SSH-.

See on täpselt see, mida Endlesshi programm teeb: see saadab lõputu juhuslikult genereeritud andmete voog, mis vastavad standardile RFC 4253, st saadavad enne autentimist ja iga rida algab tähega SSH- ja ei ületa 255 tähemärki, sealhulgas rea lõpu märk. Üldiselt on kõik vastavalt standardile.

Vaikimisi ootab programm pakettide saatmise vahel 10 sekundit. See hoiab ära kliendi aegumise, mistõttu jääb klient igaveseks lõksu.

Kuna andmed saadetakse enne krüptograafia rakendamist, on programm äärmiselt lihtne. See ei vaja šifreid ja toetab mitut protokolli.

Autor püüdis tagada, et utiliit tarbiks minimaalselt ressursse ja töötaks masinal täiesti märkamatult. Erinevalt tänapäevastest viirusetõrjetest ja muudest "turvasüsteemidest" ei tohiks see teie arvutit aeglustada. Nii liiklus- kui mälukulu õnnestus tal tänu veidi kavalamale tarkvaralisele teostusele minimeerida. Kui see käivitaks uue ühenduse puhul lihtsalt eraldi protsessi, võivad potentsiaalsed ründajad käivitada DDoS-rünnaku, avades mitu ühendust, et masina ressursse ammendada. Üks lõim ühenduse kohta pole samuti parim valik, sest kernel raiskab lõimede haldamisele ressursse.

Seetõttu valis Chris Wellons Endlesshi jaoks kõige kergema variandi: ühe lõimega serveri poll(2), kus lõksus olevad kliendid ei tarbi praktiliselt mingeid lisaressursse, arvestamata tuumas olevat sokliobjekti ja veel 78 baiti Endlesshis jälgimiseks. Et vältida iga kliendi jaoks vastuvõtmis- ja saatmispuhvrite eraldamist, avab Endlessh otsejuurdepääsu pesa ja tõlgib TCP-paketid otse, jättes mööda peaaegu kogu operatsioonisüsteemi TCP/IP-pinust. Sissetulevat puhvrit pole üldse vaja, sest meid ei huvita sissetulevad andmed.

Autor ütleb, et oma programmi ajal ei teadnud Pythoni asycio ja muude tarpitide olemasolu kohta. Kui ta teadis asyciost, saaks ta oma utiliidi Pythonis rakendada vaid 18 real:

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 tarptite kirjutamiseks. Näiteks külmutab see konks Firefoxi, Chrome'i või mõne muu kliendi, mis proovib teie HTTP-serveriga ühendust luua mitmeks tunniks:

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 vahend võrgukiusajate karistamiseks. Tõsi, on teatud oht, vastupidi, juhtida nende tähelepanu konkreetse serveri ebatavalisele käitumisele. Keegi võiks mõelda kättemaksule ja sihitud DDoS-rünnak teie IP-le. Seni pole aga selliseid juhtumeid olnud ja tarpitid töötavad suurepäraselt.

Lõks (tarpit) sissetulevate SSH-ühenduste jaoks

Allikas: www.habr.com

Lisa kommentaar