Trap (tarpit) za dohodne povezave SSH

Nobena skrivnost ni, da je internet zelo sovražno okolje. Takoj ko dvignete strežnik, je takoj izpostavljen množičnim napadom in večkratnim pregledom. Na primer honeypot od varnostnikov lahko ocenite obseg tega prometa s smetmi. Pravzaprav je lahko na povprečnem strežniku 99 % prometa zlonamernega.

Tarpit so vrata pasti, ki se uporabljajo za upočasnitev dohodnih povezav. Če se na ta vrata poveže sistem drugega proizvajalca, povezave ne boste mogli hitro prekiniti. Morala bo zapraviti svoje sistemske vire in počakati, da poteče časovna omejitev povezave, ali pa jo ročno prekiniti.

Najpogosteje se za zaščito uporabljajo ponjave. Tehnika je bila najprej razvita za zaščito pred računalniškimi črvi. In zdaj ga je mogoče uporabiti za uničenje življenja pošiljateljem neželene pošte in raziskovalcem, ki se ukvarjajo s širokim pregledovanjem vseh naslovov IP zaporedoma (primeri na Habréju: Avstrija, Ukrajino).

Eden od sistemskih administratorjev po imenu Chris Wellons se je očitno naveličal gledati te sramote - in napisal je majhen program Neskončno, tarpit za SSH, ki upočasni dohodne povezave. Program odpre vrata (privzeta vrata za testiranje so 2222) in se pretvarja, da je SSH strežnik, v resnici pa vzpostavlja neskončno povezavo s prihajajočim odjemalcem, dokler ta ne odneha. To lahko traja več dni ali več, dokler stranka ne odpade.

Namestitev pripomočka:

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

Pravilno implementiran tarpit bo vzel več sredstev od napadalca kot od vas. A niti ne gre za vire. Avtor pišeda program zasvoji. Trenutno ima 27 ujetih strank, nekatere od njih so povezane več tednov. Na vrhuncu aktivnosti je bilo 1378 klientov ujetih 20 ur!

V načinu delovanja je treba strežnik Endlessh namestiti na običajna vrata 22, kjer huligani množično trkajo. Standardna varnostna priporočila vedno svetujejo premik SSH na druga vrata, kar takoj zmanjša velikost dnevnikov za red velikosti.

Chris Wellons pravi, da njegov program izkorišča en odstavek specifikacije RFC 4253 na protokol SSH. Takoj po vzpostavitvi povezave TCP, vendar pred uporabo kriptografije, morata obe strani poslati identifikacijski niz. In tu je tudi opomba: "Strežnik LAHKO pošlje druge vrstice podatkov, preden pošlje vrstico različice". In ni omejitev glede količine teh podatkov morate vsako vrstico začeti z SSH-.

Točno to počne program Endlessh: to pošilja neskončno tok naključno ustvarjenih podatkov, ki so v skladu z RFC 4253, to pomeni, da pošljejo pred preverjanjem pristnosti in vsaka vrstica se začne z SSH- in ne presega 255 znakov, vključno z znakom za konec vrstice. Na splošno je vse v skladu s standardom.

Privzeto program med pošiljanjem paketov čaka 10 sekund. To preprečuje odjemalcu časovno omejitev, tako da bo odjemalec za vedno ujet.

Ker se podatki pošljejo pred uporabo kriptografije, je program izjemno preprost. Ni mu treba implementirati nobenih šifer in podpira več protokolov.

Avtor je poskušal zagotoviti, da pripomoček porabi najmanj virov in na stroju deluje popolnoma neopaženo. Za razliko od sodobnih protivirusnih programov in drugih »varnostnih sistemov« ne bi smel upočasniti vašega računalnika. Tako promet kot porabo pomnilnika mu je uspelo minimizirati zaradi nekoliko bolj premetene programske implementacije. Če bi preprosto zagnal ločen proces na novi povezavi, bi lahko morebitni napadalci sprožili napad DDoS z odpiranjem več povezav, da bi izčrpali vire v napravi. Ena nit na povezavo prav tako ni najboljša možnost, ker bo jedro zapravljalo sredstva za upravljanje niti.

Zato je Chris Wellons izbral najlažjo možnost za Endlessh: strežnik z eno nitjo poll(2), kjer odjemalci v pasti praktično ne porabijo dodatnih virov, ne da bi upoštevali objekt vtičnice v jedru in dodatnih 78 bajtov za sledenje v Endlessh. Da se izogne ​​dodelitvi medpomnilnikov za sprejem in pošiljanje za vsakega odjemalca, Endlessh odpre vtičnico za neposredni dostop in neposredno prevede pakete TCP, tako da zaobide skoraj celoten sklad TCP/IP operacijskega sistema. Vhodni medpomnilnik sploh ni potreben, ker nas vhodni podatki ne zanimajo.

Avtor pravi, da v času svojega programa nisem vedel o obstoju Pythonovega asycia in drugih tarpitov. Če bi vedel za asycio, bi lahko implementiral svoj pripomoček v samo 18 vrsticah 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 idealen za pisanje tarpitov. Na primer, ta kavelj bo zamrznil Firefox, Chrome ali katerega koli drugega odjemalca, ki se poskuša povezati z vašim strežnikom HTTP za več ur:

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 odlično orodje za kaznovanje spletnih ustrahovalcev. Res je, nasprotno, obstaja nekaj tveganja, da bi jih opozorili na nenavadno vedenje določenega strežnika. Nekdo morda razmišljati o maščevanju in ciljani napad DDoS na vaš IP. Vendar do zdaj takšnih primerov ni bilo in tarpiti delujejo odlično.

vozlišča:
Python, Informacijska varnost, Programska oprema, Sistemska administracija

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) za dohodne povezave SSH

Nobena skrivnost ni, da je internet zelo sovražno okolje. Takoj ko dvignete strežnik, je takoj izpostavljen množičnim napadom in večkratnim pregledom. Na primer honeypot od varnostnikov lahko ocenite obseg tega prometa s smetmi. Pravzaprav je lahko na povprečnem strežniku 99 % prometa zlonamernega.

Tarpit so vrata pasti, ki se uporabljajo za upočasnitev dohodnih povezav. Če se na ta vrata poveže sistem drugega proizvajalca, povezave ne boste mogli hitro prekiniti. Morala bo zapraviti svoje sistemske vire in počakati, da poteče časovna omejitev povezave, ali pa jo ročno prekiniti.

Najpogosteje se za zaščito uporabljajo ponjave. Tehnika je bila najprej razvita za zaščito pred računalniškimi črvi. In zdaj ga je mogoče uporabiti za uničenje življenja pošiljateljem neželene pošte in raziskovalcem, ki se ukvarjajo s širokim pregledovanjem vseh naslovov IP zaporedoma (primeri na Habréju: Avstrija, Ukrajino).

Eden od sistemskih administratorjev po imenu Chris Wellons se je očitno naveličal gledati te sramote - in napisal je majhen program Neskončno, tarpit za SSH, ki upočasni dohodne povezave. Program odpre vrata (privzeta vrata za testiranje so 2222) in se pretvarja, da je SSH strežnik, v resnici pa vzpostavlja neskončno povezavo s prihajajočim odjemalcem, dokler ta ne odneha. To lahko traja več dni ali več, dokler stranka ne odpade.

Namestitev pripomočka:

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

Pravilno implementiran tarpit bo vzel več sredstev od napadalca kot od vas. A niti ne gre za vire. Avtor pišeda program zasvoji. Trenutno ima 27 ujetih strank, nekatere od njih so povezane več tednov. Na vrhuncu aktivnosti je bilo 1378 klientov ujetih 20 ur!

V načinu delovanja je treba strežnik Endlessh namestiti na običajna vrata 22, kjer huligani množično trkajo. Standardna varnostna priporočila vedno svetujejo premik SSH na druga vrata, kar takoj zmanjša velikost dnevnikov za red velikosti.

Chris Wellons pravi, da njegov program izkorišča en odstavek specifikacije RFC 4253 na protokol SSH. Takoj po vzpostavitvi povezave TCP, vendar pred uporabo kriptografije, morata obe strani poslati identifikacijski niz. In tu je tudi opomba: "Strežnik LAHKO pošlje druge vrstice podatkov, preden pošlje vrstico različice". In ni omejitev glede količine teh podatkov morate vsako vrstico začeti z SSH-.

Točno to počne program Endlessh: to pošilja neskončno tok naključno ustvarjenih podatkov, ki so v skladu z RFC 4253, to pomeni, da pošljejo pred preverjanjem pristnosti in vsaka vrstica se začne z SSH- in ne presega 255 znakov, vključno z znakom za konec vrstice. Na splošno je vse v skladu s standardom.

Privzeto program med pošiljanjem paketov čaka 10 sekund. To preprečuje odjemalcu časovno omejitev, tako da bo odjemalec za vedno ujet.

Ker se podatki pošljejo pred uporabo kriptografije, je program izjemno preprost. Ni mu treba implementirati nobenih šifer in podpira več protokolov.

Avtor je poskušal zagotoviti, da pripomoček porabi najmanj virov in na stroju deluje popolnoma neopaženo. Za razliko od sodobnih protivirusnih programov in drugih »varnostnih sistemov« ne bi smel upočasniti vašega računalnika. Tako promet kot porabo pomnilnika mu je uspelo minimizirati zaradi nekoliko bolj premetene programske implementacije. Če bi preprosto zagnal ločen proces na novi povezavi, bi lahko morebitni napadalci sprožili napad DDoS z odpiranjem več povezav, da bi izčrpali vire v napravi. Ena nit na povezavo prav tako ni najboljša možnost, ker bo jedro zapravljalo sredstva za upravljanje niti.

Zato je Chris Wellons izbral najlažjo možnost za Endlessh: strežnik z eno nitjo poll(2), kjer odjemalci v pasti praktično ne porabijo dodatnih virov, ne da bi upoštevali objekt vtičnice v jedru in dodatnih 78 bajtov za sledenje v Endlessh. Da se izogne ​​dodelitvi medpomnilnikov za sprejem in pošiljanje za vsakega odjemalca, Endlessh odpre vtičnico za neposredni dostop in neposredno prevede pakete TCP, tako da zaobide skoraj celoten sklad TCP/IP operacijskega sistema. Vhodni medpomnilnik sploh ni potreben, ker nas vhodni podatki ne zanimajo.

Avtor pravi, da v času svojega programa nisem vedel o obstoju Pythonovega asycia in drugih tarpitov. Če bi vedel za asycio, bi lahko implementiral svoj pripomoček v samo 18 vrsticah 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 idealen za pisanje tarpitov. Na primer, ta kavelj bo zamrznil Firefox, Chrome ali katerega koli drugega odjemalca, ki se poskuša povezati z vašim strežnikom HTTP za več ur:

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 odlično orodje za kaznovanje spletnih ustrahovalcev. Res je, nasprotno, obstaja nekaj tveganja, da bi jih opozorili na nenavadno vedenje določenega strežnika. Nekdo morda razmišljati o maščevanju in ciljani napad DDoS na vaš IP. Vendar do zdaj takšnih primerov ni bilo in tarpiti delujejo odlično.

Trap (tarpit) za dohodne povezave SSH

Vir: www.habr.com

Dodaj komentar