Csapda (tarpit) a bejövő SSH-kapcsolatokhoz

Nem titok, hogy az internet nagyon ellenséges környezet. Amint felállít egy szervert, azonnal hatalmas támadásoknak és többszöri vizsgálatnak van kitéve. Például mézesfazék a biztonsági őröktől megbecsülheti ennek a szemétforgalomnak a mértékét. Valójában egy átlagos szerveren a forgalom 99%-a rosszindulatú lehet.

A Tarpit egy trap port, amelyet a bejövő kapcsolatok lelassítására használnak. Ha egy harmadik féltől származó rendszer csatlakozik ehhez a porthoz, nem tudja gyorsan lezárni a kapcsolatot. El kell pazarolnia rendszererőforrásait, és meg kell várnia a kapcsolat időtúllépéséig, vagy manuálisan meg kell szakítania azt.

Leggyakrabban védőponyvakat használnak. A technikát először a számítógépes férgek elleni védekezésre fejlesztették ki. És most felhasználható arra, hogy tönkretegyék a spammerek és a kutatók életét, akik egymás után az összes IP-címet széles körben átkutatják (példák Habréról: Ausztria, Ukrajna).

Az egyik rendszeradminisztrátor, Chris Wellons láthatóan belefáradt abba, hogy ezt a szégyent nézze – és írt egy kis programot. Végtelen, az SSH-hoz készült tarpit, amely lelassítja a bejövő kapcsolatokat. A program megnyit egy portot (a teszteléshez az alapértelmezett port a 2222), és úgy tesz, mintha SSH szerver lenne, de a valóságban végtelen kapcsolatot létesít a bejövő klienssel, amíg az fel nem adja. Ez több napig vagy tovább folytatódhat, amíg az ügyfél le nem esik.

A segédprogram telepítése:

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

Egy megfelelően megvalósított tarpit több erőforrást von el a támadótól, mint tőled. De ez még csak nem is forrás kérdése. Szerző írásokhogy a program addiktív. Jelenleg 27 ügyfele van csapdában, néhányuk hetek óta kapcsolatban van. Az aktivitás csúcsán 1378 ügyfél rekedt 20 órára!

Üzemmódban az Endlessh szervert a szokásos 22-es portra kell telepíteni, ahol tömegesen kopogtatnak a huligánok. A szabványos biztonsági ajánlások mindig azt javasolják, hogy az SSH-t másik portra helyezzék át, ami azonnal egy nagyságrenddel csökkenti a naplók méretét.

Chris Wellons szerint a programja a specifikáció egy bekezdését használja ki RFC 4253 az SSH protokollhoz. Közvetlenül a TCP-kapcsolat létrehozása után, de a titkosítás alkalmazása előtt mindkét félnek el kell küldenie egy azonosító karakterláncot. És van egy megjegyzés is: "A szerver más adatsorokat is küldhet a verziósor elküldése előtt". és határ nélül ezeknek az adatoknak a mennyiségére vonatkozóan minden sort csak ezzel kell kezdenie SSH-.

Az Endlessh program pontosan ezt teszi: azt küld végtelen véletlenszerűen generált adatfolyam, amelyek megfelelnek az RFC 4253 szabványnak, azaz hitelesítés előtt küldik el, és minden sor a következővel kezdődik SSH- és nem haladja meg a 255 karaktert, beleértve a sorvégi karaktert is. Általában minden a szabvány szerint történik.

Alapértelmezés szerint a program 10 másodpercet vár a csomagok küldése között. Ez megakadályozza az ügyfél időtúllépését, így az ügyfél örökre csapdába kerül.

Mivel az adatokat a kriptográfia alkalmazása előtt küldik el, a program rendkívül egyszerű. Nem szükséges titkosítást megvalósítani, és több protokollt is támogat.

A szerző arra törekedett, hogy a segédprogram minimális erőforrást fogyasztson, é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 ennek nem szabad lelassítania a számítógépet. Mind a forgalmat, mind a memóriafogyasztást sikerült minimalizálnia egy kicsit ravaszabb szoftveres megvalósításnak köszönhetően. Ha egyszerűen elindít egy külön folyamatot egy új kapcsolaton, akkor a potenciális támadók DDoS-támadást indíthatnak több kapcsolat megnyitásával, hogy kimerítsék a gép erőforrásait. Csatlakozásonként egy szál sem a legjobb megoldás, mert a kernel erőforrásokat pazarol a szálak kezelésére.

Ezért választotta Chris Wellons a legkönnyebb megoldást az Endlessh számára: az egyszálas szervert. poll(2), ahol a csapdában lévő kliensek gyakorlatilag semmilyen extra erőforrást nem fogyasztanak, nem számítva a kernelben lévő socket objektumot és további 78 bájtot a követéshez az Endlessh-ben. Annak elkerülése érdekében, hogy az egyes kliensekhez vételi és küldési puffereket kelljen lefoglalnia, az Endlessh megnyit egy közvetlen hozzáférésű socketet, és közvetlenül fordítja le a TCP-csomagokat, megkerülve szinte a teljes operációs rendszer TCP/IP veremét. A bejövő pufferre egyáltalán nincs szükség, mert nem vagyunk kíváncsiak a beérkező adatokra.

A szerző azt mondja, hogy programja idején nem tudtam Python asycio és egyéb tarpitok létezéséről. Ha ismerné az asycio-t, a segédprogramját mindössze 18 sorban tudná megvalósítani 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 ideális tenyéríráshoz. Ez a hook például leállítja a Firefoxot, a Chrome-ot vagy bármely más olyan klienst, amely több órán keresztül próbál csatlakozni a HTTP-kiszolgálóhoz:

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 online zaklatók megbüntetésére. Igaz, éppen ellenkezőleg, fennáll annak a veszélye, hogy felhívják figyelmüket egy adott szerver szokatlan viselkedésére. Valaki gondolhat a bosszúról és egy célzott DDoS-támadást az IP-címe ellen. Eddig azonban nem volt ilyen eset, a tarpitok pedig remekül működnek.

Hubok:
Python, Információbiztonság, Szoftver, Rendszeradminisztráció

Címkék:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Csapda (tarpit) a bejövő SSH-kapcsolatokhoz

Nem titok, hogy az internet nagyon ellenséges környezet. Amint felállít egy szervert, azonnal hatalmas támadásoknak és többszöri vizsgálatnak van kitéve. Például mézesfazék a biztonsági őröktől megbecsülheti ennek a szemétforgalomnak a mértékét. Valójában egy átlagos szerveren a forgalom 99%-a rosszindulatú lehet.

A Tarpit egy trap port, amelyet a bejövő kapcsolatok lelassítására használnak. Ha egy harmadik féltől származó rendszer csatlakozik ehhez a porthoz, nem tudja gyorsan lezárni a kapcsolatot. El kell pazarolnia rendszererőforrásait, és meg kell várnia a kapcsolat időtúllépéséig, vagy manuálisan meg kell szakítania azt.

Leggyakrabban védőponyvakat használnak. A technikát először a számítógépes férgek elleni védekezésre fejlesztették ki. És most felhasználható arra, hogy tönkretegyék a spammerek és a kutatók életét, akik egymás után az összes IP-címet széles körben átkutatják (példák Habréról: Ausztria, Ukrajna).

Az egyik rendszeradminisztrátor, Chris Wellons láthatóan belefáradt abba, hogy ezt a szégyent nézze – és írt egy kis programot. Végtelen, az SSH-hoz készült tarpit, amely lelassítja a bejövő kapcsolatokat. A program megnyit egy portot (a teszteléshez az alapértelmezett port a 2222), és úgy tesz, mintha SSH szerver lenne, de a valóságban végtelen kapcsolatot létesít a bejövő klienssel, amíg az fel nem adja. Ez több napig vagy tovább folytatódhat, amíg az ügyfél le nem esik.

A segédprogram telepítése:

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

Egy megfelelően megvalósított tarpit több erőforrást von el a támadótól, mint tőled. De ez még csak nem is forrás kérdése. Szerző írásokhogy a program addiktív. Jelenleg 27 ügyfele van csapdában, néhányuk hetek óta kapcsolatban van. Az aktivitás csúcsán 1378 ügyfél rekedt 20 órára!

Üzemmódban az Endlessh szervert a szokásos 22-es portra kell telepíteni, ahol tömegesen kopogtatnak a huligánok. A szabványos biztonsági ajánlások mindig azt javasolják, hogy az SSH-t másik portra helyezzék át, ami azonnal egy nagyságrenddel csökkenti a naplók méretét.

Chris Wellons szerint a programja a specifikáció egy bekezdését használja ki RFC 4253 az SSH protokollhoz. Közvetlenül a TCP-kapcsolat létrehozása után, de a titkosítás alkalmazása előtt mindkét félnek el kell küldenie egy azonosító karakterláncot. És van egy megjegyzés is: "A szerver más adatsorokat is küldhet a verziósor elküldése előtt". és határ nélül ezeknek az adatoknak a mennyiségére vonatkozóan minden sort csak ezzel kell kezdenie SSH-.

Az Endlessh program pontosan ezt teszi: azt küld végtelen véletlenszerűen generált adatfolyam, amelyek megfelelnek az RFC 4253 szabványnak, azaz hitelesítés előtt küldik el, és minden sor a következővel kezdődik SSH- és nem haladja meg a 255 karaktert, beleértve a sorvégi karaktert is. Általában minden a szabvány szerint történik.

Alapértelmezés szerint a program 10 másodpercet vár a csomagok küldése között. Ez megakadályozza az ügyfél időtúllépését, így az ügyfél örökre csapdába kerül.

Mivel az adatokat a kriptográfia alkalmazása előtt küldik el, a program rendkívül egyszerű. Nem szükséges titkosítást megvalósítani, és több protokollt is támogat.

A szerző arra törekedett, hogy a segédprogram minimális erőforrást fogyasztson, é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 ennek nem szabad lelassítania a számítógépet. Mind a forgalmat, mind a memóriafogyasztást sikerült minimalizálnia egy kicsit ravaszabb szoftveres megvalósításnak köszönhetően. Ha egyszerűen elindít egy külön folyamatot egy új kapcsolaton, akkor a potenciális támadók DDoS-támadást indíthatnak több kapcsolat megnyitásával, hogy kimerítsék a gép erőforrásait. Csatlakozásonként egy szál sem a legjobb megoldás, mert a kernel erőforrásokat pazarol a szálak kezelésére.

Ezért választotta Chris Wellons a legkönnyebb megoldást az Endlessh számára: az egyszálas szervert. poll(2), ahol a csapdában lévő kliensek gyakorlatilag semmilyen extra erőforrást nem fogyasztanak, nem számítva a kernelben lévő socket objektumot és további 78 bájtot a követéshez az Endlessh-ben. Annak elkerülése érdekében, hogy az egyes kliensekhez vételi és küldési puffereket kelljen lefoglalnia, az Endlessh megnyit egy közvetlen hozzáférésű socketet, és közvetlenül fordítja le a TCP-csomagokat, megkerülve szinte a teljes operációs rendszer TCP/IP veremét. A bejövő pufferre egyáltalán nincs szükség, mert nem vagyunk kíváncsiak a beérkező adatokra.

A szerző azt mondja, hogy programja idején nem tudtam Python asycio és egyéb tarpitok létezéséről. Ha ismerné az asycio-t, a segédprogramját mindössze 18 sorban tudná megvalósítani 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 ideális tenyéríráshoz. Ez a hook például leállítja a Firefoxot, a Chrome-ot vagy bármely más olyan klienst, amely több órán keresztül próbál csatlakozni a HTTP-kiszolgálóhoz:

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 online zaklatók megbüntetésére. Igaz, éppen ellenkezőleg, fennáll annak a veszélye, hogy felhívják figyelmüket egy adott szerver szokatlan viselkedésére. Valaki gondolhat a bosszúról és egy célzott DDoS-támadást az IP-címe ellen. Eddig azonban nem volt ilyen eset, a tarpitok pedig remekül működnek.

Csapda (tarpit) a bejövő SSH-kapcsolatokhoz

Forrás: will.com

Hozzászólás