Trampa (tarpit) para conexiones SSH entrantes

No es ningún secreto que Internet es un entorno muy hostil. Tan pronto como inicia un servidor, éste se ve instantáneamente sujeto a ataques masivos y múltiples análisis. Por ejemplo coño de los guardias de seguridad se puede estimar la escala de este tráfico de basura. De hecho, en un servidor promedio, el 99% del tráfico puede ser malicioso.

Tarpit es un puerto trampa que se utiliza para ralentizar las conexiones entrantes. Si un sistema de terceros se conecta a este puerto, no podrá cerrar la conexión rápidamente. Tendrá que desperdiciar los recursos de su sistema y esperar hasta que se agote el tiempo de conexión o finalizarla manualmente.

La mayoría de las veces, las lonas se utilizan como protección. La técnica se desarrolló por primera vez para proteger contra gusanos informáticos. Y ahora se puede utilizar para arruinar la vida de los spammers e investigadores que realizan un amplio escaneo de todas las direcciones IP seguidas (ejemplos de Habré: Austria, Ucrania).

Uno de los administradores del sistema, llamado Chris Wellons, aparentemente se cansó de ver esta desgracia y escribió un pequeño programa. Sin fin, un tarpit para SSH que ralentiza las conexiones entrantes. El programa abre un puerto (el puerto predeterminado para las pruebas es 2222) y pretende ser un servidor SSH, pero en realidad establece una conexión interminable con el cliente entrante hasta que se da por vencido. Esto puede continuar durante varios días o más hasta que el cliente se caiga.

Instalación de la utilidad:

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

Un tarpit correctamente implementado requerirá más recursos del atacante que de usted. Pero ni siquiera es una cuestión de recursos. Autor пишетque el programa es adictivo. Ahora mismo tiene atrapados a 27 clientes, algunos de ellos conectados desde hace semanas. ¡En el pico de actividad, 1378 clientes quedaron atrapados durante 20 horas!

En modo operativo, el servidor Endlessh debe instalarse en el puerto 22 habitual, donde los hooligans llaman en masa. Las recomendaciones de seguridad estándar siempre recomiendan mover SSH a un puerto diferente, lo que reduce inmediatamente el tamaño de los registros en un orden de magnitud.

Chris Wellons dice que su programa explota un párrafo de la especificación RFC 4253 al protocolo SSH. Inmediatamente después de que se establece una conexión TCP, pero antes de que se aplique la criptografía, ambas partes deben enviar una cadena de identificación. Y también hay una nota: "El servidor PUEDE enviar otras filas de datos antes de enviar la fila de versión". Y sin límite en el volumen de estos datos, solo necesita comenzar cada línea con SSH-.

Esto es exactamente lo que hace el programa Endlessh: envía sin fin flujo de datos generados aleatoriamente, que cumplen con RFC 4253, es decir, envían antes de la autenticación, y cada línea comienza con SSH- y no excede los 255 caracteres, incluido el carácter de final de línea. En general todo según el estándar.

De forma predeterminada, el programa espera 10 segundos entre envíos de paquetes. Esto evita que se agote el tiempo de espera del cliente, por lo que quedará atrapado para siempre.

Dado que los datos se envían antes de que se aplique la criptografía, el programa es extremadamente simple. No necesita implementar ningún cifrado y admite múltiples protocolos.

El autor intentó asegurarse de que la utilidad consumiera un mínimo de recursos y funcionara completamente desapercibida en la máquina. A diferencia de los antivirus modernos y otros "sistemas de seguridad", no debería ralentizar su computadora. Logró minimizar tanto el tráfico como el consumo de memoria gracias a una implementación de software un poco más astuta. Si simplemente iniciara un proceso separado en una nueva conexión, los atacantes potenciales podrían lanzar un ataque DDoS abriendo múltiples conexiones para agotar los recursos de la máquina. Un subproceso por conexión tampoco es la mejor opción, porque el kernel desperdiciará recursos administrando subprocesos.

Es por eso que Chris Wellons eligió la opción más liviana para Endlessh: un servidor de un solo subproceso. poll(2), donde los clientes en la trampa prácticamente no consumen recursos adicionales, sin contar el objeto socket en el kernel y otros 78 bytes para el seguimiento en Endlessh. Para evitar tener que asignar buffers de recepción y envío para cada cliente, Endlessh abre un socket de acceso directo y traduce paquetes TCP directamente, evitando casi toda la pila TCP/IP del sistema operativo. El búfer entrante no es necesario en absoluto porque no estamos interesados ​​en los datos entrantes.

El autor dice que en el momento de su programa no sabia sobre la existencia del asycio de Python y otros tarpits. Si conociera asycio, podría implementar su utilidad en solo 18 líneas 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 es ideal para escribir tarpits. Por ejemplo, este gancho congelará Firefox, Chrome o cualquier otro cliente que intente conectarse a su servidor HTTP durante muchas 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 es una gran herramienta para castigar a los acosadores en línea. Es cierto que, por el contrario, existe cierto riesgo de llamar su atención sobre el comportamiento inusual de un servidor en particular. Alguien podría pensar en venganza y un ataque DDoS dirigido a su IP. Sin embargo, hasta ahora no ha habido casos de este tipo y las lonas funcionan muy bien.

Concentradores:
Python, Seguridad de la información, Software, Administración de sistemas

Etiquetas:
SSH, Endlessh, tarpit, tarpit, trampa, asycio
Trampa (tarpit) para conexiones SSH entrantes

No es ningún secreto que Internet es un entorno muy hostil. Tan pronto como inicia un servidor, éste se ve instantáneamente sujeto a ataques masivos y múltiples análisis. Por ejemplo coño de los guardias de seguridad se puede estimar la escala de este tráfico de basura. De hecho, en un servidor promedio, el 99% del tráfico puede ser malicioso.

Tarpit es un puerto trampa que se utiliza para ralentizar las conexiones entrantes. Si un sistema de terceros se conecta a este puerto, no podrá cerrar la conexión rápidamente. Tendrá que desperdiciar los recursos de su sistema y esperar hasta que se agote el tiempo de conexión o finalizarla manualmente.

La mayoría de las veces, las lonas se utilizan como protección. La técnica se desarrolló por primera vez para proteger contra gusanos informáticos. Y ahora se puede utilizar para arruinar la vida de los spammers e investigadores que realizan un amplio escaneo de todas las direcciones IP seguidas (ejemplos de Habré: Austria, Ucrania).

Uno de los administradores del sistema, llamado Chris Wellons, aparentemente se cansó de ver esta desgracia y escribió un pequeño programa. Sin fin, un tarpit para SSH que ralentiza las conexiones entrantes. El programa abre un puerto (el puerto predeterminado para las pruebas es 2222) y pretende ser un servidor SSH, pero en realidad establece una conexión interminable con el cliente entrante hasta que se da por vencido. Esto puede continuar durante varios días o más hasta que el cliente se caiga.

Instalación de la utilidad:

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

Un tarpit correctamente implementado requerirá más recursos del atacante que de usted. Pero ni siquiera es una cuestión de recursos. Autor пишетque el programa es adictivo. Ahora mismo tiene atrapados a 27 clientes, algunos de ellos conectados desde hace semanas. ¡En el pico de actividad, 1378 clientes quedaron atrapados durante 20 horas!

En modo operativo, el servidor Endlessh debe instalarse en el puerto 22 habitual, donde los hooligans llaman en masa. Las recomendaciones de seguridad estándar siempre recomiendan mover SSH a un puerto diferente, lo que reduce inmediatamente el tamaño de los registros en un orden de magnitud.

Chris Wellons dice que su programa explota un párrafo de la especificación RFC 4253 al protocolo SSH. Inmediatamente después de que se establece una conexión TCP, pero antes de que se aplique la criptografía, ambas partes deben enviar una cadena de identificación. Y también hay una nota: "El servidor PUEDE enviar otras filas de datos antes de enviar la fila de versión". Y sin límite en el volumen de estos datos, solo necesita comenzar cada línea con SSH-.

Esto es exactamente lo que hace el programa Endlessh: envía sin fin flujo de datos generados aleatoriamente, que cumplen con RFC 4253, es decir, envían antes de la autenticación, y cada línea comienza con SSH- y no excede los 255 caracteres, incluido el carácter de final de línea. En general todo según el estándar.

De forma predeterminada, el programa espera 10 segundos entre envíos de paquetes. Esto evita que se agote el tiempo de espera del cliente, por lo que quedará atrapado para siempre.

Dado que los datos se envían antes de que se aplique la criptografía, el programa es extremadamente simple. No necesita implementar ningún cifrado y admite múltiples protocolos.

El autor intentó asegurarse de que la utilidad consumiera un mínimo de recursos y funcionara completamente desapercibida en la máquina. A diferencia de los antivirus modernos y otros "sistemas de seguridad", no debería ralentizar su computadora. Logró minimizar tanto el tráfico como el consumo de memoria gracias a una implementación de software un poco más astuta. Si simplemente iniciara un proceso separado en una nueva conexión, los atacantes potenciales podrían lanzar un ataque DDoS abriendo múltiples conexiones para agotar los recursos de la máquina. Un subproceso por conexión tampoco es la mejor opción, porque el kernel desperdiciará recursos administrando subprocesos.

Es por eso que Chris Wellons eligió la opción más liviana para Endlessh: un servidor de un solo subproceso. poll(2), donde los clientes en la trampa prácticamente no consumen recursos adicionales, sin contar el objeto socket en el kernel y otros 78 bytes para el seguimiento en Endlessh. Para evitar tener que asignar buffers de recepción y envío para cada cliente, Endlessh abre un socket de acceso directo y traduce paquetes TCP directamente, evitando casi toda la pila TCP/IP del sistema operativo. El búfer entrante no es necesario en absoluto porque no estamos interesados ​​en los datos entrantes.

El autor dice que en el momento de su programa no sabia sobre la existencia del asycio de Python y otros tarpits. Si conociera asycio, podría implementar su utilidad en solo 18 líneas 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 es ideal para escribir tarpits. Por ejemplo, este gancho congelará Firefox, Chrome o cualquier otro cliente que intente conectarse a su servidor HTTP durante muchas 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 es una gran herramienta para castigar a los acosadores en línea. Es cierto que, por el contrario, existe cierto riesgo de llamar su atención sobre el comportamiento inusual de un servidor en particular. Alguien podría pensar en venganza y un ataque DDoS dirigido a su IP. Sin embargo, hasta ahora no ha habido casos de este tipo y las lonas funcionan muy bien.

Trampa (tarpit) para conexiones SSH entrantes

Fuente: habr.com

Añadir un comentario