Trap (tarpit) para sa mga papasok na koneksyon sa SSH

Hindi lihim na ang Internet ay isang napakasamang kapaligiran. Sa sandaling itaas mo ang isang server, agad itong sasailalim sa napakalaking pag-atake at maraming pag-scan. Halimbawa honeypot mula sa mga security guard maaari mong tantiyahin ang laki ng trapikong ito ng basura. Sa katunayan, sa karaniwang server, 99% ng trapiko ay maaaring nakakahamak.

Ang tarpit ay isang trap port na ginagamit upang pabagalin ang mga papasok na koneksyon. Kung kumokonekta ang isang third-party system sa port na ito, hindi mo magagawang mabilis na isara ang koneksyon. Kakailanganin niyang sayangin ang kanyang mga mapagkukunan ng system at maghintay hanggang sa mag-timeout ang koneksyon, o manu-manong wakasan ito.

Kadalasan, ang mga tarpit ay ginagamit para sa proteksyon. Ang pamamaraan ay unang binuo upang maprotektahan laban sa mga worm sa computer. At ngayon ay magagamit na ito upang sirain ang buhay ng mga spammer at mananaliksik na nakikibahagi sa malawak na pag-scan ng lahat ng magkakasunod na IP address (mga halimbawa sa HabrΓ©: Awstrya, Ukraina).

Ang isa sa mga tagapangasiwa ng system na nagngangalang Chris Wellons ay tila napagod sa panonood ng kahihiyan na ito - at nagsulat siya ng isang maliit na programa Walang katapusang, isang tarpit para sa SSH na nagpapabagal sa mga papasok na koneksyon. Ang programa ay nagbubukas ng isang port (ang default na port para sa pagsubok ay 2222) at nagpapanggap na isang SSH server, ngunit sa katotohanan ay nagtatatag ito ng walang katapusang koneksyon sa papasok na kliyente hanggang sa ito ay sumuko. Ito ay maaaring magpatuloy ng ilang araw o higit pa hanggang sa mahulog ang kliyente.

Pag-install ng utility:

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

Ang wastong ipinatupad na tarpit ay kukuha ng mas maraming mapagkukunan mula sa umaatake kaysa sa iyo. Ngunit ito ay hindi kahit na isang bagay ng mga mapagkukunan. May-akda writesna ang programa ay nakakahumaling. Sa ngayon, mayroon itong 27 mga kliyente na nakulong, ang ilan sa kanila ay konektado sa loob ng ilang linggo. Sa pinakamataas na aktibidad, 1378 kliyente ang nakulong sa loob ng 20 oras!

Sa operating mode, kailangang mai-install ang Endlessh server sa karaniwang port 22, kung saan kumakatok nang maramihan ang mga hooligan. Palaging pinapayuhan ng mga karaniwang rekomendasyon sa seguridad ang paglipat ng SSH sa ibang port, na agad na binabawasan ang laki ng mga log ayon sa pagkakasunud-sunod ng magnitude.

Sinabi ni Chris Wellons na sinasamantala ng kanyang programa ang isang talata ng detalye RFC 4253 sa SSH protocol. Kaagad pagkatapos maitatag ang koneksyon ng TCP, ngunit bago mailapat ang cryptography, dapat magpadala ang magkabilang panig ng string ng pagkakakilanlan. At mayroon ding isang tala: "MAAARING magpadala ang server ng iba pang mga row ng data bago ipadala ang version row". At walang limitasyon sa dami ng data na ito, kailangan mo lang simulan ang bawat linya gamit ang SSH-.

Ito mismo ang ginagawa ng Endlessh program: ito nagpapadala walang katapusang stream ng random na nabuong data, na sumusunod sa RFC 4253, iyon ay, ipadala bago ang pagpapatunay, at ang bawat linya ay nagsisimula sa SSH- at hindi lalampas sa 255 character, kasama ang line ending character. Sa pangkalahatan, ang lahat ay ayon sa pamantayan.

Bilang default, ang programa ay naghihintay ng 10 segundo sa pagitan ng pagpapadala ng mga packet. Pinipigilan nito ang kliyente na ma-time out, kaya ang kliyente ay ma-trap nang tuluyan.

Dahil ang data ay ipinadala bago ilapat ang cryptography, ang programa ay napakasimple. Hindi nito kailangang magpatupad ng anumang mga cipher at sumusuporta sa maramihang mga protocol.

Sinubukan ng may-akda na tiyakin na ang utility ay kumonsumo ng isang minimum na mga mapagkukunan at gumagana nang ganap na hindi napapansin sa makina. Hindi tulad ng mga modernong antivirus at iba pang β€œsecurity system,” hindi nito dapat pabagalin ang iyong computer. Nagawa niyang bawasan ang parehong pagkonsumo ng trapiko at memorya dahil sa bahagyang mas tusong pagpapatupad ng software. Kung naglunsad lang ito ng hiwalay na proseso sa isang bagong koneksyon, ang mga potensyal na umaatake ay maaaring maglunsad ng pag-atake ng DDoS sa pamamagitan ng pagbubukas ng maraming koneksyon upang maubos ang mga mapagkukunan sa makina. Ang isang thread sa bawat koneksyon ay hindi rin ang pinakamahusay na pagpipilian, dahil ang kernel ay mag-aaksaya ng mga mapagkukunan sa pamamahala ng mga thread.

Iyon ang dahilan kung bakit pinili ni Chris Wellons ang pinaka magaan na opsyon para sa Endlessh: isang single-threaded server poll(2), kung saan ang mga kliyente sa bitag ay halos walang dagdag na mapagkukunan, hindi binibilang ang socket object sa kernel at isa pang 78 byte para sa pagsubaybay sa Endlessh. Upang maiwasang maglaan ng pagtanggap at pagpapadala ng mga buffer para sa bawat kliyente, ang Endlessh ay nagbubukas ng direktang access socket at direktang nagsasalin ng mga TCP packet, na lumalampas sa halos buong operating system na TCP/IP stack. Ang papasok na buffer ay hindi kailangan, dahil hindi kami interesado sa papasok na data.

Sinabi ng may-akda na sa oras ng kanyang programa hindi alam tungkol sa pagkakaroon ng asycio ni Python at iba pang tarpits. Kung alam niya ang tungkol sa asycio, maaari niyang ipatupad ang kanyang utility sa 18 linya lamang sa 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())

Ang Asyncio ay mainam para sa pagsulat ng mga tarpit. Halimbawa, i-freeze ng hook na ito ang Firefox, Chrome, o anumang iba pang kliyente na sumusubok na kumonekta sa iyong HTTP server sa loob ng maraming oras:

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

Ang Tarpit ay isang mahusay na tool para sa pagpaparusa sa mga online na nananakot. Totoo, may ilang panganib, sa kabaligtaran, na maakit ang kanilang pansin sa hindi pangkaraniwang pag-uugali ng isang partikular na server. Isang tao baka isipin ang paghihiganti at isang naka-target na pag-atake ng DDoS sa iyong IP. Gayunpaman, sa ngayon ay walang ganoong mga kaso, at ang mga tarpit ay gumagana nang mahusay.

Mga Hub:
Python, Seguridad ng impormasyon, Software, Pangangasiwa ng system

Mga Tag:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) para sa mga papasok na koneksyon sa SSH

Hindi lihim na ang Internet ay isang napakasamang kapaligiran. Sa sandaling itaas mo ang isang server, agad itong sasailalim sa napakalaking pag-atake at maraming pag-scan. Halimbawa honeypot mula sa mga security guard maaari mong tantiyahin ang laki ng trapikong ito ng basura. Sa katunayan, sa karaniwang server, 99% ng trapiko ay maaaring nakakahamak.

Ang tarpit ay isang trap port na ginagamit upang pabagalin ang mga papasok na koneksyon. Kung kumokonekta ang isang third-party system sa port na ito, hindi mo magagawang mabilis na isara ang koneksyon. Kakailanganin niyang sayangin ang kanyang mga mapagkukunan ng system at maghintay hanggang sa mag-timeout ang koneksyon, o manu-manong wakasan ito.

Kadalasan, ang mga tarpit ay ginagamit para sa proteksyon. Ang pamamaraan ay unang binuo upang maprotektahan laban sa mga worm sa computer. At ngayon ay magagamit na ito upang sirain ang buhay ng mga spammer at mananaliksik na nakikibahagi sa malawak na pag-scan ng lahat ng magkakasunod na IP address (mga halimbawa sa HabrΓ©: Awstrya, Ukraina).

Ang isa sa mga tagapangasiwa ng system na nagngangalang Chris Wellons ay tila napagod sa panonood ng kahihiyan na ito - at nagsulat siya ng isang maliit na programa Walang katapusang, isang tarpit para sa SSH na nagpapabagal sa mga papasok na koneksyon. Ang programa ay nagbubukas ng isang port (ang default na port para sa pagsubok ay 2222) at nagpapanggap na isang SSH server, ngunit sa katotohanan ay nagtatatag ito ng walang katapusang koneksyon sa papasok na kliyente hanggang sa ito ay sumuko. Ito ay maaaring magpatuloy ng ilang araw o higit pa hanggang sa mahulog ang kliyente.

Pag-install ng utility:

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

Ang wastong ipinatupad na tarpit ay kukuha ng mas maraming mapagkukunan mula sa umaatake kaysa sa iyo. Ngunit ito ay hindi kahit na isang bagay ng mga mapagkukunan. May-akda writesna ang programa ay nakakahumaling. Sa ngayon, mayroon itong 27 mga kliyente na nakulong, ang ilan sa kanila ay konektado sa loob ng ilang linggo. Sa pinakamataas na aktibidad, 1378 kliyente ang nakulong sa loob ng 20 oras!

Sa operating mode, kailangang mai-install ang Endlessh server sa karaniwang port 22, kung saan kumakatok nang maramihan ang mga hooligan. Palaging pinapayuhan ng mga karaniwang rekomendasyon sa seguridad ang paglipat ng SSH sa ibang port, na agad na binabawasan ang laki ng mga log ayon sa pagkakasunud-sunod ng magnitude.

Sinabi ni Chris Wellons na sinasamantala ng kanyang programa ang isang talata ng detalye RFC 4253 sa SSH protocol. Kaagad pagkatapos maitatag ang koneksyon ng TCP, ngunit bago mailapat ang cryptography, dapat magpadala ang magkabilang panig ng string ng pagkakakilanlan. At mayroon ding isang tala: "MAAARING magpadala ang server ng iba pang mga row ng data bago ipadala ang version row". At walang limitasyon sa dami ng data na ito, kailangan mo lang simulan ang bawat linya gamit ang SSH-.

Ito mismo ang ginagawa ng Endlessh program: ito nagpapadala walang katapusang stream ng random na nabuong data, na sumusunod sa RFC 4253, iyon ay, ipadala bago ang pagpapatunay, at ang bawat linya ay nagsisimula sa SSH- at hindi lalampas sa 255 character, kasama ang line ending character. Sa pangkalahatan, ang lahat ay ayon sa pamantayan.

Bilang default, ang programa ay naghihintay ng 10 segundo sa pagitan ng pagpapadala ng mga packet. Pinipigilan nito ang kliyente na ma-time out, kaya ang kliyente ay ma-trap nang tuluyan.

Dahil ang data ay ipinadala bago ilapat ang cryptography, ang programa ay napakasimple. Hindi nito kailangang magpatupad ng anumang mga cipher at sumusuporta sa maramihang mga protocol.

Sinubukan ng may-akda na tiyakin na ang utility ay kumonsumo ng isang minimum na mga mapagkukunan at gumagana nang ganap na hindi napapansin sa makina. Hindi tulad ng mga modernong antivirus at iba pang β€œsecurity system,” hindi nito dapat pabagalin ang iyong computer. Nagawa niyang bawasan ang parehong pagkonsumo ng trapiko at memorya dahil sa bahagyang mas tusong pagpapatupad ng software. Kung naglunsad lang ito ng hiwalay na proseso sa isang bagong koneksyon, ang mga potensyal na umaatake ay maaaring maglunsad ng pag-atake ng DDoS sa pamamagitan ng pagbubukas ng maraming koneksyon upang maubos ang mga mapagkukunan sa makina. Ang isang thread sa bawat koneksyon ay hindi rin ang pinakamahusay na pagpipilian, dahil ang kernel ay mag-aaksaya ng mga mapagkukunan sa pamamahala ng mga thread.

Iyon ang dahilan kung bakit pinili ni Chris Wellons ang pinaka magaan na opsyon para sa Endlessh: isang single-threaded server poll(2), kung saan ang mga kliyente sa bitag ay halos walang dagdag na mapagkukunan, hindi binibilang ang socket object sa kernel at isa pang 78 byte para sa pagsubaybay sa Endlessh. Upang maiwasang maglaan ng pagtanggap at pagpapadala ng mga buffer para sa bawat kliyente, ang Endlessh ay nagbubukas ng direktang access socket at direktang nagsasalin ng mga TCP packet, na lumalampas sa halos buong operating system na TCP/IP stack. Ang papasok na buffer ay hindi kailangan, dahil hindi kami interesado sa papasok na data.

Sinabi ng may-akda na sa oras ng kanyang programa hindi alam tungkol sa pagkakaroon ng asycio ni Python at iba pang tarpits. Kung alam niya ang tungkol sa asycio, maaari niyang ipatupad ang kanyang utility sa 18 linya lamang sa 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())

Ang Asyncio ay mainam para sa pagsulat ng mga tarpit. Halimbawa, i-freeze ng hook na ito ang Firefox, Chrome, o anumang iba pang kliyente na sumusubok na kumonekta sa iyong HTTP server sa loob ng maraming oras:

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

Ang Tarpit ay isang mahusay na tool para sa pagpaparusa sa mga online na nananakot. Totoo, may ilang panganib, sa kabaligtaran, na maakit ang kanilang pansin sa hindi pangkaraniwang pag-uugali ng isang partikular na server. Isang tao baka isipin ang paghihiganti at isang naka-target na pag-atake ng DDoS sa iyong IP. Gayunpaman, sa ngayon ay walang ganoong mga kaso, at ang mga tarpit ay gumagana nang mahusay.

Trap (tarpit) para sa mga papasok na koneksyon sa SSH

Pinagmulan: www.habr.com

Magdagdag ng komento