Interruption (tarp) pour les connexions SSH entrantes

Ce n'est un secret pour personne qu'Internet est un environnement très hostile. Dès que vous soulevez le serveur, il subit instantanément des attaques massives et plusieurs analyses. Sur l'exemple d'un hanipot d'agent de sécurité, on peut estimer l'ampleur de ce trafic indésirable. En effet, sur un serveur moyen, 99% du trafic peut être malveillant.

Tarpit est un port d'interruption qui est utilisé pour ralentir les connexions entrantes. Si un système tiers se connecte à ce port, il ne fonctionnera pas pour fermer la connexion rapidement. Elle devra dépenser ses ressources système et attendre que la connexion soit interrompue par un délai d'attente, ou la rompre manuellement.

Le plus souvent, des bâches sont utilisées pour la protection. La technique a d'abord été développée pour protéger contre les vers informatiques. Et maintenant, il peut être utilisé pour gâcher la vie des spammeurs et des chercheurs qui sont engagés dans une large analyse de toutes les adresses IP d'affilée (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 Endlessh , tarpit pour SSH, ralentissant les connexions entrantes. Le programme ouvre le 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 le client entrant jusqu'à ce qu'il se rende. Cela peut durer plusieurs jours ou plus jusqu'à ce que le client tombe.

Installation de l'utilitaire:

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

Un tarpit correctement implanté enlèvera plus de ressources à l'attaquant que vous. Mais la question n'est même pas dans les ressources. L'auteur écrit que le programme crée une dépendance. À l'heure actuelle, 27 clients sont piégés, certains étant connectés depuis des semaines. Au plus fort de l'activité, 1378 clients sont restés dans le piège pendant 20 heures!

En mode de fonctionnement, le serveur Endlessh doit être installé sur le port régulier 22, où les hooligans frappent massivement. Les recommandations 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 pour le protocole SSH. Immédiatement après avoir établi une connexion TCP, mais avant d'appliquer la cryptographie, les deux parties doivent envoyer une chaîne d'identification. Et il y a une note: "Le serveur PEUT envoyer d'autres lignes de données avant d'envoyer la ligne avec la version . " Et il n'y a pas de limite sur la quantité de ces données, chaque ligne ne doit pas commencer par SSH- .

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

Par défaut, le programme attend 10 secondes entre l'envoi des paquets. Cela empêche un délai d'attente afin que le client soit piégé pour toujours.

Étant donné que les données sont envoyées avant l'application de la cryptographie, le programme est exceptionnellement 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 de manière absolument transparente sur la machine. Contrairement aux antivirus modernes et autres "systèmes de sécurité", il ne devrait 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 commençait simplement un processus distinct sur une nouvelle connexion, les attaquants potentiels pourraient mener une attaque DDoS, 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 dépensera 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 d'interrogation à un seul thread poll(2) , où les clients dans le piège ne consomment pratiquement pas de ressources inutiles, sans compter l'objet socket dans le noyau et 78 autres octets pour le suivi 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, ignorant la quasi-totalité de la pile TCP / IP du système d'exploitation. Le tampon d'entrée n'est pas du tout nécessaire, car les données d'entrée ne nous intéressent pas.

L'auteur dit qu'au moment de son programme, il ignorait l'existence du Python Asycio et d'autres bâches. S'il connaissait asycio, 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'%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 est parfait pour écrire tarpit. Par exemple, un tel piège bloquera Firefox, Chrome ou un autre client qui essaie 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 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 est un excellent outil pour punir les intimidateurs en ligne. Certes, il existe un risque, au contraire, d'attirer leur attention sur le comportement inhabituel d'un serveur particulier. Quelqu'un pourrait penser à la vengeance et à une attaque DDoS ciblée sur votre IP. Cependant, jusqu'à présent, il n'y a pas eu de tels cas, et tarpit fonctionne très bien.





Source: https://habr.com/ru/post/fr445318/


All Articles