Slazds (tarpit) ienākoŔajiem SSH savienojumiem

Nav noslēpums, ka internets ir ļoti naidÄ«ga vide. TiklÄ«dz paceļat serveri, tas uzreiz tiek pakļauts masveida uzbrukumiem un vairākkārtējai skenÄ“Å”anai. Piemēram meduspods no apsardzes jÅ«s varat novērtēt Ŕīs atkritumu plÅ«smas mērogu. Faktiski vidējā serverÄ« 99% trafika var bÅ«t ļaunprātÄ«ga.

Tarpit ir slazdoÅ”anas ports, ko izmanto, lai palēninātu ienākoÅ”os savienojumus. Ja Å”im portam pievienojas treŔās puses sistēma, savienojumu nevarēs ātri aizvērt. Viņai bÅ«s jātērē savi sistēmas resursi un jāgaida, lÄ«dz beidzas savienojuma taimauts, vai arÄ« tas manuāli jāpārtrauc.

Visbiežāk aizsardzÄ«bai izmanto tarpitus. Paņēmiens vispirms tika izstrādāts, lai aizsargātu pret datoru tārpiem. Un tagad to var izmantot, lai sabojātu surogātpasta izplatÄ«tāju un pētnieku dzÄ«vi, kuri nodarbojas ar visu IP adreÅ”u plaÅ”u skenÄ“Å”anu pēc kārtas (piemēri par HabrĆ©: Austrija, Ukraina).

Vienam no sistēmas administratoriem, vārdā Kriss Velonss, acÄ«mredzot apnika skatÄ«ties Å”o apkaunojumu, un viņŔ uzrakstÄ«ja nelielu programmu BezgalÄ«gs, tarpit SSH, kas palēnina ienākoÅ”os savienojumus. Programma atver portu (noklusējuma ports testÄ“Å”anai ir 2222) un izliekas par SSH serveri, bet patiesÄ«bā tā izveido bezgalÄ«gu savienojumu ar ienākoÅ”o klientu, lÄ«dz tas atsakās. Tas var turpināties vairākas dienas vai ilgāk, lÄ«dz klients nokrÄ«t.

Lietderības uzstādīŔana:

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

Pareizi ieviests tarpit prasīs vairāk resursu no uzbrucēja nekā no jums. Bet tas nav pat jautājums par resursiem. Autors rakstaka programma rada atkarību. Šobrīd tajā ir iesprostoti 27 klienti, daži no tiem ir savienoti nedēļām ilgi. Aktivitātes maksimumā uz 1378 stundām bija iesprostoti 20 klienti!

DarbÄ«bas režīmā Endlessh serveris jāinstalē parastajā 22. portā, kur masveidā klauvē huligāni. Standarta droŔības ieteikumi vienmēr iesaka pārvietot SSH uz citu portu, kas nekavējoties samazina žurnālu lielumu par lielumu.

Kriss Velons saka, ka viņa programma izmanto vienu specifikācijas punktu RFC 4253 uz SSH protokolu. TÅ«lÄ«t pēc TCP savienojuma izveides, bet pirms kriptogrāfijas lietoÅ”anas, abām pusēm ir jānosÅ«ta identifikācijas virkne. Un ir arÄ« piezÄ«me: "Serveris VAR sÅ«tÄ«t citas datu rindas pirms versijas rindas nosÅ«tÄ«Å”anas". Un nav ierobežojumu par Å”o datu apjomu, jums vienkārÅ”i jāsāk katra rinda ar SSH-.

Tas ir tieÅ”i tas, ko dara Endlessh programma: tā sÅ«ta bezgalÄ«gs nejauÅ”i Ä£enerētu datu plÅ«sma, kas atbilst RFC 4253, tas ir, nosÅ«ta pirms autentifikācijas, un katra rinda sākas ar SSH- un nepārsniedz 255 rakstzÄ«mes, ieskaitot rindiņas beigu rakstzÄ«mi. Kopumā viss ir pēc standarta.

Pēc noklusējuma programma gaida 10 sekundes starp pakeÅ”u nosÅ«tÄ«Å”anu. Tas novērÅ” klienta taimautu, tāpēc klients bÅ«s iesprostots uz visiem laikiem.

Tā kā dati tiek nosÅ«tÄ«ti pirms kriptogrāfijas piemēroÅ”anas, programma ir ļoti vienkārÅ”a. Tam nav jāievieÅ” nekādi Å”ifri, un tas atbalsta vairākus protokolus.

Autore centās nodroÅ”ināt, lai utilÄ«ta patērē minimālu resursu un strādā pilnÄ«gi nepamanÄ«ti uz maŔīnas. AtŔķirÄ«bā no mÅ«sdienu antivÄ«rusiem un citām "droŔības sistēmām", tam nevajadzētu palēnināt datora darbÄ«bu. Viņam izdevās samazināt gan trafika, gan atmiņas patēriņu, pateicoties nedaudz viltÄ«gākai programmatÅ«ras ievieÅ”anai. Ja tas vienkārÅ”i uzsāktu atseviŔķu procesu jaunam savienojumam, potenciālie uzbrucēji varētu uzsākt DDoS uzbrukumu, atverot vairākus savienojumus, lai iztērētu iekārtas resursus. Viens pavediens vienam savienojumam arÄ« nav labākais risinājums, jo kodols tērēs resursus, pārvaldot pavedienus.

Tāpēc Kriss Velons izvēlējās visvieglāko Endlessh opciju: viena pavediena serveri. poll(2), kur slazdā esoÅ”ie klienti praktiski nepatērē nekādus papildu resursus, neskaitot ligzdas objektu kodolā un vēl 78 baitus izsekoÅ”anai Endlessh. Lai izvairÄ«tos no katra klienta saņemÅ”anas un nosÅ«tÄ«Å”anas buferu pieŔķirÅ”anas, Endlessh atver tieŔās piekļuves ligzdu un tieÅ”i tulko TCP paketes, apejot gandrÄ«z visu operētājsistēmas TCP/IP steku. IenākoÅ”ais buferis vispār nav vajadzÄ«gs, jo mÅ«s neinteresē ienākoÅ”ie dati.

Autors saka, ka viņa programmas laikā nezināju par Python asycio un citu tarpitu esamÄ«bu. Ja viņŔ zinātu par asycio, viņŔ Python varētu ieviest savu utilÄ«tu tikai 18 rindās:

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 ir ideāli piemērots tarpitu rakstÄ«Å”anai. Piemēram, Å”is āķis iesaldēs Firefox, Chrome vai jebkuru citu klientu, kas daudzas stundas mēģina izveidot savienojumu ar jÅ«su HTTP serveri:

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 ir lielisks rÄ«ks tieÅ”saistes iebiedētāju sodÄ«Å”anai. Tiesa, pastāv zināms risks, gluži pretēji, pievērst viņu uzmanÄ«bu konkrēta servera neparastajai uzvedÄ«bai. Kāds varētu domāt par atriebÄ«bu un mērÄ·tiecÄ«gs DDoS uzbrukums jÅ«su IP. Taču lÄ«dz Å”im tādu gadÄ«jumu nav bijis, un tarpits strādā lieliski.

Centrmezgli:
Python, Informācijas droŔība, ProgrammatÅ«ra, Sistēmu administrÄ“Å”ana

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Slazds (tarpit) ienākoŔajiem SSH savienojumiem

Nav noslēpums, ka internets ir ļoti naidÄ«ga vide. TiklÄ«dz paceļat serveri, tas uzreiz tiek pakļauts masveida uzbrukumiem un vairākkārtējai skenÄ“Å”anai. Piemēram meduspods no apsardzes jÅ«s varat novērtēt Ŕīs atkritumu plÅ«smas mērogu. Faktiski vidējā serverÄ« 99% trafika var bÅ«t ļaunprātÄ«ga.

Tarpit ir slazdoÅ”anas ports, ko izmanto, lai palēninātu ienākoÅ”os savienojumus. Ja Å”im portam pievienojas treŔās puses sistēma, savienojumu nevarēs ātri aizvērt. Viņai bÅ«s jātērē savi sistēmas resursi un jāgaida, lÄ«dz beidzas savienojuma taimauts, vai arÄ« tas manuāli jāpārtrauc.

Visbiežāk aizsardzÄ«bai izmanto tarpitus. Paņēmiens vispirms tika izstrādāts, lai aizsargātu pret datoru tārpiem. Un tagad to var izmantot, lai sabojātu surogātpasta izplatÄ«tāju un pētnieku dzÄ«vi, kuri nodarbojas ar visu IP adreÅ”u plaÅ”u skenÄ“Å”anu pēc kārtas (piemēri par HabrĆ©: Austrija, Ukraina).

Vienam no sistēmas administratoriem, vārdā Kriss Velonss, acÄ«mredzot apnika skatÄ«ties Å”o apkaunojumu, un viņŔ uzrakstÄ«ja nelielu programmu BezgalÄ«gs, tarpit SSH, kas palēnina ienākoÅ”os savienojumus. Programma atver portu (noklusējuma ports testÄ“Å”anai ir 2222) un izliekas par SSH serveri, bet patiesÄ«bā tā izveido bezgalÄ«gu savienojumu ar ienākoÅ”o klientu, lÄ«dz tas atsakās. Tas var turpināties vairākas dienas vai ilgāk, lÄ«dz klients nokrÄ«t.

Lietderības uzstādīŔana:

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

Pareizi ieviests tarpit prasīs vairāk resursu no uzbrucēja nekā no jums. Bet tas nav pat jautājums par resursiem. Autors rakstaka programma rada atkarību. Šobrīd tajā ir iesprostoti 27 klienti, daži no tiem ir savienoti nedēļām ilgi. Aktivitātes maksimumā uz 1378 stundām bija iesprostoti 20 klienti!

DarbÄ«bas režīmā Endlessh serveris jāinstalē parastajā 22. portā, kur masveidā klauvē huligāni. Standarta droŔības ieteikumi vienmēr iesaka pārvietot SSH uz citu portu, kas nekavējoties samazina žurnālu lielumu par lielumu.

Kriss Velons saka, ka viņa programma izmanto vienu specifikācijas punktu RFC 4253 uz SSH protokolu. TÅ«lÄ«t pēc TCP savienojuma izveides, bet pirms kriptogrāfijas lietoÅ”anas, abām pusēm ir jānosÅ«ta identifikācijas virkne. Un ir arÄ« piezÄ«me: "Serveris VAR sÅ«tÄ«t citas datu rindas pirms versijas rindas nosÅ«tÄ«Å”anas". Un nav ierobežojumu par Å”o datu apjomu, jums vienkārÅ”i jāsāk katra rinda ar SSH-.

Tas ir tieÅ”i tas, ko dara Endlessh programma: tā sÅ«ta bezgalÄ«gs nejauÅ”i Ä£enerētu datu plÅ«sma, kas atbilst RFC 4253, tas ir, nosÅ«ta pirms autentifikācijas, un katra rinda sākas ar SSH- un nepārsniedz 255 rakstzÄ«mes, ieskaitot rindiņas beigu rakstzÄ«mi. Kopumā viss ir pēc standarta.

Pēc noklusējuma programma gaida 10 sekundes starp pakeÅ”u nosÅ«tÄ«Å”anu. Tas novērÅ” klienta taimautu, tāpēc klients bÅ«s iesprostots uz visiem laikiem.

Tā kā dati tiek nosÅ«tÄ«ti pirms kriptogrāfijas piemēroÅ”anas, programma ir ļoti vienkārÅ”a. Tam nav jāievieÅ” nekādi Å”ifri, un tas atbalsta vairākus protokolus.

Autore centās nodroÅ”ināt, lai utilÄ«ta patērē minimālu resursu un strādā pilnÄ«gi nepamanÄ«ti uz maŔīnas. AtŔķirÄ«bā no mÅ«sdienu antivÄ«rusiem un citām "droŔības sistēmām", tam nevajadzētu palēnināt datora darbÄ«bu. Viņam izdevās samazināt gan trafika, gan atmiņas patēriņu, pateicoties nedaudz viltÄ«gākai programmatÅ«ras ievieÅ”anai. Ja tas vienkārÅ”i uzsāktu atseviŔķu procesu jaunam savienojumam, potenciālie uzbrucēji varētu uzsākt DDoS uzbrukumu, atverot vairākus savienojumus, lai iztērētu iekārtas resursus. Viens pavediens vienam savienojumam arÄ« nav labākais risinājums, jo kodols tērēs resursus, pārvaldot pavedienus.

Tāpēc Kriss Velons izvēlējās visvieglāko Endlessh opciju: viena pavediena serveri. poll(2), kur slazdā esoÅ”ie klienti praktiski nepatērē nekādus papildu resursus, neskaitot ligzdas objektu kodolā un vēl 78 baitus izsekoÅ”anai Endlessh. Lai izvairÄ«tos no katra klienta saņemÅ”anas un nosÅ«tÄ«Å”anas buferu pieŔķirÅ”anas, Endlessh atver tieŔās piekļuves ligzdu un tieÅ”i tulko TCP paketes, apejot gandrÄ«z visu operētājsistēmas TCP/IP steku. IenākoÅ”ais buferis vispār nav vajadzÄ«gs, jo mÅ«s neinteresē ienākoÅ”ie dati.

Autors saka, ka viņa programmas laikā nezināju par Python asycio un citu tarpitu esamÄ«bu. Ja viņŔ zinātu par asycio, viņŔ Python varētu ieviest savu utilÄ«tu tikai 18 rindās:

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 ir ideāli piemērots tarpitu rakstÄ«Å”anai. Piemēram, Å”is āķis iesaldēs Firefox, Chrome vai jebkuru citu klientu, kas daudzas stundas mēģina izveidot savienojumu ar jÅ«su HTTP serveri:

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 ir lielisks rÄ«ks tieÅ”saistes iebiedētāju sodÄ«Å”anai. Tiesa, pastāv zināms risks, gluži pretēji, pievērst viņu uzmanÄ«bu konkrēta servera neparastajai uzvedÄ«bai. Kāds varētu domāt par atriebÄ«bu un mērÄ·tiecÄ«gs DDoS uzbrukums jÅ«su IP. Taču lÄ«dz Å”im tādu gadÄ«jumu nav bijis, un tarpits strādā lieliski.

Slazds (tarpit) ienākoŔajiem SSH savienojumiem

Avots: www.habr.com

Pievieno komentāru