Trap (tarpit) pour les connexions SSH entrantes

Ce n'est un secret pour personne qu'Internet est un environnement très hostile. Dès que vous lancez un serveur, il est instantanément soumis à des attaques massives et à de multiples analyses. Par exemple pot de miel des gardes de sécurité vous pouvez estimer l'ampleur de ce trafic de déchets. En fait, sur un serveur moyen, 99 % du trafic peut être malveillant.

Tarpit est un port d'interruption utilisé pour ralentir les connexions entrantes. Si un système tiers se connecte à ce port, il ne sera pas possible de fermer rapidement la connexion. Elle devra gaspiller ses ressources système et attendre que la connexion soit expirée, ou la terminer manuellement.

Le plus souvent, les tarpits sont utilisés pour la protection. La technique a d'abord été développée pour se protéger contre les vers informatiques. Et maintenant, il peut être utilisé pour ruiner la vie des spammeurs et des chercheurs qui se livrent à un large scan de toutes les adresses IP à la suite (exemples sur Habré : Autriche, Ukraine).

L'un des administrateurs système nommé Chris Wellons, apparemment fatigué de regarder cette honte - et il a écrit un petit programme Sans fin, un tarpit SSH qui ralentit les connexions entrantes. Le programme ouvre un port (par défaut, le port 2222 est spécifié pour les tests) et prétend être un serveur SSH, mais établit en fait une connexion sans fin avec un client entrant jusqu'à ce qu'il abandonne. Cela peut durer plusieurs jours ou plus jusqu'à ce que le client se retire.

Installation de l'utilitaire :

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

Un tarpit correctement mis en œuvre prendra plus de ressources à un attaquant qu'à vous. Mais ce n'est même pas une question de ressources. Auteur écritque le programme crée une dépendance. En ce moment, il a 27 clients dans son piège, certains d'entre eux connectés en quelques semaines. Au pic d'activité, 1378 clients se sont assis dans le piège pendant 20 heures !

En mode de fonctionnement, le serveur Endlessh doit être installé sur le port habituel 22, où les hooligans frappent en masse. Les conseils de sécurité standard conseillent toujours de déplacer SSH vers un port différent, ce qui réduit immédiatement la taille des journaux d'un ordre de grandeur.

Chris Wellons dit que son programme exploite un paragraphe de la spécification RFC 4253 au protocole SSH. Immédiatement après l'établissement de la connexion TCP, mais avant l'application de la cryptographie, les deux parties doivent envoyer une chaîne d'authentification. Et il y a une entrée : "Le serveur PEUT envoyer d'autres lignes de données avant d'envoyer la ligne de version". Et sans limites sur le montant de ces données, il suffit de commencer chaque ligne par SSH-.

C'est exactement ce que fait le programme Endlessh : il envoie sans fin flux de données générées aléatoirement, conformes à la RFC 4253, c'est-à-dire envoyées avant identification, et chaque ligne commence par SSH- et ne dépasse pas 255 caractères, y compris le caractère de fin de ligne. En général, tout est conforme à la norme.

Par défaut, le programme attend 10 secondes entre les envois de paquets. Cela empêche un délai d'attente, de sorte que le client sera piégé pour toujours.

Étant donné que les données sont envoyées avant que la cryptographie ne soit appliquée, le programme est extrêmement simple. Il n'a pas besoin d'implémenter de chiffrement et de prendre en charge plusieurs protocoles.

L'auteur a essayé de faire en sorte que l'utilitaire consomme un minimum de ressources et fonctionne complètement inaperçu sur la machine. Contrairement aux antivirus modernes et autres "systèmes de sécurité", il ne doit pas ralentir l'ordinateur. Il a réussi à minimiser à la fois le trafic et la consommation de mémoire grâce à une implémentation logicielle légèrement plus astucieuse. S'il vient de démarrer un processus séparé sur une nouvelle connexion, les attaquants potentiels pourraient mener une attaque DDoS en ouvrant de nombreuses connexions pour épuiser les ressources de la machine. Un thread par connexion n'est pas non plus la meilleure option, car le noyau gaspillera des ressources pour la gestion des threads.

Par conséquent, Chris Wellons a choisi l'option la plus légère pour Endlessh : un serveur monothread poll(2), où les clients du piège ne consomment presque aucune ressource supplémentaire, sans compter l'objet socket dans le noyau et 78 octets supplémentaires à suivre dans Endlessh. Afin de ne pas allouer de tampons de réception et d'envoi pour chaque client, Endlessh ouvre un socket d'accès direct et traduit directement les paquets TCP, en ignorant la quasi-totalité de la pile TCP/IP du système d'exploitation. Le tampon entrant n'est pas du tout nécessaire, car nous ne sommes pas intéressés par les données entrantes.

L'auteur dit qu'à l'époque de son programme ne savait pas sur l'existence de l'asycio de Python et d'autres tarpits. S'il connaissait asycio, alors il pourrait implémenter son utilitaire en seulement 18 lignes 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 est idéal pour écrire des tarpits. Par exemple, ce hook bloquera Firefox, Chrome ou un autre client qui tente de se connecter à votre serveur HTTP pendant plusieurs heures :

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 est un excellent outil pour punir les intimidateurs en ligne. Certes, il y a un risque, au contraire, d'attirer leur attention sur le comportement inhabituel d'un serveur particulier. Quelqu'un peut penser à se venger et une attaque DDoS ciblée sur votre IP. Cependant, jusqu'à présent, il n'y a pas eu de tels cas, et les tarpits fonctionnent bien.

Hubs :
Python, Sécurité de l'information, Logiciel, Administration système

tags:
SSH, Endlessh, tarpit, piège, asycio
Trap (tarpit) pour les connexions SSH entrantes

Ce n'est un secret pour personne qu'Internet est un environnement très hostile. Dès que vous lancez un serveur, il est instantanément soumis à des attaques massives et à de multiples analyses. Par exemple pot de miel des gardes de sécurité vous pouvez estimer l'ampleur de ce trafic de déchets. En fait, sur un serveur moyen, 99 % du trafic peut être malveillant.

Tarpit est un port d'interruption utilisé pour ralentir les connexions entrantes. Si un système tiers se connecte à ce port, il ne sera pas possible de fermer rapidement la connexion. Elle devra gaspiller ses ressources système et attendre que la connexion soit expirée, ou la terminer manuellement.

Le plus souvent, les tarpits sont utilisés pour la protection. La technique a d'abord été développée pour se protéger contre les vers informatiques. Et maintenant, il peut être utilisé pour ruiner la vie des spammeurs et des chercheurs qui se livrent à un large scan de toutes les adresses IP à la suite (exemples sur Habré : Autriche, Ukraine).

L'un des administrateurs système nommé Chris Wellons, apparemment fatigué de regarder cette honte - et il a écrit un petit programme Sans fin, un tarpit SSH qui ralentit les connexions entrantes. Le programme ouvre un port (par défaut, le port 2222 est spécifié pour les tests) et prétend être un serveur SSH, mais établit en fait une connexion sans fin avec un client entrant jusqu'à ce qu'il abandonne. Cela peut durer plusieurs jours ou plus jusqu'à ce que le client se retire.

Installation de l'utilitaire :

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

Un tarpit correctement mis en œuvre prendra plus de ressources à un attaquant qu'à vous. Mais ce n'est même pas une question de ressources. Auteur écritque le programme crée une dépendance. En ce moment, il a 27 clients dans son piège, certains d'entre eux connectés en quelques semaines. Au pic d'activité, 1378 clients se sont assis dans le piège pendant 20 heures !

En mode de fonctionnement, le serveur Endlessh doit être installé sur le port habituel 22, où les hooligans frappent en masse. Les conseils de sécurité standard conseillent toujours de déplacer SSH vers un port différent, ce qui réduit immédiatement la taille des journaux d'un ordre de grandeur.

Chris Wellons dit que son programme exploite un paragraphe de la spécification RFC 4253 au protocole SSH. Immédiatement après l'établissement de la connexion TCP, mais avant l'application de la cryptographie, les deux parties doivent envoyer une chaîne d'authentification. Et il y a une entrée : "Le serveur PEUT envoyer d'autres lignes de données avant d'envoyer la ligne de version". Et sans limites sur le montant de ces données, il suffit de commencer chaque ligne par SSH-.

C'est exactement ce que fait le programme Endlessh : il envoie sans fin flux de données générées aléatoirement, conformes à la RFC 4253, c'est-à-dire envoyées avant identification, et chaque ligne commence par SSH- et ne dépasse pas 255 caractères, y compris le caractère de fin de ligne. En général, tout est conforme à la norme.

Par défaut, le programme attend 10 secondes entre les envois de paquets. Cela empêche un délai d'attente, de sorte que le client sera piégé pour toujours.

Étant donné que les données sont envoyées avant que la cryptographie ne soit appliquée, le programme est extrêmement simple. Il n'a pas besoin d'implémenter de chiffrement et de prendre en charge plusieurs protocoles.

L'auteur a essayé de faire en sorte que l'utilitaire consomme un minimum de ressources et fonctionne complètement inaperçu sur la machine. Contrairement aux antivirus modernes et autres "systèmes de sécurité", il ne doit pas ralentir l'ordinateur. Il a réussi à minimiser à la fois le trafic et la consommation de mémoire grâce à une implémentation logicielle légèrement plus astucieuse. S'il vient de démarrer un processus séparé sur une nouvelle connexion, les attaquants potentiels pourraient mener une attaque DDoS en ouvrant de nombreuses connexions pour épuiser les ressources de la machine. Un thread par connexion n'est pas non plus la meilleure option, car le noyau gaspillera des ressources pour la gestion des threads.

Par conséquent, Chris Wellons a choisi l'option la plus légère pour Endlessh : un serveur monothread poll(2), où les clients du piège ne consomment presque aucune ressource supplémentaire, sans compter l'objet socket dans le noyau et 78 octets supplémentaires à suivre dans Endlessh. Afin de ne pas allouer de tampons de réception et d'envoi pour chaque client, Endlessh ouvre un socket d'accès direct et traduit directement les paquets TCP, en ignorant la quasi-totalité de la pile TCP/IP du système d'exploitation. Le tampon entrant n'est pas du tout nécessaire, car nous ne sommes pas intéressés par les données entrantes.

L'auteur dit qu'à l'époque de son programme ne savait pas sur l'existence de l'asycio de Python et d'autres tarpits. S'il connaissait asycio, alors il pourrait implémenter son utilitaire en seulement 18 lignes 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 est idéal pour écrire des tarpits. Par exemple, ce hook bloquera Firefox, Chrome ou un autre client qui tente de se connecter à votre serveur HTTP pendant plusieurs heures :

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 est un excellent outil pour punir les intimidateurs en ligne. Certes, il y a un risque, au contraire, d'attirer leur attention sur le comportement inhabituel d'un serveur particulier. Quelqu'un peut penser à se venger et une attaque DDoS ciblée sur votre IP. Cependant, jusqu'à présent, il n'y a pas eu de tels cas, et les tarpits fonctionnent bien.

Trap (tarpit) pour les connexions SSH entrantes

Source: habr.com

Ajouter un commentaire