Nie je tajomstvom, že internet je veľmi nepriateľské prostredie. Hneď ako spustíte server, okamžite sa stáva terčom masívnych útokov a rôznych skenovaní. Na príklade je možné oceniť rozsah tohto odpadu. V skutočnosti môže byť na priemernom serveri 99% prevádzky škodlivej.
Tarpit je port-zároveň, ktorý sa používa na spomalenie prichádzajúcich pripojení. Ak sa externý systém pripojuje na tento port, rýchlo zavrieť pripojenie nebude možné. Musí využívať svoje systémové zdroje a čakať, kým sa pripojenie neukončí časovým limitom, alebo ho manuálne prerušovať.
Tarpity sa najčastejšie používajú na ochranu. Tento postup bol prvýkrát vyvinutý na ochranu pred počítačovými červami. A teraz ho možno použiť, aby spôsobil problémy spamerom a výskumníkom, ktorí sa zaoberajú hromadným skenovaním všetkých IP adries (príklady na Habr: , ).
Jednému zo systémových administrátorov menom Chris Wellons sa očividne zunovalo sledovať toto zlo, a tak napísal malý program , tarpit pre SSH, ktorý spomaľuje prichádzajúce pripojenia. Program otvorí port (pre testovanie je predvolene uvedený port 2222) a predstiera SSH server, pričom v skutočnosti vytvára nekonečné pripojenie s prichádzajúcim klientom, kým sa ten nevzdá. To môže trvať niekoľko dní alebo viac, pokým klient neodíde.
Inštalácia utility:
$ make
$ ./endlessh &
$ ssh -p2222 localhostSprávne realizovaný tarpit vezme útočníkovi viac zdrojov ako vám. Ale nejde len o zdroje. Autor , že program spôsobuje návyk. Práve teraz je v jeho pasci 27 klientov, niektorí z nich sú pripojení niekoľko týždňov. V čase najvyššej aktivity bolo v pasci 1378 klientov po dobu 20 hodín!
V prevádzkovom režime by sa server Endlessh mal nainštalovať na štandardný port 22, na ktorý bušia zlodeji. Štandardné bezpečnostné odporúčania vždy radia presunúť SSH na iný port, čo okamžite zmenšuje objem logov.
Chris Wellons hovorí, že jeho program využíva jeden odsek zo špecifikácie na protokol SSH. Ihneď po nadviazaní TCP spojenia, ale pred použitím šifrovania by mali obidve strany poslať identifikačný reťazec. A tam je aj poznámka: „Server MÔŽE poslať ďalšie riadky údajov pred odoslaním riadku s verziou“. A nie sú žiadne obmedzenia na objem týchto údajov, jednoducho každý riadok musí začínať s SSH-.
Presne toto robí program Endlessh: on odosiela nekonečný prúd náhodne generovaných údajov, ktoré zodpovedajú RFC 4253, to znamená odosielanie pred identifikáciou, pričom každý riadok začína s SSH- a nepresahuje 255 znakov, vrátane znaku ukončenia riadka. V zásade, všetko podľa štandardu.
Program predvolene očakáva 10 sekúnd medzi odosielaním paketov. To zabraňuje odpojeniu z dôvodu timeoutu, takže klient zostane v pasci navždy.
Keďže odosielanie údajov sa vykonáva pred použitím šifrovania, program je mimoriadne jednoduchý. Nie je potrebné implementovať žiadne šifry a podporu mnohých protokolov.
Autor sa snažil, aby utilita spotrebovala minimum zdrojov a pracovala úplne nenápadne na zariadení. Na rozdiel od súčasných antivírusov a iných „bezpečnostných systémov“ by nemala spomaľovať počítač. Podarilo sa mu minimalizovať aj prenos a spotrebu pamäte pomocou trochu premyslenejšej programovej realizácie. Keby jednoducho spustil samostatný proces pre nové spojenie, potenciálni útočníci by mohli vykonať DDoS útok otvorením množstva spojení na vyčerpanie zdrojov na zariadení. Jeden tok na spojenie - to tiež nie je najlepší variant, pretože jadro by míňalo zdroje na správu tokov.
Preto Chris Vellons zvolil pre Endlessh najľahší variant: jednoprvkový server poll(2), kde klienti v pasci prakticky nepodporujú zbytočné zdroje, okrem objektu soketu v jadre a ešte 78 bajtov na sledovanie v Endlessh. Aby sa nevytvárali buffery pre prijímanie a odosielanie pre každého klienta, Endlessh otvára socket priameho prístupu a priamo vysiela pakety TCP, pričom ignoruje takmer celý TCP/IP zásobník operačného systému. Prichádzajúci buffer nie je vôbec potrebný, pretože prichádzajúce údaje nás nezaujímajú.
Autor hovorí, že v čase svojej programy o existencii Pythonovského asycio a iných tarpitoch. Keby vedel o asycio, mohol by svoju utilitu realizovať iba v 18 riadkoch na Pythone:
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 je ideálne na písanie tarpitoch. Napríklad taká pasca na mnoho hodín zablokuje Firefox, Chrome alebo iného klienta, ktorý sa pokúša pripojiť k vášmu HTTP serveru:
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 je výborný nástroj na potrestanie internetových zlodejov. Pravda, existuje nejaké riziko, že naopak pritiahnete ich pozornosť k nezvyčajnému správaniu konkrétneho servera. Niekto a zamerať sa na DDoS útok na vašu IP. Avšak, zatiaľ neboli také prípady a tarpity fungujú výborne.
Huby:
Python, Informačná bezpečnosť, Softvér, Systémové administratívne práce
Tagy:
SSH, Endlessh, tarpit, tarpity, pasca, asycio
Záchytný bod (tarpit) pre prichádzajúce SSH pripojenia
Nie je tajomstvom, že internet je veľmi nepriateľské prostredie. Hneď ako spustíte server, okamžite sa stáva terčom masívnych útokov a rôznych skenovaní. Na príklade je možné oceniť rozsah tohto odpadu. V skutočnosti môže byť na priemernom serveri 99% prevádzky škodlivej.
Tarpit je port-zároveň, ktorý sa používa na spomalenie prichádzajúcich pripojení. Ak sa externý systém pripojuje na tento port, rýchlo zavrieť pripojenie nebude možné. Musí využívať svoje systémové zdroje a čakať, kým sa pripojenie neukončí časovým limitom, alebo ho manuálne prerušovať.
Tarpity sa najčastejšie používajú na ochranu. Tento postup bol prvýkrát vyvinutý na ochranu pred počítačovými červami. A teraz ho možno použiť, aby spôsobil problémy spamerom a výskumníkom, ktorí sa zaoberajú hromadným skenovaním všetkých IP adries (príklady na Habr: , ).
Jednému zo systémových administrátorov menom Chris Wellons sa očividne zunovalo sledovať toto zlo, a tak napísal malý program , tarpit pre SSH, ktorý spomaľuje prichádzajúce pripojenia. Program otvorí port (pre testovanie je predvolene uvedený port 2222) a predstiera SSH server, pričom v skutočnosti vytvára nekonečné pripojenie s prichádzajúcim klientom, kým sa ten nevzdá. To môže trvať niekoľko dní alebo viac, pokým klient neodíde.
Inštalácia utility:
$ make
$ ./endlessh &
$ ssh -p2222 localhostSprávne realizovaný tarpit vezme útočníkovi viac zdrojov ako vám. Ale nejde len o zdroje. Autor , že program spôsobuje návyk. Práve teraz je v jeho pasci 27 klientov, niektorí z nich sú pripojení niekoľko týždňov. V čase najvyššej aktivity bolo v pasci 1378 klientov po dobu 20 hodín!
V prevádzkovom režime by sa server Endlessh mal nainštalovať na štandardný port 22, na ktorý bušia zlodeji. Štandardné bezpečnostné odporúčania vždy radia presunúť SSH na iný port, čo okamžite zmenšuje objem logov.
Chris Wellons hovorí, že jeho program využíva jeden odsek zo špecifikácie na protokol SSH. Ihneď po nadviazaní TCP spojenia, ale pred použitím šifrovania by mali obidve strany poslať identifikačný reťazec. A tam je aj poznámka: „Server MÔŽE poslať ďalšie riadky údajov pred odoslaním riadku s verziou“. A nie sú žiadne obmedzenia na objem týchto údajov, jednoducho každý riadok musí začínať s SSH-.
Presne toto robí program Endlessh: on odosiela nekonečný prúd náhodne generovaných údajov, ktoré zodpovedajú RFC 4253, to znamená odosielanie pred identifikáciou, pričom každý riadok začína s SSH- a nepresahuje 255 znakov, vrátane znaku ukončenia riadka. V zásade, všetko podľa štandardu.
Program predvolene očakáva 10 sekúnd medzi odosielaním paketov. To zabraňuje odpojeniu z dôvodu timeoutu, takže klient zostane v pasci navždy.
Keďže odosielanie údajov sa vykonáva pred použitím šifrovania, program je mimoriadne jednoduchý. Nie je potrebné implementovať žiadne šifry a podporu mnohých protokolov.
Autor sa snažil, aby utilita spotrebovala minimum zdrojov a pracovala úplne nenápadne na zariadení. Na rozdiel od súčasných antivírusov a iných „bezpečnostných systémov“ by nemala spomaľovať počítač. Podarilo sa mu minimalizovať aj prenos a spotrebu pamäte pomocou trochu premyslenejšej programovej realizácie. Keby jednoducho spustil samostatný proces pre nové spojenie, potenciálni útočníci by mohli vykonať DDoS útok otvorením množstva spojení na vyčerpanie zdrojov na zariadení. Jeden tok na spojenie - to tiež nie je najlepší variant, pretože jadro by míňalo zdroje na správu tokov.
Preto Chris Vellons zvolil pre Endlessh najľahší variant: jednoprvkový server poll(2), kde klienti v pasci prakticky nepodporujú zbytočné zdroje, okrem objektu soketu v jadre a ešte 78 bajtov na sledovanie v Endlessh. Aby sa nevytvárali buffery pre prijímanie a odosielanie pre každého klienta, Endlessh otvára socket priameho prístupu a priamo vysiela pakety TCP, pričom ignoruje takmer celý TCP/IP zásobník operačného systému. Prichádzajúci buffer nie je vôbec potrebný, pretože prichádzajúce údaje nás nezaujímajú.
Autor hovorí, že v čase svojej programy o existencii Pythonovského asycio a iných tarpitoch. Keby vedel o asycio, mohol by svoju utilitu realizovať iba v 18 riadkoch na Pythone:
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 je ideálne na písanie tarpitoch. Napríklad taká pasca na mnoho hodín zablokuje Firefox, Chrome alebo iného klienta, ktorý sa pokúša pripojiť k vášmu HTTP serveru:
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 je výborný nástroj na potrestanie internetových zlodejov. Pravda, existuje nejaké riziko, že naopak pritiahnete ich pozornosť k nezvyčajnému správaniu konkrétneho servera. Niekto a zamerať sa na DDoS útok na vašu IP. Avšak, zatiaľ neboli také prípady a tarpity fungujú výborne.
Zdroj: habr.com
