Il n'est pas un secret que l'internet est un environnement très hostile. Dès que vous mettez un serveur en ligne, il est instantanément soumis à des attaques massives et à de multiples scans. Prenons l'exemple pour évaluer l'ampleur de ce trafic indésirable. En réalité, sur un serveur moyen, 99 % du trafic peut être malveillant.
Un Tarpit est un port leurre utilisé pour ralentir les connexions entrantes. Si un système tiers se connecte à ce port, il ne pourra pas fermer rapidement la connexion. Il devra utiliser ses ressources système et attendre que la connexion soit interrompue par un timeout, ou la rompre manuellement.
Les tarpits sont le plus souvent utilisés pour la protection. Cette technique a d'abord été développée pour se protéger contre les vers informatiques. Et maintenant, elle peut être utilisée pour pourrir la vie des spammeurs et des chercheurs qui effectuent un large scanning de toutes les adresses IP consécutivement (exemples sur Habr : , ).
Un des administrateurs système, nommé Chris Vellons, en avait visiblement assez de ce désordre - il a donc écrit un petit programme , un tarpit pour SSH qui ralentit les connexions entrantes. Le programme ouvre un port (par défaut pour les tests, le port 2222 est utilisé) et se fait passer pour un serveur SSH, mais établit en réalité une connexion infinie avec le client entrant, jusqu'à ce que celui-ci abandonne. Cela peut durer plusieurs jours ou plus, tant que le client ne se déconnecte pas.
Installation de l'utilitaire :
$ make
$ ./endlessh &
$ ssh -p2222 localhostUn tarpit bien implémenté demandera plus de ressources au pirate qu'à vous. Mais ce n'est même pas une question de ressources. L'auteur , dit que le programme crée une dépendance. En ce moment, il a 27 clients dans son piège, dont certains sont connectés depuis des semaines. Au plus fort de l'activité, 1378 clients étaient piégés pendant 20 heures !
En mode opérationnel, le serveur Endlessh doit être placé sur le port standard 22, où les pirates tentent massivement des connexions. Les recommandations de sécurité standard conseillent toujours de déplacer SSH sur un autre port, ce qui réduit immédiatement la taille des journaux.
Chris Vellons dit que son programme exploite un paragraphe de la spécification sur le protocole SSH. Immédiatement après l'établissement de la connexion TCP, mais avant l'application du chiffrement, les deux parties doivent envoyer une chaîne d'identification. Et il y a aussi un ajout : «Le serveur PEUT envoyer d'autres lignes de données avant d'envoyer la ligne de version». Et pas de limite sur le volume de ces données, il suffit de commencer chaque ligne par SSH-.
C'est exactement ce que fait le programme Endlessh : il envoie flux infini de données générées aléatoirement, qui respectent la RFC 4253, c'est-à-dire l'envoi avant l'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 gros, tout est conforme à la norme.
Par défaut, le programme attend 10 secondes entre l'envoi des paquets. Cela empêche la déconnexion par timeout, de sorte que le client restera piégé pour l'éternité.
Étant donné que l'envoi de données se fait avant l'application de la cryptographie, le programme est extrêmement simple. Il n'est pas nécessaire d'incorporer des chiffrages et de supporter de nombreux protocoles.
L'auteur a veillé à ce que l'utilitaire consomme un minimum de ressources et fonctionne de manière totalement discrète 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 mise en œuvre logicielle légèrement plus astucieuse. S'il avait simplement lancé un processus distinct pour chaque nouvelle connexion, des attaquants potentiels auraient pu mener une attaque DDoS en ouvrant de nombreuses connexions pour épuiser les ressources de la machine. Un flux par connexion — ce n'est pas non plus la meilleure option, car le noyau dépenserait des ressources pour gérer les flux.
C'est pourquoi Chris Vallons a choisi pour Endlessh l'option la plus légère : un serveur monocœur poll(2), où les clients piégés consomment pratiquement aucune ressource supplémentaire, à part l'objet socket dans le noyau et encore 78 octets pour le suivi dans Endlessh. Pour ne pas allouer des tampons de réception et d'envoi pour chaque client, Endlessh ouvre un socket d'accès direct et transfère directement les paquets TCP, ignorant presque toute la pile TCP/IP du système d'exploitation. Le tampon entrant n'est absolument pas nécessaire, car les données entrantes ne nous intéressent pas.
L'auteur dit qu'à l'époque de son programme qu'il existait asyncio en Python et d'autres pièges. S'il avait su ce qu'était asyncio, il aurait pu réaliser 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 parfaitement adapté pour écrire des tarpit. Par exemple, un tel tarpit peut suspendre Firefox, Chrome ou un autre client essayant de se connecter à votre serveur HTTP pendant de nombreuses 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())Le tarpit est un excellent outil pour punir les cyber-harceleurs. Cependant, il y a un certain risque d'attirer leur attention sur le comportement inhabituel d'un serveur particulier. Quelqu'un 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 très bien.
Catégories :
Python, Sécurité informatique, Logiciels, Administration système
Tags :
SSH, Endlessh, tarpit, tarpit, piège, asyncio
Piège (tarpit) pour les connexions SSH entrantes
Il n'est pas un secret que l'internet est un environnement très hostile. Dès que vous mettez un serveur en ligne, il est instantanément soumis à des attaques massives et à de multiples scans. Prenons l'exemple pour évaluer l'ampleur de ce trafic indésirable. En réalité, sur un serveur moyen, 99 % du trafic peut être malveillant.
Un Tarpit est un port leurre utilisé pour ralentir les connexions entrantes. Si un système tiers se connecte à ce port, il ne pourra pas fermer rapidement la connexion. Il devra utiliser ses ressources système et attendre que la connexion soit interrompue par un timeout, ou la rompre manuellement.
Les tarpits sont le plus souvent utilisés pour la protection. Cette technique a d'abord été développée pour se protéger contre les vers informatiques. Et maintenant, elle peut être utilisée pour pourrir la vie des spammeurs et des chercheurs qui effectuent un large scanning de toutes les adresses IP consécutivement (exemples sur Habr : , ).
Un des administrateurs système, nommé Chris Vellons, en avait visiblement assez de ce désordre - il a donc écrit un petit programme , un tarpit pour SSH qui ralentit les connexions entrantes. Le programme ouvre un port (par défaut pour les tests, le port 2222 est utilisé) et se fait passer pour un serveur SSH, mais établit en réalité une connexion infinie avec le client entrant, jusqu'à ce que celui-ci abandonne. Cela peut durer plusieurs jours ou plus, tant que le client ne se déconnecte pas.
Installation de l'utilitaire :
$ make
$ ./endlessh &
$ ssh -p2222 localhostUn tarpit bien implémenté demandera plus de ressources au pirate qu'à vous. Mais ce n'est même pas une question de ressources. L'auteur , dit que le programme crée une dépendance. En ce moment, il a 27 clients dans son piège, dont certains sont connectés depuis des semaines. Au plus fort de l'activité, 1378 clients étaient piégés pendant 20 heures !
En mode opérationnel, le serveur Endlessh doit être placé sur le port standard 22, où les pirates tentent massivement des connexions. Les recommandations de sécurité standard conseillent toujours de déplacer SSH sur un autre port, ce qui réduit immédiatement la taille des journaux.
Chris Vellons dit que son programme exploite un paragraphe de la spécification sur le protocole SSH. Immédiatement après l'établissement de la connexion TCP, mais avant l'application du chiffrement, les deux parties doivent envoyer une chaîne d'identification. Et il y a aussi un ajout : «Le serveur PEUT envoyer d'autres lignes de données avant d'envoyer la ligne de version». Et pas de limite sur le volume de ces données, il suffit de commencer chaque ligne par SSH-.
C'est exactement ce que fait le programme Endlessh : il envoie flux infini de données générées aléatoirement, qui respectent la RFC 4253, c'est-à-dire l'envoi avant l'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 gros, tout est conforme à la norme.
Par défaut, le programme attend 10 secondes entre l'envoi des paquets. Cela empêche la déconnexion par timeout, de sorte que le client restera piégé pour l'éternité.
Étant donné que l'envoi de données se fait avant l'application de la cryptographie, le programme est extrêmement simple. Il n'est pas nécessaire d'incorporer des chiffrages et de supporter de nombreux protocoles.
L'auteur a veillé à ce que l'utilitaire consomme un minimum de ressources et fonctionne de manière totalement discrète 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 mise en œuvre logicielle légèrement plus astucieuse. S'il avait simplement lancé un processus distinct pour chaque nouvelle connexion, des attaquants potentiels auraient pu mener une attaque DDoS en ouvrant de nombreuses connexions pour épuiser les ressources de la machine. Un flux par connexion — ce n'est pas non plus la meilleure option, car le noyau dépenserait des ressources pour gérer les flux.
C'est pourquoi Chris Vallons a choisi pour Endlessh l'option la plus légère : un serveur monocœur poll(2), où les clients piégés consomment pratiquement aucune ressource supplémentaire, à part l'objet socket dans le noyau et encore 78 octets pour le suivi dans Endlessh. Pour ne pas allouer des tampons de réception et d'envoi pour chaque client, Endlessh ouvre un socket d'accès direct et transfère directement les paquets TCP, ignorant presque toute la pile TCP/IP du système d'exploitation. Le tampon entrant n'est absolument pas nécessaire, car les données entrantes ne nous intéressent pas.
L'auteur dit qu'à l'époque de son programme qu'il existait asyncio en Python et d'autres pièges. S'il avait su ce qu'était asyncio, il aurait pu réaliser 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 parfaitement adapté pour écrire des tarpit. Par exemple, un tel tarpit peut suspendre Firefox, Chrome ou un autre client essayant de se connecter à votre serveur HTTP pendant de nombreuses 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())Le tarpit est un excellent outil pour punir les cyber-harceleurs. Cependant, il y a un certain risque d'attirer leur attention sur le comportement inhabituel d'un serveur particulier. Quelqu'un 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 très bien.
Source : habr.com
