Lákadlo (tarpit) pro příchozí SSH připojení

Není tajemstvím, že internet je velmi nepřátelské prostředí. Jakmile spustíte server, okamžitě se vystavujete intenzivním útokům a množství skenování. Na příkladu honeypota od bezpečnostních expertů můžeme posoudit rozsah tohoto odpadkového provozu. Ve skutečnosti může na průměrném serveru být 99 % provozu škodlivé.

Tarpit je portová past, která se používá ke zpomalení příchozích spojení. Pokud se třetí systém připojí k tomuto portu, rychle uzavřít spojení nebude možné. Bude muset vyčerpat své systémové zdroje a čekat, až spojení nebude přerušeno kvůli timeoutu, nebo ho manuálně přerušit.

Nejčastěji se tarpity používají na ochranu. Tato technika byla poprvé vyvinuta k ochraně proti počítačovým červům. A nyní ji lze využít k znepříjemnění života spammerům a výzkumníkům, kteří se věnují rozsáhlému skenování všech IP adres za sebou (příklady na Habr: Rakousko, Ukrajina).

Jednomu z administrátorů, jménem Chris Wellons, zřejmě přestalo bavit sledovat tuto nepořádek — a napsal malý program Endlessh, tarpity pro SSH, který zpomaluje příchozí spojení. Program otevře port (ve výchozím nastavení je pro testování uveden port 2222) a tváří se jako SSH server, ale ve skutečnosti vytváří nekonečné spojení s příchozím klientem, dokud se nevzdá. To může trvat několik dní nebo déle, dokud klient nevypadne.

Instalace utility:

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

Správně implementovaný tarpity odebere útočníkovi více zdrojů než vám. Ale jde nejen o zdroje. Autor píše, že program vyvolává závislost. Právě teď má v jeho pasti 27 klientů, někteří jsou připojeni po týdny. V špičce aktivity bylo v pasti 1378 klientů po dobu 20 hodin!

V provozním režimu je třeba server Endlessh umístit na běžný port 22, na který masivně útočí zloději. Standardní bezpečnostní doporučení vždy radí přesunout SSH na jiný port, což okamžitě výrazně zkracuje velikost logů.

Chris Wellons říká, že jeho program využívá jeden odstavec ze specifikace RFC 4253 o protokolu SSH. Ihned po navázání spojení TCP, ale před použitím kryptografie, by se obě strany měly poslat identifikační řetězec. A tam je také poznámka: „Server může poslat další řádky dat před odesláním řádku s verzí“. A žádné omezení na objem těchto dat, pouze každý řádek by měl začínat s SSH-.

Tímto se zabývá program Endlessh: vytváří odesílá nekonečný tok náhodně generovaných dat, které odpovídají RFC 4253, to znamená, že jsou odesílány před identifikací, a každý řádek začíná s SSH- a nepřesahuje 255 znaků včetně koncového znaku řádku. Celkově je to v souladu se standardem.

Ve defaultním nastavení program čeká 10 sekund mezi odesíláním paketů. To zabraňuje odpojení kvůli timeoutu, takže klient zůstane uvězněn navždy.

Protože odesílání dat probíhá před aplikací šifrování, je program výjimečně jednoduchý. Není třeba implementovat žádné šifry a podporu mnoha protokolů.

Autor se snažil, aby utilita spotřebovávala minimum zdrojů a fungovala zcela nenápadně na stroji. Na rozdíl od moderních antivirů a jiných ‚bezpečnostních systémů‘ by neměla zpomalovat počítač. Podařilo se minimalizovat jak provoz, tak i spotřebu paměti díky trochu chytřejší programové implementaci. Kdyby prostě spouštěl samostatný proces na nové spojení, potenciální útočníci by mohli provést DDoS útok otevřením mnoha spojení k vyčerpání zdrojů na stroji. Jeden tok na spojení — také není nejlepší varianta, protože jádro by plýtvalo zdroji na správu toků.

Proto Chris Vellons zvolil pro Endlessh nejlehčí variantu: jednovláknový server poll(2), kde klienti v pasti prakticky nepoužívají žádné další zdroje, kromě objektu socketu v jádře a ještě 78 bytů pro sledování v Endlessh. Aby nemuseli alokovat vyrovnávací paměti pro příjem a odesílání pro každého klienta, Endlessh otvírá socket přímého přístupu a přímo přenáší TCP pakety, téměř ignoruje celý TCP/IP stack operačního systému. Přicházející buffer vůbec není potřeba, protože příchozí data nás nezajímají.

Autor říká, že v době vytváření své aplikace nevěděl o existenci pythonovského asycio a dalších triviálních implementacích. Kdyby věděl o asycio, mohl by svou utilitu realizovat pouze v 18 řádcích v Pythonu:

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 perfektní pro psaní tarpits. Například taková past by mohla na dlouhou dobu zmrazit Firefox, Chrome nebo jiného klienta, který se pokouší připojit k vašemu 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 skvělý nástroj k potrestání internetových barbrů. Samozřejmě existuje určité riziko, že naopak přitáhnete jejich pozornost neobvyklým chováním konkrétního serveru. Někdo může pomyslet na pomstu a cílený DDoS útok na vaši IP adresu. Ačkoliv, zatím se takové případy nevyskytly a tarpity fungují skvěle.

Kategorie:
Python, Bezpečnost informací, Software, Systémová administrace

Štítky:
SSH, Endlessh, tarpit, past, asyncio
Lákadlo (tarpit) pro příchozí SSH připojení

Není tajemstvím, že internet je velmi nepřátelské prostředí. Jakmile spustíte server, okamžitě se vystavujete intenzivním útokům a množství skenování. Na příkladu honeypota od bezpečnostních expertů můžeme posoudit rozsah tohoto odpadkového provozu. Ve skutečnosti může na průměrném serveru být 99 % provozu škodlivé.

Tarpit je portová past, která se používá ke zpomalení příchozích spojení. Pokud se třetí systém připojí k tomuto portu, rychle uzavřít spojení nebude možné. Bude muset vyčerpat své systémové zdroje a čekat, až spojení nebude přerušeno kvůli timeoutu, nebo ho manuálně přerušit.

Nejčastěji se tarpity používají na ochranu. Tato technika byla poprvé vyvinuta k ochraně proti počítačovým červům. A nyní ji lze využít k znepříjemnění života spammerům a výzkumníkům, kteří se věnují rozsáhlému skenování všech IP adres za sebou (příklady na Habr: Rakousko, Ukrajina).

Jednomu z administrátorů, jménem Chris Wellons, zřejmě přestalo bavit sledovat tuto nepořádek — a napsal malý program Endlessh, tarpity pro SSH, který zpomaluje příchozí spojení. Program otevře port (ve výchozím nastavení je pro testování uveden port 2222) a tváří se jako SSH server, ale ve skutečnosti vytváří nekonečné spojení s příchozím klientem, dokud se nevzdá. To může trvat několik dní nebo déle, dokud klient nevypadne.

Instalace utility:

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

Správně implementovaný tarpity odebere útočníkovi více zdrojů než vám. Ale jde nejen o zdroje. Autor píše, že program vyvolává závislost. Právě teď má v jeho pasti 27 klientů, někteří jsou připojeni po týdny. V špičce aktivity bylo v pasti 1378 klientů po dobu 20 hodin!

V provozním režimu je třeba server Endlessh umístit na běžný port 22, na který masivně útočí zloději. Standardní bezpečnostní doporučení vždy radí přesunout SSH na jiný port, což okamžitě výrazně zkracuje velikost logů.

Chris Wellons říká, že jeho program využívá jeden odstavec ze specifikace RFC 4253 o protokolu SSH. Ihned po navázání spojení TCP, ale před použitím kryptografie, by se obě strany měly poslat identifikační řetězec. A tam je také poznámka: „Server může poslat další řádky dat před odesláním řádku s verzí“. A žádné omezení na objem těchto dat, pouze každý řádek by měl začínat s SSH-.

Tímto se zabývá program Endlessh: vytváří odesílá nekonečný tok náhodně generovaných dat, které odpovídají RFC 4253, to znamená, že jsou odesílány před identifikací, a každý řádek začíná s SSH- a nepřesahuje 255 znaků včetně koncového znaku řádku. Celkově je to v souladu se standardem.

Ve defaultním nastavení program čeká 10 sekund mezi odesíláním paketů. To zabraňuje odpojení kvůli timeoutu, takže klient zůstane uvězněn navždy.

Protože odesílání dat probíhá před aplikací šifrování, je program výjimečně jednoduchý. Není třeba implementovat žádné šifry a podporu mnoha protokolů.

Autor se snažil, aby utilita spotřebovávala minimum zdrojů a fungovala zcela nenápadně na stroji. Na rozdíl od moderních antivirů a jiných ‚bezpečnostních systémů‘ by neměla zpomalovat počítač. Podařilo se minimalizovat jak provoz, tak i spotřebu paměti díky trochu chytřejší programové implementaci. Kdyby prostě spouštěl samostatný proces na nové spojení, potenciální útočníci by mohli provést DDoS útok otevřením mnoha spojení k vyčerpání zdrojů na stroji. Jeden tok na spojení — také není nejlepší varianta, protože jádro by plýtvalo zdroji na správu toků.

Proto Chris Vellons zvolil pro Endlessh nejlehčí variantu: jednovláknový server poll(2), kde klienti v pasti prakticky nepoužívají žádné další zdroje, kromě objektu socketu v jádře a ještě 78 bytů pro sledování v Endlessh. Aby nemuseli alokovat vyrovnávací paměti pro příjem a odesílání pro každého klienta, Endlessh otvírá socket přímého přístupu a přímo přenáší TCP pakety, téměř ignoruje celý TCP/IP stack operačního systému. Přicházející buffer vůbec není potřeba, protože příchozí data nás nezajímají.

Autor říká, že v době vytváření své aplikace nevěděl o existenci pythonovského asycio a dalších triviálních implementacích. Kdyby věděl o asycio, mohl by svou utilitu realizovat pouze v 18 řádcích v Pythonu:

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 perfektní pro psaní tarpits. Například taková past by mohla na dlouhou dobu zmrazit Firefox, Chrome nebo jiného klienta, který se pokouší připojit k vašemu 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 skvělý nástroj k potrestání internetových barbrů. Samozřejmě existuje určité riziko, že naopak přitáhnete jejich pozornost neobvyklým chováním konkrétního serveru. Někdo může pomyslet na pomstu a cílený DDoS útok na vaši IP adresu. Ačkoliv, zatím se takové případy nevyskytly a tarpity fungují skvěle.

Lákadlo (tarpit) pro příchozí SSH připojení

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster