Honeypot (tarpit) a bejövő SSH kapcsolatokhoz

Nem titok, hogy az internet egy nagyon ellenséges környezet. Amint bekapcsol egy szervert, azonnal tömeges támadásoknak és számos szkennelésnek van kitéve. Egy példa alapján a biztonsági szakemberek által készített honeypotra meg lehet ítélni ennek a szemétforgalomnak a mértékét. Valójában egy átlagos szerveren a forgalom 99%-a káros lehet.

A Tarpit egy portcsapda, amelyet a bejövő kapcsolatok lelassítására használnak. Ha egy külső rendszer csatlakozik ehhez a portra, nem lehet gyorsan bezárni a kapcsolatot. A rendszer a saját erőforrásait fogja felhasználni, és várnia kell, amíg a kapcsolat időkorlát miatt megszakad, vagy kézzel kell megszakítania azt.

A tarpitet leggyakrabban védelemre használják. Ezt a technikát először számítógépes féreg elleni védelemre fejlesztették ki. Most már arra is használható, hogy megkeserítse a spammerek és a széleskörű IP-címek szkennelésével foglalkozó kutatók életét (példák a Habr-on: Ausztria, Ukrajna).

Egy Chris Vellons nevű rendszergazdának valószínűleg elege lett a rendezett káoszból — és írt egy kis programot Endlessh, egy SSH tarpitet, amely lelassítja a bejövő kapcsolatokat. A program megnyit egy portot (alapértelmezés szerint a teszteléshez a 2222-es port van megadva), és úgy tesz, mintha SSH-szerver lenne, valójában pedig végtelen kapcsolatot létesít a bejövő klienssel, amíg az fel nem adja. Ez akár több napig is eltarthat, amíg a kliens le nem kapcsolódik.

A program telepítése:

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

A helyesen megvalósított tarpité több forrást von el a támadótól, mint neked. De a lényeg nem is a forrásokban rejlik. A szerző Ki vezeti be az IPv6-ot, és mi lassítja annak fejlődését?, hogy a program függőséget okoz. Jelenleg 27 kliens van a csapdájában, közülük néhány hete csatlakozott. A csapdában a csúcsidőszakban 1378 kliens ült 20 órán keresztül!

Működés közben az Endlessh szervert a szokásos 22-es portra kell telepíteni, amelyre tömegesen próbálnak bejutni a zaklatók. A biztonsági ajánlások mindig azt javasolják, hogy az SSH-t egy másik portra helyezzék, ami azonnal jelentősen csökkenti a napló méretét.

Chris Vellons szerint a programja kihasznál egy bekezdést az RFC 4253 SSH protokoll specifikációjából. Azonnal a TCP-kapcsolat létrehozása után, de a titkosítás alkalmazása előtt mindkét félnek elküldenie kell az azonosító karakterláncot. És itt van az utalás: A szerver MÁS más adatokat küldhet, mielőtt elküldené a verziót tartalmazó sort.. És nincs korlátozás az adatok mennyiségére, csak minden sort a következővel kell kezdeni SSH-.

Erre szolgál az Endlessh program: a küldi végtelen véletlenszerűen generált adatok áramlása, amelyek megfelelnek az RFC 4253-nak, azaz az azonosítás előtti küldés, és minden sor a következővel kezdődik SSH- és nem haladja meg a 255 karaktert, beleértve a sort végző karaktert is. Összességében minden a szabvány szerint van.

Alapértelmezés szerint a program 10 másodpercet vár az adatcsomagok küldése között. Ez megelőzi az időtúllépés általi lecsatlakozást, így az ügyfél gyakorlatilag végtelen ideig fog ülni a csapdában.

Mivel az adatok küldése a titkosítás alkalmazása előtt történik, a program rendkívül egyszerű. Nincs szükség titkosítások beépítésére és számos protokoll támogatására.

A szerző arra törekedett, hogy az eszköz a lehető legkevesebb erőforrást fogyassza, és teljesen észrevétlenül működjön a gépen. A modern vírusirtókkal és más „biztonsági rendszerekkel” ellentétben nem kell lelassítania a számítógépet. Sikerült minimalizálnia a forgalmat és a memóriafogyasztást egy kissé ügyesebb szoftvermegvalósítással. Ha csak egy külön folyamatot indítana egy új kapcsolathoz, a potenciális támadók DDoS-támadást indíthatnának, nyitva számos kapcsolatot a gép erőforrásainak kimerítésére. Egy folyamat egy kapcsolat számára - az sem a legjobb megoldás, mert a mag közben erőforrásokat költ a folyamatok kezelésére.

Ezért Chris Vellons az Endlessh-hez a legkönnyebben használható verziót választotta: egy szálú szervert poll(2), ahol a csapdába esett kliensek gyakorlatilag nem fogyasztanak plusz erőforrásokat, eltekintve a magbeli socket objektumtól és további 78 bájt nyilvántartástól az Endlessh-ben. Annak érdekében, hogy ne hozzanak létre fogadási és küldési puffereket minden ügyfél számára, az Endlessh közvetlen hozzáférést biztosító socketet nyit, és közvetlenül TCP csomagokat közvetít, figyelmen kívül hagyva a TCP/IP operációs rendszer szinte teljes veremét. A bejövő puffer egyáltalán nem szükséges, mert a bejövő adatok minket nem érdekelnek.

A szerző elmondta, hogy a program időpontjában nem tudott a Python asycio és egyéb tarpitokról. Ha tudta volna az asycio-ról, az eszközét mindössze 18 sorban valósíthatta volna meg Pythonban:

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

Az Asyncio tökéletesen alkalmas tarpitok írására. Például egy ilyen csapda órákra felfüggesztheti a Firefoxot, a Chrome-ot vagy bármely más klienst, amely megpróbál csatlakozni az HTTP szerveréhez:

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

A tarpit nagyszerű eszköz az internetes huligánok büntetésére. Igaz, van némi kockázat, hogy éppen ellenkezőleg, felhívhatja a figyelmüket a konkrét szerver szokatlan viselkedésére. Valaki meggondolhatja a bosszút és irányított DDoS-támadást indíthat az IP-címére. Eddig azonban ilyen esetek nem voltak, és a tarpitek jól működnek.

Kategóriák:
Python, Információbiztonság, Szoftver, Rendszergazdálkodás

Címkék:
SSH, Endlessh, tarpit, csapda, asycio
Honeypot (tarpit) a bejövő SSH kapcsolatokhoz

Nem titok, hogy az internet egy nagyon ellenséges környezet. Amint bekapcsol egy szervert, azonnal tömeges támadásoknak és számos szkennelésnek van kitéve. Egy példa alapján a biztonsági szakemberek által készített honeypotra meg lehet ítélni ennek a szemétforgalomnak a mértékét. Valójában egy átlagos szerveren a forgalom 99%-a káros lehet.

A Tarpit egy portcsapda, amelyet a bejövő kapcsolatok lelassítására használnak. Ha egy külső rendszer csatlakozik ehhez a portra, nem lehet gyorsan bezárni a kapcsolatot. A rendszer a saját erőforrásait fogja felhasználni, és várnia kell, amíg a kapcsolat időkorlát miatt megszakad, vagy kézzel kell megszakítania azt.

A tarpitet leggyakrabban védelemre használják. Ezt a technikát először számítógépes féreg elleni védelemre fejlesztették ki. Most már arra is használható, hogy megkeserítse a spammerek és a széleskörű IP-címek szkennelésével foglalkozó kutatók életét (példák a Habr-on: Ausztria, Ukrajna).

Egy Chris Vellons nevű rendszergazdának valószínűleg elege lett a rendezett káoszból — és írt egy kis programot Endlessh, egy SSH tarpitet, amely lelassítja a bejövő kapcsolatokat. A program megnyit egy portot (alapértelmezés szerint a teszteléshez a 2222-es port van megadva), és úgy tesz, mintha SSH-szerver lenne, valójában pedig végtelen kapcsolatot létesít a bejövő klienssel, amíg az fel nem adja. Ez akár több napig is eltarthat, amíg a kliens le nem kapcsolódik.

A program telepítése:

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

A helyesen megvalósított tarpité több forrást von el a támadótól, mint neked. De a lényeg nem is a forrásokban rejlik. A szerző Ki vezeti be az IPv6-ot, és mi lassítja annak fejlődését?, hogy a program függőséget okoz. Jelenleg 27 kliens van a csapdájában, közülük néhány hete csatlakozott. A csapdában a csúcsidőszakban 1378 kliens ült 20 órán keresztül!

Működés közben az Endlessh szervert a szokásos 22-es portra kell telepíteni, amelyre tömegesen próbálnak bejutni a zaklatók. A biztonsági ajánlások mindig azt javasolják, hogy az SSH-t egy másik portra helyezzék, ami azonnal jelentősen csökkenti a napló méretét.

Chris Vellons szerint a programja kihasznál egy bekezdést az RFC 4253 SSH protokoll specifikációjából. Azonnal a TCP-kapcsolat létrehozása után, de a titkosítás alkalmazása előtt mindkét félnek elküldenie kell az azonosító karakterláncot. És itt van az utalás: A szerver MÁS más adatokat küldhet, mielőtt elküldené a verziót tartalmazó sort.. És nincs korlátozás az adatok mennyiségére, csak minden sort a következővel kell kezdeni SSH-.

Erre szolgál az Endlessh program: a küldi végtelen véletlenszerűen generált adatok áramlása, amelyek megfelelnek az RFC 4253-nak, azaz az azonosítás előtti küldés, és minden sor a következővel kezdődik SSH- és nem haladja meg a 255 karaktert, beleértve a sort végző karaktert is. Összességében minden a szabvány szerint van.

Alapértelmezés szerint a program 10 másodpercet vár az adatcsomagok küldése között. Ez megelőzi az időtúllépés általi lecsatlakozást, így az ügyfél gyakorlatilag végtelen ideig fog ülni a csapdában.

Mivel az adatok küldése a titkosítás alkalmazása előtt történik, a program rendkívül egyszerű. Nincs szükség titkosítások beépítésére és számos protokoll támogatására.

A szerző arra törekedett, hogy az eszköz a lehető legkevesebb erőforrást fogyassza, és teljesen észrevétlenül működjön a gépen. A modern vírusirtókkal és más „biztonsági rendszerekkel” ellentétben nem kell lelassítania a számítógépet. Sikerült minimalizálnia a forgalmat és a memóriafogyasztást egy kissé ügyesebb szoftvermegvalósítással. Ha csak egy külön folyamatot indítana egy új kapcsolathoz, a potenciális támadók DDoS-támadást indíthatnának, nyitva számos kapcsolatot a gép erőforrásainak kimerítésére. Egy folyamat egy kapcsolat számára - az sem a legjobb megoldás, mert a mag közben erőforrásokat költ a folyamatok kezelésére.

Ezért Chris Vellons az Endlessh-hez a legkönnyebben használható verziót választotta: egy szálú szervert poll(2), ahol a csapdába esett kliensek gyakorlatilag nem fogyasztanak plusz erőforrásokat, eltekintve a magbeli socket objektumtól és további 78 bájt nyilvántartástól az Endlessh-ben. Annak érdekében, hogy ne hozzanak létre fogadási és küldési puffereket minden ügyfél számára, az Endlessh közvetlen hozzáférést biztosító socketet nyit, és közvetlenül TCP csomagokat közvetít, figyelmen kívül hagyva a TCP/IP operációs rendszer szinte teljes veremét. A bejövő puffer egyáltalán nem szükséges, mert a bejövő adatok minket nem érdekelnek.

A szerző elmondta, hogy a program időpontjában nem tudott a Python asycio és egyéb tarpitokról. Ha tudta volna az asycio-ról, az eszközét mindössze 18 sorban valósíthatta volna meg Pythonban:

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

Az Asyncio tökéletesen alkalmas tarpitok írására. Például egy ilyen csapda órákra felfüggesztheti a Firefoxot, a Chrome-ot vagy bármely más klienst, amely megpróbál csatlakozni az HTTP szerveréhez:

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

A tarpit nagyszerű eszköz az internetes huligánok büntetésére. Igaz, van némi kockázat, hogy éppen ellenkezőleg, felhívhatja a figyelmüket a konkrét szerver szokatlan viselkedésére. Valaki meggondolhatja a bosszút és irányított DDoS-támadást indíthat az IP-címére. Eddig azonban ilyen esetek nem voltak, és a tarpitek jól működnek.

Honeypot (tarpit) a bejövő SSH kapcsolatokhoz

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster