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
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é :
L'un des administrateurs système nommé Chris Wellons, apparemment fatigué de regarder cette honte - et il a écrit un petit programme
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
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 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
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
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
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é :
L'un des administrateurs système nommé Chris Wellons, apparemment fatigué de regarder cette honte - et il a écrit un petit programme
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
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 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
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
Source: habr.com