Trap (tarpit) foar ynkommende SSH-ferbiningen

It is gjin geheime dat it ynternet in heul fijannige omjouwing is. Sadree't jo in server ferheegje, wurdt it direkt ûnderwurpen oan massive oanfallen en meardere scans. Bygelyks huningpot fan feiligens bewakers jo kinne de skaal fan dit jiskeferkear skatte. Yn feite, op 'e gemiddelde tsjinner, kin 99% fan ferkear kwea-aardich wêze.

Tarpit is in trappoarte dy't brûkt wurdt om ynkommende ferbiningen te fertragen. As in systeem fan tredden oanslút op dizze poarte, kinne jo de ferbining net fluch slute. Se sil har systeemboarnen moatte fergrieme en wachtsje oant de ferbining timeouts is, of it mei de hân beëinigje.

Meastentiids wurde tarpits brûkt foar beskerming. De technyk waard earst ûntwikkele om te beskermjen tsjin kompjûterwjirms. En no kin it brûkt wurde om it libben te ferneatigjen fan spammers en ûndersikers dy't dwaande binne mei brede skennen fan alle IP-adressen op in rige (foarbylden op Habré: Eastenryk, Oekraïne).

Ien fan 'e systeembehearders mei de namme Chris Wellons waard blykber wurch fan it besjen fan dizze skande - en hy skreau in lyts programma Einleas, in tarpit foar SSH dy't ynkommende ferbiningen fertraget. It programma iepenet in poarte (de standertpoarte foar testen is 2222) en docht as in SSH-tsjinner, mar yn 'e realiteit stelt it in einleaze ferbining mei de ynkommende kliïnt oant it jout. Dit kin ferskate dagen of mear trochgean oant de kliïnt falt.

Ynstallaasje fan it hulpprogramma:

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

In goed ymplementearre tarpit sil mear boarnen nimme fan 'e oanfaller dan fan jo. Mar it is net iens in kwestje fan middels. Skriuwer hy skriuwtdat it programma is ferslaavjend. Op it stuit hat it 27 kliïnten fêst, guon fan har ferbûn foar wiken. Op it hichtepunt fan aktiviteit waarden 1378 kliïnten foar 20 oeren finzen!

Yn bestjoeringsmodus moat de Endlessh-tsjinner ynstalleare wurde op 'e gewoane poarte 22, wêr't hooligans massaal klopje. Standert feiligens oanbefellings altyd advisearje it ferpleatsen fan SSH nei in oare haven, dy't fuortendaliks ferminderet de grutte fan de logs troch in folchoarder fan grutte.

Chris Wellons seit dat syn programma ien paragraaf fan 'e spesifikaasje eksploitearret RFC 4253 oan it SSH-protokol. Fuort neidat in TCP-ferbining is oprjochte, mar foardat kryptografy wurdt tapast, moatte beide partijen in identifikaasjestring stjoere. En der is ek in opmerking: "De tsjinner MAG oare rigen gegevens ferstjoere foardat de ferzjerige ferstjoert". En Gjin limyt op it folume fan dizze gegevens, jo gewoan moatte begjinne eltse rigel mei SSH-.

Dit is krekt wat it programma Endlessh docht: it stjoert einleaze stream fan willekeurich oanmakke gegevens, dy't foldogge oan RFC 4253, dat is, stjoere foar autentikaasje, en elke rigel begjint mei SSH- en net mear as 255 tekens, ynklusyf de line einigjende karakter. Yn 't algemien is alles neffens de standert.

Standert wachtet it programma 10 sekonden tusken it ferstjoeren fan pakketten. Dit foarkomt dat de klant time-out wurdt, sadat de kliïnt foar altyd fêst is.

Sûnt de gegevens wurde ferstjoerd foardat kryptografy wurdt tapast, is it programma ekstreem ienfâldich. It hoecht gjin sifers te ymplementearjen en stipet meardere protokollen.

De skriuwer besocht om te soargjen dat it nut verbruikt in minimum fan middels en wurket hielendal ûngemurken op 'e masine. Oars as moderne anty-firusen en oare "befeiligingssystemen", moat it jo kompjûter net fertrage. Hy wist sawol ferkear as ûnthâldferbrûk te minimalisearjen troch in wat slûchslimme software-ymplemintaasje. As it gewoan in apart proses op in nije ferbining lansearre, dan kinne potinsjele oanfallers in DDoS-oanfal lansearje troch meardere ferbiningen te iepenjen om boarnen op 'e masine út te lûken. Ien thread per ferbining is ek net de bêste opsje, om't de kernel boarnen fergrieme sil by it behearen fan diskusjes.

Dêrom keas Chris Wellons de lichtste opsje foar Endlessh: in single-threaded server poll(2), dêr't de kliïnten yn 'e trap konsumearje praktysk gjin ekstra boarnen, net telle it socket foarwerp yn' e kearn en in oare 78 bytes foar folgjen yn Endlessh. Om foar te kommen dat jo buffers foar elke kliïnt moatte allocearje, iepenet Endlessh in direkte tagongssocket en fertaalt TCP-pakketten direkt, en giet sawat it heule TCP / IP-stapel fan bestjoeringssysteem om. De ynkommende buffer is hielendal net nedich, om't wy net ynteressearre binne yn 'e ynkommende gegevens.

De skriuwer seit dat op it stuit fan syn programma wist net oer it bestean fan Python syn asycio en oare tarpits. As hy wist oer asycio, koe hy syn nut yn just 18 rigels yn Python ymplementearje:

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 is ideaal foar it skriuwen fan tarpits. Bygelyks, dizze hook sil Firefox, Chrome, of elke oare kliïnt dy't in protte oeren besykje te ferbinen mei jo HTTP-tsjinner befrieze:

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 is in geweldich ark foar it straffen fan online pesten. Wier, d'r is wat risiko, krekt oarsom, om har oandacht te tekenjen op it ûngewoane gedrach fan in bepaalde tsjinner. Immen soe tinke oer wraak en in rjochte DDoS-oanfal op jo IP. Oant no binne d'r lykwols gjin sokke gefallen west, en tarpits wurkje geweldich.

Hubs:
Python, Ynformaasje feiligens, Software, Systeem administraasje

tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) foar ynkommende SSH-ferbiningen

It is gjin geheime dat it ynternet in heul fijannige omjouwing is. Sadree't jo in server ferheegje, wurdt it direkt ûnderwurpen oan massive oanfallen en meardere scans. Bygelyks huningpot fan feiligens bewakers jo kinne de skaal fan dit jiskeferkear skatte. Yn feite, op 'e gemiddelde tsjinner, kin 99% fan ferkear kwea-aardich wêze.

Tarpit is in trappoarte dy't brûkt wurdt om ynkommende ferbiningen te fertragen. As in systeem fan tredden oanslút op dizze poarte, kinne jo de ferbining net fluch slute. Se sil har systeemboarnen moatte fergrieme en wachtsje oant de ferbining timeouts is, of it mei de hân beëinigje.

Meastentiids wurde tarpits brûkt foar beskerming. De technyk waard earst ûntwikkele om te beskermjen tsjin kompjûterwjirms. En no kin it brûkt wurde om it libben te ferneatigjen fan spammers en ûndersikers dy't dwaande binne mei brede skennen fan alle IP-adressen op in rige (foarbylden op Habré: Eastenryk, Oekraïne).

Ien fan 'e systeembehearders mei de namme Chris Wellons waard blykber wurch fan it besjen fan dizze skande - en hy skreau in lyts programma Einleas, in tarpit foar SSH dy't ynkommende ferbiningen fertraget. It programma iepenet in poarte (de standertpoarte foar testen is 2222) en docht as in SSH-tsjinner, mar yn 'e realiteit stelt it in einleaze ferbining mei de ynkommende kliïnt oant it jout. Dit kin ferskate dagen of mear trochgean oant de kliïnt falt.

Ynstallaasje fan it hulpprogramma:

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

In goed ymplementearre tarpit sil mear boarnen nimme fan 'e oanfaller dan fan jo. Mar it is net iens in kwestje fan middels. Skriuwer hy skriuwtdat it programma is ferslaavjend. Op it stuit hat it 27 kliïnten fêst, guon fan har ferbûn foar wiken. Op it hichtepunt fan aktiviteit waarden 1378 kliïnten foar 20 oeren finzen!

Yn bestjoeringsmodus moat de Endlessh-tsjinner ynstalleare wurde op 'e gewoane poarte 22, wêr't hooligans massaal klopje. Standert feiligens oanbefellings altyd advisearje it ferpleatsen fan SSH nei in oare haven, dy't fuortendaliks ferminderet de grutte fan de logs troch in folchoarder fan grutte.

Chris Wellons seit dat syn programma ien paragraaf fan 'e spesifikaasje eksploitearret RFC 4253 oan it SSH-protokol. Fuort neidat in TCP-ferbining is oprjochte, mar foardat kryptografy wurdt tapast, moatte beide partijen in identifikaasjestring stjoere. En der is ek in opmerking: "De tsjinner MAG oare rigen gegevens ferstjoere foardat de ferzjerige ferstjoert". En Gjin limyt op it folume fan dizze gegevens, jo gewoan moatte begjinne eltse rigel mei SSH-.

Dit is krekt wat it programma Endlessh docht: it stjoert einleaze stream fan willekeurich oanmakke gegevens, dy't foldogge oan RFC 4253, dat is, stjoere foar autentikaasje, en elke rigel begjint mei SSH- en net mear as 255 tekens, ynklusyf de line einigjende karakter. Yn 't algemien is alles neffens de standert.

Standert wachtet it programma 10 sekonden tusken it ferstjoeren fan pakketten. Dit foarkomt dat de klant time-out wurdt, sadat de kliïnt foar altyd fêst is.

Sûnt de gegevens wurde ferstjoerd foardat kryptografy wurdt tapast, is it programma ekstreem ienfâldich. It hoecht gjin sifers te ymplementearjen en stipet meardere protokollen.

De skriuwer besocht om te soargjen dat it nut verbruikt in minimum fan middels en wurket hielendal ûngemurken op 'e masine. Oars as moderne anty-firusen en oare "befeiligingssystemen", moat it jo kompjûter net fertrage. Hy wist sawol ferkear as ûnthâldferbrûk te minimalisearjen troch in wat slûchslimme software-ymplemintaasje. As it gewoan in apart proses op in nije ferbining lansearre, dan kinne potinsjele oanfallers in DDoS-oanfal lansearje troch meardere ferbiningen te iepenjen om boarnen op 'e masine út te lûken. Ien thread per ferbining is ek net de bêste opsje, om't de kernel boarnen fergrieme sil by it behearen fan diskusjes.

Dêrom keas Chris Wellons de lichtste opsje foar Endlessh: in single-threaded server poll(2), dêr't de kliïnten yn 'e trap konsumearje praktysk gjin ekstra boarnen, net telle it socket foarwerp yn' e kearn en in oare 78 bytes foar folgjen yn Endlessh. Om foar te kommen dat jo buffers foar elke kliïnt moatte allocearje, iepenet Endlessh in direkte tagongssocket en fertaalt TCP-pakketten direkt, en giet sawat it heule TCP / IP-stapel fan bestjoeringssysteem om. De ynkommende buffer is hielendal net nedich, om't wy net ynteressearre binne yn 'e ynkommende gegevens.

De skriuwer seit dat op it stuit fan syn programma wist net oer it bestean fan Python syn asycio en oare tarpits. As hy wist oer asycio, koe hy syn nut yn just 18 rigels yn Python ymplementearje:

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 is ideaal foar it skriuwen fan tarpits. Bygelyks, dizze hook sil Firefox, Chrome, of elke oare kliïnt dy't in protte oeren besykje te ferbinen mei jo HTTP-tsjinner befrieze:

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 is in geweldich ark foar it straffen fan online pesten. Wier, d'r is wat risiko, krekt oarsom, om har oandacht te tekenjen op it ûngewoane gedrach fan in bepaalde tsjinner. Immen soe tinke oer wraak en in rjochte DDoS-oanfal op jo IP. Oant no binne d'r lykwols gjin sokke gefallen west, en tarpits wurkje geweldich.

Trap (tarpit) foar ynkommende SSH-ferbiningen

Boarne: www.habr.com

Add a comment