Es ist kein Geheimnis, dass das Internet eine sehr feindliche Umgebung ist. Sobald Sie einen Server hochfahren, wird er sofort massiven Angriffen und zahlreichen Scans ausgesetzt. Am Beispiel lässt sich das Ausmaß dieses Mülltraffics abschätzen. Tatsächlich kann 99 % des Traffics auf einem durchschnittlichen Server schädlich sein.
Ein Tarpit ist ein Fangport, der verwendet wird, um eingehende Verbindungen zu verlangsamen. Wenn ein externes System sich mit diesem Port verbindet, kann die Verbindung nicht schnell geschlossen werden. Es muss Ressourcen aufwenden und warten, bis die Verbindung aufgrund eines Timeouts unterbrochen wird, oder sie manuell trennen.
Meistens werden Tarpite zum Schutz eingesetzt. Diese Technik wurde ursprünglich zum Schutz vor Computerviren entwickelt. Heutzutage kann sie genutzt werden, um Spammern und Forschern, die breitflächig alle IP-Adressen scannen, das Leben schwer zu machen (Beispiele bei Habr: , ).
Ein Systemadministrator namens Chris Wellons hatte anscheinend genug von diesem Unfug – und er schrieb ein kleines Programm , Tarpit für SSH, der eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (standardmäßig für Tests Port 2222) und gibt sich als SSH-Server aus, während es in Wirklichkeit eine endlose Verbindung mit dem eingehenden Client herstellt, bis dieser aufgibt. Das kann mehrere Tage oder länger dauern, bis der Client disconnectet.
Installation des Tools:
$ make
$ ./endlessh &
$ ssh -p2222 localhostEin gut implementierter Tarpit wird dem Angreifer mehr Ressourcen kosten als Ihnen. Aber es geht nicht nur um Ressourcen. Der Autor , dass das Programm süchtig macht. Momentan sind 27 Clients in seiner Falle, von denen einige seit Wochen verbunden sind. Zu Spitzenzeiten waren 1378 Clients für 20 Stunden gefangen!
Im laufenden Betrieb sollte der Endlessh-Server auf dem Standardport 22 installiert werden, auf den oft Angreifer zielen. Die gängigen Sicherheitsempfehlungen raten immer, SSH auf einen anderen Port zu verschieben, was sofort die Protokollgröße um ein Vielfaches reduziert.
Chris Wellons sagt, dass sein Programm einen Absatz aus der Spezifikation ausnutzt im SSH-Protokoll. Unmittelbar nach der Tcp-Verbindung, jedoch vor der Anwendung der Kryptografie, müssen beide Parteien eine Identifizierungszeile senden. Und dort ist ebenfalls ein Hinweis: „Der Server KANN weitere Datenzeilen senden, bevor die Zeile mit der Version gesendet wird“. Und es gibt keine Einschränkung für das Volumen dieser Daten, man muss nur sicherstellen, dass jede Zeile mit SSH-.
Genau das macht das Programm Endlessh: es sendet einen unendlichen Strom zufällig generierter Daten, die RFC 4253 entsprechen, was bedeutet, dass sie vor der Identifizierung gesendet werden, und jede Zeile mit SSH- beginnt und 255 Zeichen nicht überschreitet, einschließlich des Zeilenabschlusszeichens. Insgesamt alles nach Standard.
Standardmäßig wartet das Programm 10 Sekunden zwischen den Paketübertragungen. Dies verhindert eine Trennung wegen Zeitüberschreitung, sodass der Client für immer gefangen bleibt.
Da die Datenübertragung vor der Anwendung der Kryptografie erfolgt, ist das Programm äußerst einfach. Es müssen keine Verschlüsselungen implementiert und keine Unterstützung für mehrere Protokolle bereitgestellt werden.
Der Autor hat darauf geachtet, dass das Werkzeug minimale Ressourcen verbraucht und absolut unauffällig auf dem System arbeitet. Im Gegensatz zu modernen Antivirenprogrammen und anderen «Sicherheitssystemen» sollte es den Computer nicht verlangsamen. Es gelang ihm, sowohl den Datenverkehr als auch den Speicherverbrauch durch eine etwas raffiniertere Softwareimplementierung zu minimieren. Hätte er einfach einen separaten Prozess für jede neue Verbindung gestartet, hätten potenzielle Angreifer eine DDoS-Attacke ausführen können, indem sie viele Verbindungen zum Erschöpfen der Ressourcen auf dem System eröffneten. Auch ein Thread pro Verbindung ist nicht die beste Lösung, da der Kernel Ressourcen für das Management der Threads aufwenden würde.
Deshalb hat Chris Wellons die leichteste Variante für Endlessh gewählt: einen einthreadigen Server. poll(2), wo Kunden in der Regel keine überflüssigen Ressourcen verbrauchen, abgesehen vom Socketobjekt im Kern und zusätzlich 78 Bytes für das Tracking in Endlessh. Um die Empfangs- und Sendepuffer für jeden Client nicht bereitzustellen, öffnet Endlessh einen direkten Zugriffssocket und überträgt TCP-Pakete direkt, während fast der gesamte TCP/IP-Stack des Betriebssystems ignoriert wird. Ein Eingabepuffer ist überhaupt nicht erforderlich, da uns eingehende Daten nicht interessieren.
Der Autor sagt, dass er zu dem Zeitpunkt seiner Programmierung über die Existenz von Python's asyncio und anderen TarPit-Techniken. Hätte er von asyncio gewusst, hätte er sein Utility in nur 18 Zeilen in Python implementieren können:
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 eignet sich hervorragend für das Schreiben von TarPits. Beispielsweise kann eine solche Falle stundenlang Firefox, Chrome oder einen anderen Client aufhängen, der versucht, sich mit Ihrem HTTP-Server zu verbinden:
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())Ein Tarpit ist ein hervorragendes Werkzeug, um Internet-Hooligans zu bestrafen. Allerdings besteht die gewisse Gefahr, dass man ihre Aufmerksamkeit auf das ungewöhnliche Verhalten eines speziellen Servers lenkt. Jemand und gezielte DDoS-Attacken auf Ihre IP ins Auge fassen. Bisher gab es jedoch solche Fälle nicht, und Tarplets funktionieren ausgezeichnet.
Hubs:
Python, Informationssicherheit, Software, Systemadministration
Tags:
SSH, Endlessh, Tarpit, tarpit, Falle, asyncio
Tarpit für eingehende SSH-Verbindungen
Es ist kein Geheimnis, dass das Internet eine sehr feindliche Umgebung ist. Sobald Sie einen Server hochfahren, wird er sofort massiven Angriffen und zahlreichen Scans ausgesetzt. Am Beispiel lässt sich das Ausmaß dieses Mülltraffics abschätzen. Tatsächlich kann 99 % des Traffics auf einem durchschnittlichen Server schädlich sein.
Ein Tarpit ist ein Fangport, der verwendet wird, um eingehende Verbindungen zu verlangsamen. Wenn ein externes System sich mit diesem Port verbindet, kann die Verbindung nicht schnell geschlossen werden. Es muss Ressourcen aufwenden und warten, bis die Verbindung aufgrund eines Timeouts unterbrochen wird, oder sie manuell trennen.
Meistens werden Tarpite zum Schutz eingesetzt. Diese Technik wurde ursprünglich zum Schutz vor Computerviren entwickelt. Heutzutage kann sie genutzt werden, um Spammern und Forschern, die breitflächig alle IP-Adressen scannen, das Leben schwer zu machen (Beispiele bei Habr: , ).
Ein Systemadministrator namens Chris Wellons hatte anscheinend genug von diesem Unfug – und er schrieb ein kleines Programm , Tarpit für SSH, der eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (standardmäßig für Tests Port 2222) und gibt sich als SSH-Server aus, während es in Wirklichkeit eine endlose Verbindung mit dem eingehenden Client herstellt, bis dieser aufgibt. Das kann mehrere Tage oder länger dauern, bis der Client disconnectet.
Installation des Tools:
$ make
$ ./endlessh &
$ ssh -p2222 localhostEin gut implementierter Tarpit wird dem Angreifer mehr Ressourcen kosten als Ihnen. Aber es geht nicht nur um Ressourcen. Der Autor , dass das Programm süchtig macht. Momentan sind 27 Clients in seiner Falle, von denen einige seit Wochen verbunden sind. Zu Spitzenzeiten waren 1378 Clients für 20 Stunden gefangen!
Im laufenden Betrieb sollte der Endlessh-Server auf dem Standardport 22 installiert werden, auf den oft Angreifer zielen. Die gängigen Sicherheitsempfehlungen raten immer, SSH auf einen anderen Port zu verschieben, was sofort die Protokollgröße um ein Vielfaches reduziert.
Chris Wellons sagt, dass sein Programm einen Absatz aus der Spezifikation ausnutzt im SSH-Protokoll. Unmittelbar nach der Tcp-Verbindung, jedoch vor der Anwendung der Kryptografie, müssen beide Parteien eine Identifizierungszeile senden. Und dort ist ebenfalls ein Hinweis: „Der Server KANN weitere Datenzeilen senden, bevor die Zeile mit der Version gesendet wird“. Und es gibt keine Einschränkung für das Volumen dieser Daten, man muss nur sicherstellen, dass jede Zeile mit SSH-.
Genau das macht das Programm Endlessh: es sendet einen unendlichen Strom zufällig generierter Daten, die RFC 4253 entsprechen, was bedeutet, dass sie vor der Identifizierung gesendet werden, und jede Zeile mit SSH- beginnt und 255 Zeichen nicht überschreitet, einschließlich des Zeilenabschlusszeichens. Insgesamt alles nach Standard.
Standardmäßig wartet das Programm 10 Sekunden zwischen den Paketübertragungen. Dies verhindert eine Trennung wegen Zeitüberschreitung, sodass der Client für immer gefangen bleibt.
Da die Datenübertragung vor der Anwendung der Kryptografie erfolgt, ist das Programm äußerst einfach. Es müssen keine Verschlüsselungen implementiert und keine Unterstützung für mehrere Protokolle bereitgestellt werden.
Der Autor hat darauf geachtet, dass das Werkzeug minimale Ressourcen verbraucht und absolut unauffällig auf dem System arbeitet. Im Gegensatz zu modernen Antivirenprogrammen und anderen «Sicherheitssystemen» sollte es den Computer nicht verlangsamen. Es gelang ihm, sowohl den Datenverkehr als auch den Speicherverbrauch durch eine etwas raffiniertere Softwareimplementierung zu minimieren. Hätte er einfach einen separaten Prozess für jede neue Verbindung gestartet, hätten potenzielle Angreifer eine DDoS-Attacke ausführen können, indem sie viele Verbindungen zum Erschöpfen der Ressourcen auf dem System eröffneten. Auch ein Thread pro Verbindung ist nicht die beste Lösung, da der Kernel Ressourcen für das Management der Threads aufwenden würde.
Deshalb hat Chris Wellons die leichteste Variante für Endlessh gewählt: einen einthreadigen Server. poll(2), wo Kunden in der Regel keine überflüssigen Ressourcen verbrauchen, abgesehen vom Socketobjekt im Kern und zusätzlich 78 Bytes für das Tracking in Endlessh. Um die Empfangs- und Sendepuffer für jeden Client nicht bereitzustellen, öffnet Endlessh einen direkten Zugriffssocket und überträgt TCP-Pakete direkt, während fast der gesamte TCP/IP-Stack des Betriebssystems ignoriert wird. Ein Eingabepuffer ist überhaupt nicht erforderlich, da uns eingehende Daten nicht interessieren.
Der Autor sagt, dass er zu dem Zeitpunkt seiner Programmierung über die Existenz von Python's asyncio und anderen TarPit-Techniken. Hätte er von asyncio gewusst, hätte er sein Utility in nur 18 Zeilen in Python implementieren können:
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 eignet sich hervorragend für das Schreiben von TarPits. Beispielsweise kann eine solche Falle stundenlang Firefox, Chrome oder einen anderen Client aufhängen, der versucht, sich mit Ihrem HTTP-Server zu verbinden:
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())Ein Tarpit ist ein hervorragendes Werkzeug, um Internet-Hooligans zu bestrafen. Allerdings besteht die gewisse Gefahr, dass man ihre Aufmerksamkeit auf das ungewöhnliche Verhalten eines speziellen Servers lenkt. Jemand und gezielte DDoS-Attacken auf Ihre IP ins Auge fassen. Bisher gab es jedoch solche Fälle nicht, und Tarplets funktionieren ausgezeichnet.
Quelle: habr.com
