No es ningún secreto que Internet es un entorno muy hostil. Tan pronto como levante el servidor, se someterá instantáneamente a ataques masivos y múltiples escaneos. En el ejemplo
de un hanipot de guardia de seguridad, uno puede estimar la escala de este tráfico basura. De hecho, en un servidor promedio, el 99% del tráfico puede ser malicioso.
Tarpit es un puerto trampa que se usa para ralentizar las conexiones entrantes. Si un sistema de terceros se conecta a este puerto, no funcionará cerrar la conexión rápidamente. Tendrá que gastar los recursos del sistema y esperar hasta que la conexión se interrumpa por un tiempo de espera, o interrumpirla manualmente.
Muy a menudo, las lonas se utilizan para protección. La técnica se desarrolló por primera vez para proteger contra gusanos informáticos. Y ahora se puede usar para estropear la vida de los spammers e investigadores que participan en un amplio escaneo de todas las direcciones IP seguidas (ejemplos en Habré:
Austria ,
Ucrania ).
Uno de los administradores de sistemas con el nombre de Chris Wellons, aparentemente cansado de ver esta desgracia, y escribió un pequeño programa
Endlessh , tarpit para SSH, ralentizando las conexiones entrantes. El programa abre el puerto (de forma predeterminada, el puerto 2222 está especificado para las pruebas) y pretende ser un servidor SSH, pero de hecho establece una conexión interminable con el cliente entrante hasta que se rinde. Esto puede durar varios días o más hasta que el cliente se caiga.
Instalación de utilidad:
$ make $ ./endlessh & $ ssh -p2222 localhost
Un tarpit correctamente implementado le quitará más recursos al atacante que usted. Pero el asunto ni siquiera está en los recursos. El autor
escribe que el programa es adictivo. En este momento hay 27 clientes atrapados, algunos de ellos conectados durante semanas. En el pico de la actividad, ¡1378 clientes se sentaron en la trampa durante 20 horas!
En modo operativo, el servidor Endlessh debe instalarse en el puerto 22 normal, donde los hooligans están golpeando masivamente. 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 para el protocolo SSH. Inmediatamente después de establecer una conexión TCP, pero antes de aplicar la criptografía, ambas partes deben enviar una cadena de identificación. Y hay una nota:
"El servidor PUEDE enviar otras filas de datos antes de enviar la fila con la versión" . Y
no hay límite en la cantidad de estos datos, solo que cada línea no debería comenzar con
SSH-
.
Esto es exactamente lo que hace Endlessh:
envía un flujo interminable de datos generados aleatoriamente que cumple con RFC 4253, es decir, envío antes de la identificación, y cada línea no comienza con
SSH-
y no supera los 255 caracteres, incluido el carácter de terminación de línea. En general, todo es estándar.
Por defecto, el programa espera 10 segundos entre el envío de paquetes. Esto evita un viaje de tiempo de espera para que el cliente quede atrapado para siempre.
Dado que los datos se envían antes de que se aplique la criptografía, el programa es excepcionalmente simple. No necesita implementar ningún cifrado y soporte para múltiples protocolos.
El autor trató de hacer que la utilidad consumiera un mínimo de recursos y funcionara perfectamente en la máquina. A diferencia de los antivirus modernos y otros "sistemas de seguridad", no debería ralentizar la computadora. Logró minimizar el tráfico y el consumo de memoria debido a una implementación de software un poco más astuta. Si simplemente comenzó un proceso separado en una nueva conexión, entonces los atacantes potenciales podrían realizar un ataque DDoS, abriendo muchas conexiones para agotar los recursos en la máquina. Un subproceso por conexión tampoco es la mejor opción, porque el núcleo gastará recursos en la gestión de subprocesos.
Por lo tanto, Chris Wellons eligió la opción más liviana para Endlessh: un servidor de
poll(2)
un solo subproceso
poll(2)
, donde los clientes en la trampa prácticamente no consumen recursos innecesarios, sin contar el objeto de socket en el núcleo y otros 78 bytes para el seguimiento en Endlessh. Para no asignar buffers de recepción y envío para cada cliente, Endlessh abre un socket de acceso directo y traduce directamente los paquetes TCP, ignorando casi toda la pila TCP / IP del sistema operativo. El buffer de entrada no es necesario en absoluto, porque los datos de entrada no nos interesan.
El autor dice que en el momento de su programa
no sabía sobre la existencia del Python Asycio y otras lonas. Si supiera sobre 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'%x\r\n' % 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 perfecto para escribir tarpit. Por ejemplo, una trampa de este tipo colgará Firefox, Chrome u 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 OK\r\n') try: while True: await asyncio.sleep(5) header = random.randint(0, 2**32) value = random.randint(0, 2**32) writer.write(b'X-%x: %x\r\n' % (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 existe cierto riesgo, por el contrario, 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 tales casos, y la lona funciona bien.

