Ei ole saladus, et Internet on väga vaenulik keskkond. Niipea kui serveri käivitad, on see kohe massiliste rünnakute ja mitmete skaneerimiste sihtmärk. Näitena võib hinnata selle prügitrafiku ulatust. Tegelikult võib keskmisel serveril 99% liiklusest olla kahjulik.
Tarpit on pordilõks, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui kolmas süsteem selle pöördub, ei saa kiiresti ühendust sulgeda. Peab kasutama oma süsteemi ressursse ja ootama, kuni ühendus katkestatakse ajutine, või katkestama selle käsitsi.
Tavaliselt kasutatakse tarpitisid kaitseks. Tehnika töötati esmakordselt välja arvutiviiruste kaitsmiseks. Ja nüüd saab seda kasutada, et elu spammeritele ja uurijatele, kes skaneerivad järjest kõiki IP-aadresse, keeruliseks teha (näiteid Habr'i pealt: , ).
Ühel süsteemiadministraatoril nimega Chris Vellonsil tundus, et tal on sellest jaburusest piisavalt — ja ta kirjutas väikese programmi , tarpit SSH jaoks, mis aeglustab sisenevaid ühendusi. Programm avab portaali (ennekõike testimiseks on määratud port 2222) ja näitab välja SSH-serverina, samal ajal kui see loob lõputu ühenduse siseneva kliendiga, kuni viimane annab alla. See võib kesta mitu päeva või rohkem, kuni klient katkestab.
Utiliidi paigaldamine:
$ make
$ ./endlessh &
$ ssh -p2222 localhostKorrektselt rakendatud tarpit nõuab kurjategijalt rohkem ressursse kui sinult. Kuid asi ei ole ainult ressurssides. Autor , et programm tekitab sõltuvust. Praegu on tema lõksus 27 klienti, mõned neist on olnud ühendatud nädalaid. Tiputegevuse ajal oli lõksus 1378 klienti 20 tunni jooksul!
Tööpõhimõttel tuleb server Endlessh paigutada tavapärasele portile 22, kuhu massiliselt ründajad sisse kolivad. Tavalised turvaneuvood soovitavad alati tõsta SSH teisele portile, mis kohe kärbib logide mahtu.
Chris Wellons ütleb, et tema programm kasutab ära ühe lõigu spetsifikatsioonist SSH protokolli. Vahetult pärast TCP ühenduse loomist, kuid enne krüptograafia rakendamist peavad mõlemad pooled saatma identifitseerimisjoone. Ja seal samas lisatakse: „Server võib saata täiendavaid andmerekke enne versioonijoonte saatmist“. Ja ei ole piirangut neid andmeid mahule, lihtsalt iga rida peab hakkama SSH-.
Just seda teeb programm Endlessh: see saadetud lõputu juhuslikult genereeritud andmevoog, mis vastab RFC 4253, see tähendab, et andmed saadetakse enne identifitseerimist ning iga rida algab SSH- ja ei ületa 255 märki, sealhulgas ridade lõpus olevat tähist. Ühesõnaga, kõik on vastavalt standardile.
Vaikimisi ootab programm pakettide saatmise vahel 10 sekundit. See takistab ajaliselt välja lülitumist, nii et klient jääb lõksu igaveseks.
Kuna andmete saatmine toimub enne krüptograafia rakendamist, on programm äärmiselt lihtne. Sellel ei ole vaja rakendada mingeid krüpteerimisi ega toetada mitut protokolli.
Autor püüdis, et tööriist kasutaks minimaalset ressursi ja töötaks täiesti märkamatult seadmes. Erinevalt tänapäevastest viirustõrjetest ja muudest "turvasüsteemidest" ei tohi see arvutit pidurdada. Tal õnnestus minimeerida nii liiklus kui ka mälu tarbimist tänu veidi nutikamale tarkvarale. Kui ta lihtsalt käivitaks eraldi protsessi uue ühenduse jaoks, saaksid potentsiaalsed kurjategijad korraldada DDoS-rünnaku, avades arvukalt ühendusi, et ammendada seadme ressursse. Ühe vooga iga ühenduse jaoks ei oleks samuti parim variant, kuna tuum kulutab ressursse voogude haldamiseks.
Seetõttu valis Chris Vellons Endlessh jaoks kõige kergema variandi: ühesuunalise serveri poll(2), kus kliendid on kinni, praktiliselt ei kasuta liigseid ressursse, välja arvatud soketi objekt tuumas ja veel 78 baiti jälgimiseks Endlessh. Et mitte eraldada vastuvõtu ja saatmise puhvreid igale kliendile, avab Endlessh otseülekande soketi ja edastab TCP-pakette otse, ignoreerides peaaegu kogu TCP/IP operatsioonisüsteemi reeglit. Sissetulev puhver pole üldse vajalik, kuna meid ei huvita sissetulevad andmed.
Autor ütleb, et tema programmi ajal Python'i asycio ja teiste trapitite olemasolust. Kui ta oleks asycio'st teadnud, oleks ta oma utiliiti saanud rakendada vaid 18 reaga Python'is:
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 trapitite kirjutamiseks. Näiteks selline lõks viib Firefoxi, Chrome'i või mõne muu kliendi, kes üritab teie HTTP-serveriga ühendust luua, mitmeks tunniks ummikus:
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 internetikiusajate karistamiseks. Tõsi, on teatud oht, et see võib vastupidi, juhtida nende tähelepanu konkreetse serveri ebatavalisele käitumisele. Keegi ja sihtrünnale teie IP-le. Sellegipoolest pole selliseid juhtumeid seni olnud ning tarpiter töötavad suurepäraselt.
Hubid:
Python, Teabe turve, Tarkvara, Süsteemi haldus
Märgid:
SSH, Endlessh, tarpit, tarp, lõks, asyncio
SSH-ühenduste sissetulevate ühenduste tarpit
Ei ole saladus, et Internet on väga vaenulik keskkond. Niipea kui serveri käivitad, on see kohe massiliste rünnakute ja mitmete skaneerimiste sihtmärk. Näitena võib hinnata selle prügitrafiku ulatust. Tegelikult võib keskmisel serveril 99% liiklusest olla kahjulik.
Tarpit on pordilõks, mida kasutatakse sissetulevate ühenduste aeglustamiseks. Kui kolmas süsteem selle pöördub, ei saa kiiresti ühendust sulgeda. Peab kasutama oma süsteemi ressursse ja ootama, kuni ühendus katkestatakse ajutine, või katkestama selle käsitsi.
Tavaliselt kasutatakse tarpitisid kaitseks. Tehnika töötati esmakordselt välja arvutiviiruste kaitsmiseks. Ja nüüd saab seda kasutada, et elu spammeritele ja uurijatele, kes skaneerivad järjest kõiki IP-aadresse, keeruliseks teha (näiteid Habr'i pealt: , ).
Ühel süsteemiadministraatoril nimega Chris Vellonsil tundus, et tal on sellest jaburusest piisavalt — ja ta kirjutas väikese programmi , tarpit SSH jaoks, mis aeglustab sisenevaid ühendusi. Programm avab portaali (ennekõike testimiseks on määratud port 2222) ja näitab välja SSH-serverina, samal ajal kui see loob lõputu ühenduse siseneva kliendiga, kuni viimane annab alla. See võib kesta mitu päeva või rohkem, kuni klient katkestab.
Utiliidi paigaldamine:
$ make
$ ./endlessh &
$ ssh -p2222 localhostKorrektselt rakendatud tarpit nõuab kurjategijalt rohkem ressursse kui sinult. Kuid asi ei ole ainult ressurssides. Autor , et programm tekitab sõltuvust. Praegu on tema lõksus 27 klienti, mõned neist on olnud ühendatud nädalaid. Tiputegevuse ajal oli lõksus 1378 klienti 20 tunni jooksul!
Tööpõhimõttel tuleb server Endlessh paigutada tavapärasele portile 22, kuhu massiliselt ründajad sisse kolivad. Tavalised turvaneuvood soovitavad alati tõsta SSH teisele portile, mis kohe kärbib logide mahtu.
Chris Wellons ütleb, et tema programm kasutab ära ühe lõigu spetsifikatsioonist SSH protokolli. Vahetult pärast TCP ühenduse loomist, kuid enne krüptograafia rakendamist peavad mõlemad pooled saatma identifitseerimisjoone. Ja seal samas lisatakse: „Server võib saata täiendavaid andmerekke enne versioonijoonte saatmist“. Ja ei ole piirangut neid andmeid mahule, lihtsalt iga rida peab hakkama SSH-.
Just seda teeb programm Endlessh: see saadetud lõputu juhuslikult genereeritud andmevoog, mis vastab RFC 4253, see tähendab, et andmed saadetakse enne identifitseerimist ning iga rida algab SSH- ja ei ületa 255 märki, sealhulgas ridade lõpus olevat tähist. Ühesõnaga, kõik on vastavalt standardile.
Vaikimisi ootab programm pakettide saatmise vahel 10 sekundit. See takistab ajaliselt välja lülitumist, nii et klient jääb lõksu igaveseks.
Kuna andmete saatmine toimub enne krüptograafia rakendamist, on programm äärmiselt lihtne. Sellel ei ole vaja rakendada mingeid krüpteerimisi ega toetada mitut protokolli.
Autor püüdis, et tööriist kasutaks minimaalset ressursi ja töötaks täiesti märkamatult seadmes. Erinevalt tänapäevastest viirustõrjetest ja muudest "turvasüsteemidest" ei tohi see arvutit pidurdada. Tal õnnestus minimeerida nii liiklus kui ka mälu tarbimist tänu veidi nutikamale tarkvarale. Kui ta lihtsalt käivitaks eraldi protsessi uue ühenduse jaoks, saaksid potentsiaalsed kurjategijad korraldada DDoS-rünnaku, avades arvukalt ühendusi, et ammendada seadme ressursse. Ühe vooga iga ühenduse jaoks ei oleks samuti parim variant, kuna tuum kulutab ressursse voogude haldamiseks.
Seetõttu valis Chris Vellons Endlessh jaoks kõige kergema variandi: ühesuunalise serveri poll(2), kus kliendid on kinni, praktiliselt ei kasuta liigseid ressursse, välja arvatud soketi objekt tuumas ja veel 78 baiti jälgimiseks Endlessh. Et mitte eraldada vastuvõtu ja saatmise puhvreid igale kliendile, avab Endlessh otseülekande soketi ja edastab TCP-pakette otse, ignoreerides peaaegu kogu TCP/IP operatsioonisüsteemi reeglit. Sissetulev puhver pole üldse vajalik, kuna meid ei huvita sissetulevad andmed.
Autor ütleb, et tema programmi ajal Python'i asycio ja teiste trapitite olemasolust. Kui ta oleks asycio'st teadnud, oleks ta oma utiliiti saanud rakendada vaid 18 reaga Python'is:
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 trapitite kirjutamiseks. Näiteks selline lõks viib Firefoxi, Chrome'i või mõne muu kliendi, kes üritab teie HTTP-serveriga ühendust luua, mitmeks tunniks ummikus:
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 internetikiusajate karistamiseks. Tõsi, on teatud oht, et see võib vastupidi, juhtida nende tähelepanu konkreetse serveri ebatavalisele käitumisele. Keegi ja sihtrünnale teie IP-le. Sellegipoolest pole selliseid juhtumeid seni olnud ning tarpiter töötavad suurepäraselt.
Allikas: habr.com
