Trampa (tarpit) para conexións SSH entrantes

Non é ningún segredo que Internet é un ambiente moi hostil. Tan pronto como creas un servidor, está sometido ao instante a ataques masivos e a varias exploracións. Por exemplo honeypot dos gardas de seguridade pode estimar a escala deste tráfico de lixo. De feito, no servidor medio, o 99% do tráfico pode ser malicioso.

Tarpit é un porto de trampa que se usa para ralentizar as conexións entrantes. Se un sistema de terceiros se conecta a este porto, non poderás pechar a conexión rapidamente. Ela terá que desperdiciar os seus recursos do sistema e esperar ata que se esgote o tempo de espera da conexión ou finalizala manualmente.

Na maioría das veces, as lonas úsanse para protección. A técnica foi desenvolvida por primeira vez para protexerse contra os vermes informáticos. E agora pódese usar para arruinar a vida dos spammers e investigadores que se dedican a escanear amplamente todos os enderezos IP seguidos (exemplos en Habré: Austria, Ucraína).

Un dos administradores do sistema chamado Chris Wellons aparentemente cansou de ver esta deshonra e escribiu un pequeno programa Sen fin, unha tarpit para SSH que ralentiza as conexións entrantes. O programa abre un porto (o porto predeterminado para probar é 2222) e finxe ser un servidor SSH, pero en realidade establece unha conexión interminable co cliente entrante ata que se rende. Isto pode continuar durante varios días ou máis ata que o cliente caia.

Instalación da utilidade:

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

Unha tarpit correctamente implementada tomará máis recursos do atacante que de ti. Pero nin sequera é cuestión de recursos. Autor escribeque o programa é adictivo. Agora mesmo ten 27 clientes atrapados, algúns deles conectados durante semanas. No pico de actividade, 1378 clientes quedaron atrapados durante 20 horas.

No modo operativo, o servidor Endlessh debe instalarse no porto habitual 22, onde os hooligans chaman en masa. As recomendacións de seguridade estándar sempre aconsellan mover SSH a un porto diferente, o que reduce inmediatamente o tamaño dos rexistros nunha orde de magnitude.

Chris Wellons di que o seu programa explota un parágrafo da especificación RFC 4253 ao protocolo SSH. Inmediatamente despois de establecer unha conexión TCP, pero antes de aplicar a criptografía, ambas as partes deben enviar unha cadea de identificación. E tamén hai unha nota: "O servidor PODE enviar outras filas de datos antes de enviar a fila da versión". E sen límite sobre o volume destes datos, só tes que comezar cada liña con SSH-.

Isto é exactamente o que fai o programa Endlessh: iso envía infinito fluxo de datos xerados aleatoriamente, que cumpren coa RFC 4253, é dicir, enviar antes da autenticación, e cada liña comeza por SSH- e non supera os 255 caracteres, incluído o carácter de final de liña. En xeral, todo está de acordo coa norma.

Por defecto, o programa espera 10 segundos entre o envío de paquetes. Isto evita que o cliente se esgote, polo que o cliente quedará atrapado para sempre.

Dado que os datos envíanse antes de aplicar a criptografía, o programa é moi sinxelo. Non precisa implementar ningún cifrado e admite varios protocolos.

O autor intentou garantir que a utilidade consome un mínimo de recursos e funciona completamente desapercibida na máquina. A diferenza dos antivirus modernos e outros "sistemas de seguridade", non debería ralentizar o teu ordenador. Conseguiu minimizar tanto o tráfico como o consumo de memoria debido a unha implementación de software un pouco máis astuta. Se simplemente lanzou un proceso separado nunha nova conexión, os potenciais atacantes poderían lanzar un ataque DDoS abrindo varias conexións para esgotar os recursos da máquina. Un fío por conexión tampouco é a mellor opción, porque o núcleo desperdiciará recursos xestionando fíos.

É por iso que Chris Wellons elixiu a opción máis lixeira para Endlessh: un servidor de fío único poll(2), onde os clientes da trampa non consumen practicamente recursos adicionais, sen contar o obxecto socket no núcleo e outros 78 bytes para o seguimento en Endlessh. Para evitar ter que asignar búferes de recepción e envío para cada cliente, Endlessh abre un socket de acceso directo e traduce os paquetes TCP directamente, evitando case toda a pila TCP/IP do sistema operativo. O búfer de entrada non é necesario en absoluto, porque non nos interesan os datos entrantes.

O autor di que no momento do seu programa non sabía sobre a existencia do asycio de Python e outras tarpits. Se soubese sobre asycio, podería implementar a súa utilidade en só 18 liñas en 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 é ideal para escribir tarpits. Por exemplo, este gancho conxelará Firefox, Chrome ou calquera outro cliente que estea tentando conectarse ao teu servidor HTTP durante moitas horas:

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 é unha excelente ferramenta para castigar aos matóns en liña. É certo que hai certo risco, pola contra, de chamarlles a atención sobre o comportamento inusual dun servidor en particular. Alguén podería pensar na vinganza e un ataque DDoS dirixido á túa IP. Non obstante, ata agora non houbo tales casos, e as tarpits funcionan moi ben.

Hubs:
Python, Seguridade da información, Software, Administración de sistemas

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trampa (tarpit) para conexións SSH entrantes

Non é ningún segredo que Internet é un ambiente moi hostil. Tan pronto como creas un servidor, está sometido ao instante a ataques masivos e a varias exploracións. Por exemplo honeypot dos gardas de seguridade pode estimar a escala deste tráfico de lixo. De feito, no servidor medio, o 99% do tráfico pode ser malicioso.

Tarpit é un porto de trampa que se usa para ralentizar as conexións entrantes. Se un sistema de terceiros se conecta a este porto, non poderás pechar a conexión rapidamente. Ela terá que desperdiciar os seus recursos do sistema e esperar ata que se esgote o tempo de espera da conexión ou finalizala manualmente.

Na maioría das veces, as lonas úsanse para protección. A técnica foi desenvolvida por primeira vez para protexerse contra os vermes informáticos. E agora pódese usar para arruinar a vida dos spammers e investigadores que se dedican a escanear amplamente todos os enderezos IP seguidos (exemplos en Habré: Austria, Ucraína).

Un dos administradores do sistema chamado Chris Wellons aparentemente cansou de ver esta deshonra e escribiu un pequeno programa Sen fin, unha tarpit para SSH que ralentiza as conexións entrantes. O programa abre un porto (o porto predeterminado para probar é 2222) e finxe ser un servidor SSH, pero en realidade establece unha conexión interminable co cliente entrante ata que se rende. Isto pode continuar durante varios días ou máis ata que o cliente caia.

Instalación da utilidade:

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

Unha tarpit correctamente implementada tomará máis recursos do atacante que de ti. Pero nin sequera é cuestión de recursos. Autor escribeque o programa é adictivo. Agora mesmo ten 27 clientes atrapados, algúns deles conectados durante semanas. No pico de actividade, 1378 clientes quedaron atrapados durante 20 horas.

No modo operativo, o servidor Endlessh debe instalarse no porto habitual 22, onde os hooligans chaman en masa. As recomendacións de seguridade estándar sempre aconsellan mover SSH a un porto diferente, o que reduce inmediatamente o tamaño dos rexistros nunha orde de magnitude.

Chris Wellons di que o seu programa explota un parágrafo da especificación RFC 4253 ao protocolo SSH. Inmediatamente despois de establecer unha conexión TCP, pero antes de aplicar a criptografía, ambas as partes deben enviar unha cadea de identificación. E tamén hai unha nota: "O servidor PODE enviar outras filas de datos antes de enviar a fila da versión". E sen límite sobre o volume destes datos, só tes que comezar cada liña con SSH-.

Isto é exactamente o que fai o programa Endlessh: iso envía infinito fluxo de datos xerados aleatoriamente, que cumpren coa RFC 4253, é dicir, enviar antes da autenticación, e cada liña comeza por SSH- e non supera os 255 caracteres, incluído o carácter de final de liña. En xeral, todo está de acordo coa norma.

Por defecto, o programa espera 10 segundos entre o envío de paquetes. Isto evita que o cliente se esgote, polo que o cliente quedará atrapado para sempre.

Dado que os datos envíanse antes de aplicar a criptografía, o programa é moi sinxelo. Non precisa implementar ningún cifrado e admite varios protocolos.

O autor intentou garantir que a utilidade consome un mínimo de recursos e funciona completamente desapercibida na máquina. A diferenza dos antivirus modernos e outros "sistemas de seguridade", non debería ralentizar o teu ordenador. Conseguiu minimizar tanto o tráfico como o consumo de memoria debido a unha implementación de software un pouco máis astuta. Se simplemente lanzou un proceso separado nunha nova conexión, os potenciais atacantes poderían lanzar un ataque DDoS abrindo varias conexións para esgotar os recursos da máquina. Un fío por conexión tampouco é a mellor opción, porque o núcleo desperdiciará recursos xestionando fíos.

É por iso que Chris Wellons elixiu a opción máis lixeira para Endlessh: un servidor de fío único poll(2), onde os clientes da trampa non consumen practicamente recursos adicionais, sen contar o obxecto socket no núcleo e outros 78 bytes para o seguimento en Endlessh. Para evitar ter que asignar búferes de recepción e envío para cada cliente, Endlessh abre un socket de acceso directo e traduce os paquetes TCP directamente, evitando case toda a pila TCP/IP do sistema operativo. O búfer de entrada non é necesario en absoluto, porque non nos interesan os datos entrantes.

O autor di que no momento do seu programa non sabía sobre a existencia do asycio de Python e outras tarpits. Se soubese sobre asycio, podería implementar a súa utilidade en só 18 liñas en 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 é ideal para escribir tarpits. Por exemplo, este gancho conxelará Firefox, Chrome ou calquera outro cliente que estea tentando conectarse ao teu servidor HTTP durante moitas horas:

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 é unha excelente ferramenta para castigar aos matóns en liña. É certo que hai certo risco, pola contra, de chamarlles a atención sobre o comportamento inusual dun servidor en particular. Alguén podería pensar na vinganza e un ataque DDoS dirixido á túa IP. Non obstante, ata agora non houbo tales casos, e as tarpits funcionan moi ben.

Trampa (tarpit) para conexións SSH entrantes

Fonte: www.habr.com

Engadir un comentario