Trampa (tarpit) per a connexions SSH entrants

No és cap secret que Internet és un entorn molt hostil. Tan bon punt aixequeu un servidor, és sotmès instantàniament a atacs massius i múltiples exploracions. Per exemple pot de mel dels guàrdies de seguretat podeu estimar l'escala d'aquest trànsit d'escombraries. De fet, al servidor mitjà, el 99% del trànsit pot ser maliciós.

Tarpit és un port trampa que s'utilitza per frenar les connexions entrants. Si un sistema de tercers es connecta a aquest port, no podreu tancar la connexió ràpidament. Haurà de malgastar els recursos del seu sistema i esperar fins que s'acabi el temps d'espera de la connexió o cancel·lar-la manualment.

Molt sovint, les lones s'utilitzen per protegir-se. La tècnica es va desenvolupar per primera vegada per protegir-se dels cucs informàtics. I ara es pot utilitzar per arruïnar les vides dels emissors de correu brossa i dels investigadors que es dediquen a una exploració extensa de totes les adreces IP seguides (exemples a Habré: Австрия, Ucraïna).

Un dels administradors del sistema anomenat Chris Wellons sembla que es va cansar de veure aquesta desgràcia i va escriure un petit programa Interminable, una tarpit per a SSH que frena les connexions entrants. El programa obre un port (el port predeterminat per a la prova és el 2222) i pretén ser un servidor SSH, però en realitat estableix una connexió sense fi amb el client entrant fins que es rendeix. Això pot continuar durant diversos dies o més fins que el client es caigui.

Instal·lació de la utilitat:

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

Una tarpit correctament implementada necessitarà més recursos de l'atacant que de tu. Però ni tan sols és qüestió de recursos. Autor escriuque el programa és addictiu. Ara mateix té 27 clients atrapats, alguns d'ells connectats durant setmanes. En el punt àlgid d'activitat, 1378 clients van quedar atrapats durant 20 hores!

En mode operatiu, el servidor Endlessh s'ha d'instal·lar al port habitual 22, on els hooligans trucen en massa. Les recomanacions de seguretat estàndard sempre aconsellen moure SSH a un port diferent, la qual cosa redueix immediatament la mida dels registres en un ordre de magnitud.

Chris Wellons diu que el seu programa explota un paràgraf de l'especificació RFC 4253 al protocol SSH. Immediatament després d'establir una connexió TCP, però abans d'aplicar la criptografia, ambdues parts han d'enviar una cadena d'identificació. I també hi ha una nota: "El servidor POT enviar altres files de dades abans d'enviar la fila de versió". I sense límit sobre el volum d'aquestes dades, només cal començar cada línia amb SSH-.

Això és exactament el que fa el programa Endlessh: això envia interminable flux de dades generades aleatòriament, que compleixen amb RFC 4253, és a dir, enviar abans de l'autenticació, i cada línia comença per SSH- i no supera els 255 caràcters, inclòs el caràcter de final de línia. En general, tot està d'acord amb la norma.

Per defecte, el programa espera 10 segons entre enviament de paquets. Això evita que el client s'esgoti el temps d'espera, de manera que el client quedarà atrapat per sempre.

Com que les dades s'envien abans d'aplicar la criptografia, el programa és extremadament senzill. No necessita implementar cap xifrat i admet diversos protocols.

L'autor va intentar assegurar-se que la utilitat consumeix un mínim de recursos i funciona completament desapercebuda a la màquina. A diferència dels antivirus moderns i altres "sistemes de seguretat", no hauria d'alentir el vostre ordinador. Va aconseguir minimitzar tant el trànsit com el consum de memòria gràcies a una implementació de programari una mica més astuta. Si simplement va llançar un procés independent en una nova connexió, els atacants potencials podrien llançar un atac DDoS obrint múltiples connexions per esgotar els recursos de la màquina. Un fil per connexió tampoc és la millor opció, perquè el nucli malgastarà recursos gestionant els fils.

És per això que Chris Wellons va triar l'opció més lleugera per a Endlessh: un servidor d'un sol fil poll(2), on els clients de la trampa pràcticament no consumeixen recursos addicionals, sense comptar l'objecte socket al nucli i altres 78 bytes per al seguiment a Endlessh. Per evitar haver d'assignar buffers de recepció i d'enviament per a cada client, Endlessh obre un sòcol d'accés directe i tradueix els paquets TCP directament, obviant gairebé tota la pila TCP/IP del sistema operatiu. El buffer d'entrada no és necessari en absolut, perquè no estem interessats en les dades entrants.

Ho diu l'autor en el moment del seu programa no ho sabia sobre l'existència de l'asycio de Python i altres tarpits. Si conegués asycio, podria implementar la seva utilitat en només 18 línies a Python:

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 és ideal per escriure tarpits. Per exemple, aquest ganxo congelarà Firefox, Chrome o qualsevol altre client que estigui intentant connectar-se al vostre servidor HTTP durant moltes hores:

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 és una gran eina per castigar els assetjadors en línia. És cert que hi ha algun risc, per contra, de cridar-los l'atenció sobre el comportament inusual d'un servidor determinat. Algú podria pensar en la venjança i un atac DDoS dirigit a la vostra IP. Tanmateix, fins ara no hi ha hagut casos d'aquest tipus, i les lones funcionen molt bé.

Hubs:
Python, seguretat de la informació, programari, administració de sistemes

Etiquetes:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trampa (tarpit) per a connexions SSH entrants

No és cap secret que Internet és un entorn molt hostil. Tan bon punt aixequeu un servidor, és sotmès instantàniament a atacs massius i múltiples exploracions. Per exemple pot de mel dels guàrdies de seguretat podeu estimar l'escala d'aquest trànsit d'escombraries. De fet, al servidor mitjà, el 99% del trànsit pot ser maliciós.

Tarpit és un port trampa que s'utilitza per frenar les connexions entrants. Si un sistema de tercers es connecta a aquest port, no podreu tancar la connexió ràpidament. Haurà de malgastar els recursos del seu sistema i esperar fins que s'acabi el temps d'espera de la connexió o cancel·lar-la manualment.

Molt sovint, les lones s'utilitzen per protegir-se. La tècnica es va desenvolupar per primera vegada per protegir-se dels cucs informàtics. I ara es pot utilitzar per arruïnar les vides dels emissors de correu brossa i dels investigadors que es dediquen a una exploració extensa de totes les adreces IP seguides (exemples a Habré: Австрия, Ucraïna).

Un dels administradors del sistema anomenat Chris Wellons sembla que es va cansar de veure aquesta desgràcia i va escriure un petit programa Interminable, una tarpit per a SSH que frena les connexions entrants. El programa obre un port (el port predeterminat per a la prova és el 2222) i pretén ser un servidor SSH, però en realitat estableix una connexió sense fi amb el client entrant fins que es rendeix. Això pot continuar durant diversos dies o més fins que el client es caigui.

Instal·lació de la utilitat:

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

Una tarpit correctament implementada necessitarà més recursos de l'atacant que de tu. Però ni tan sols és qüestió de recursos. Autor escriuque el programa és addictiu. Ara mateix té 27 clients atrapats, alguns d'ells connectats durant setmanes. En el punt àlgid d'activitat, 1378 clients van quedar atrapats durant 20 hores!

En mode operatiu, el servidor Endlessh s'ha d'instal·lar al port habitual 22, on els hooligans trucen en massa. Les recomanacions de seguretat estàndard sempre aconsellen moure SSH a un port diferent, la qual cosa redueix immediatament la mida dels registres en un ordre de magnitud.

Chris Wellons diu que el seu programa explota un paràgraf de l'especificació RFC 4253 al protocol SSH. Immediatament després d'establir una connexió TCP, però abans d'aplicar la criptografia, ambdues parts han d'enviar una cadena d'identificació. I també hi ha una nota: "El servidor POT enviar altres files de dades abans d'enviar la fila de versió". I sense límit sobre el volum d'aquestes dades, només cal començar cada línia amb SSH-.

Això és exactament el que fa el programa Endlessh: això envia interminable flux de dades generades aleatòriament, que compleixen amb RFC 4253, és a dir, enviar abans de l'autenticació, i cada línia comença per SSH- i no supera els 255 caràcters, inclòs el caràcter de final de línia. En general, tot està d'acord amb la norma.

Per defecte, el programa espera 10 segons entre enviament de paquets. Això evita que el client s'esgoti el temps d'espera, de manera que el client quedarà atrapat per sempre.

Com que les dades s'envien abans d'aplicar la criptografia, el programa és extremadament senzill. No necessita implementar cap xifrat i admet diversos protocols.

L'autor va intentar assegurar-se que la utilitat consumeix un mínim de recursos i funciona completament desapercebuda a la màquina. A diferència dels antivirus moderns i altres "sistemes de seguretat", no hauria d'alentir el vostre ordinador. Va aconseguir minimitzar tant el trànsit com el consum de memòria gràcies a una implementació de programari una mica més astuta. Si simplement va llançar un procés independent en una nova connexió, els atacants potencials podrien llançar un atac DDoS obrint múltiples connexions per esgotar els recursos de la màquina. Un fil per connexió tampoc és la millor opció, perquè el nucli malgastarà recursos gestionant els fils.

És per això que Chris Wellons va triar l'opció més lleugera per a Endlessh: un servidor d'un sol fil poll(2), on els clients de la trampa pràcticament no consumeixen recursos addicionals, sense comptar l'objecte socket al nucli i altres 78 bytes per al seguiment a Endlessh. Per evitar haver d'assignar buffers de recepció i d'enviament per a cada client, Endlessh obre un sòcol d'accés directe i tradueix els paquets TCP directament, obviant gairebé tota la pila TCP/IP del sistema operatiu. El buffer d'entrada no és necessari en absolut, perquè no estem interessats en les dades entrants.

Ho diu l'autor en el moment del seu programa no ho sabia sobre l'existència de l'asycio de Python i altres tarpits. Si conegués asycio, podria implementar la seva utilitat en només 18 línies a Python:

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 és ideal per escriure tarpits. Per exemple, aquest ganxo congelarà Firefox, Chrome o qualsevol altre client que estigui intentant connectar-se al vostre servidor HTTP durant moltes hores:

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 és una gran eina per castigar els assetjadors en línia. És cert que hi ha algun risc, per contra, de cridar-los l'atenció sobre el comportament inusual d'un servidor determinat. Algú podria pensar en la venjança i un atac DDoS dirigit a la vostra IP. Tanmateix, fins ara no hi ha hagut casos d'aquest tipus, i les lones funcionen molt bé.

Trampa (tarpit) per a connexions SSH entrants

Font: www.habr.com

Afegeix comentari