Falle (Tarpit) für eingehende SSH-Verbindungen

Es ist kein Geheimnis, dass das Internet eine äußerst feindliche Umgebung ist. Sobald Sie einen Server hochfahren, wird er sofort massiven Angriffen und zahlreichen Scans ausgesetzt. Am Beispiel eines Honeypots von Sicherheitsfachleuten kann man das Ausmaß dieses Müllverkehrs einschätzen. Tatsächlich kann 99 % des Traffics auf einem durchschnittlichen Server schädlich sein.

Ein Tarpit ist ein Port, der als Falle dient, um eingehende Verbindungen zu verlangsamen. Wenn ein externes System sich mit diesem Port verbindet, kann die Verbindung nicht schnell geschlossen werden. Es wird gezwungen, Systemressourcen zu verbrauchen und zu warten, bis die Verbindung aufgrund eines Timeouts unterbrochen wird, oder sie manuell zu beenden.

Tarpits werden am häufigsten zum Schutz eingesetzt. Die Technik wurde erstmals zur Abwehr von Computerwürmern entwickelt. Heute kann sie verwendet werden, um Spammern und Forschern, die eine umfassende IP-Adressenscanner betreiben, das Leben schwer zu machen (Beispiele auf Habré: Österreich, Ukraine).

Einem der Systemadministratoren, der anscheinend genug von diesem Chaos hatte, namens Chris Vellons, ist es gelungen, ein kleines Programm zu schreiben Endlessh, ein Tarpit für SSH, das eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (standardmäßig wird Port 2222 für Tests angegeben) und gibt sich als SSH-Server aus, während es tatsächlich eine unendliche Verbindung mit dem eingehenden Client herstellt, bis dieser aufgibt. Dies kann mehrere Tage oder länger dauern, bis der Client abbricht.

Installation des Tools:

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

Ein richtig implementierter Tarpit wird den Angreifer mehr Ressourcen kosten, als sie Ihnen abverlangen. Aber es geht nicht nur um die Ressourcen. Der Autor berichtetsagt, dass das Programm süchtig macht. Zurzeit sitzen 27 Clients in seiner Falle, einige davon sind seit Wochen verbunden. In Spitzenzeiten saßen 1378 Clients während 20 Stunden in der Falle!

Im Betrieb sollte der Endlessh-Server auf dem Standardport 22 installiert werden, auf den sich massenhaft Gauner verbinden. Die Standard-Sicherheitsempfehlungen raten immer dazu, SSH auf einen anderen Port zu verlegen, was sofort die Größe der Protokolldateien erheblich reduziert.

Chris Vellons sagt, dass sein Programm einen Absatz aus der Spezifikation ausnutzt RFC 4253 für das SSH-Protokoll. Unmittelbar nach der Etablierung der TCP-Verbindung, aber vor der Anwendung von Kryptographie, müssen beide Seiten eine Identifikationszeile senden. Und dort steht auch: „Der Server KANN andere Datenzeilen senden, bevor er die Zeile mit der Version sendet“. Und es gibt keine Begrenzung für das Volumen dieser Daten, lediglich jede Zeile muss mit SSH-.

Genau das macht das Programm Endlessh: es sendet endloser Strom von zufällig generierten Daten, die RFC 4253 entsprechen, d.h. die Übertragung erfolgt vor der Identifizierung, und jede Zeile beginnt mit SSH- und überschreitet 255 Zeichen nicht, einschließlich des Zeilenendzeichens. Insgesamt alles nach Standard.

Standardmäßig wartet das Programm 10 Sekunden zwischen den Paketübertragungen. Dies verhindert eine Zeitüberschreitung, sodass der Client für immer in der Falle sitzt.

Da die Datenübertragung vor der Anwendung von Kryptografie erfolgt, ist das Programm ausgesprochen einfach. Es müssen keine Verschlüsselungen implementiert oder zahlreiche Protokolle unterstützt werden.

Der Autor hat sich bemüht, das Tool ressourcenschonend zu gestalten und völlig unauffällig auf dem Rechner zu arbeiten. 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 cleverere Softwareimplementierung zu minimieren. Hätte er einfach einen separaten Prozess für jede neue Verbindung gestartet, könnten potenzielle Angreifer DDoS-Angriffe durchführen, indem sie zahlreiche Verbindungen öffnen, um die Ressourcen des Rechners auszuschöpfen. Ein Strom pro Verbindung ist auch nicht die beste Option, da der Kernel Ressourcen für die Verwaltung der Ströme aufwenden würde.

Deshalb wählte Chris Wellons die leichtgewichtigste Option für Endlessh: einen einsträngigen Server poll(2), bei dem gefangene Clients nahezu keine zusätzlichen Ressourcen verbrauchen, abgesehen von dem Socket-Objekt im Kernel und weiteren 78 Byte zur Nachverfolgung in Endlessh. Um keine Empfangs- und Versandpuffer für jeden Client zuzuweisen, öffnet Endlessh einen Direktzugriffs-Socket und überträgt die TCP-Pakete direkt und ignoriert fast den gesamten TCP/IP-Stack des Betriebssystems. Der Eingabepuffer ist überhaupt nicht erforderlich, da uns eingehende Daten nicht interessieren.

Der Autor sagt, dass er zum Zeitpunkt seines Programms nicht wusste von der Existenz von Pythons asycio und anderen Tar pits. Hätte er von asycio gewusst, hätte er sein Tool in nur 18 Zeilen in Python umsetzen 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 zum Schreiben von Tar Pit-Servern. Zum Beispiel kann eine solche Falle Firefox, Chrome oder einen anderen Client, der versucht, sich mit Ihrem HTTP-Server zu verbinden, für viele Stunden aufhalten:

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 Tar Pit ist ein hervorragendes Werkzeug, um Internet-Ganoven zu bestrafen. Allerdings besteht das Risiko, sie auf das ungewöhnliche Verhalten eines bestimmten Servers aufmerksam zu machen. Jemand könnte Rachegedanken hegen und eine gezielte DDoS-Attacke auf Ihre IP planen. Bisher gab es jedoch keine solchen Vorfälle, und Tar Pits funktionieren ausgezeichnet.

Themen:
Python, Informationssicherheit, Software, Systemadministration

Tags:
SSH, Endlessh, Tar Pit, tarpit, Falle, asyncio
Falle (Tarpit) für eingehende SSH-Verbindungen

Es ist kein Geheimnis, dass das Internet eine äußerst feindliche Umgebung ist. Sobald Sie einen Server hochfahren, wird er sofort massiven Angriffen und zahlreichen Scans ausgesetzt. Am Beispiel eines Honeypots von Sicherheitsfachleuten kann man das Ausmaß dieses Müllverkehrs einschätzen. Tatsächlich kann 99 % des Traffics auf einem durchschnittlichen Server schädlich sein.

Ein Tarpit ist ein Port, der als Falle dient, um eingehende Verbindungen zu verlangsamen. Wenn ein externes System sich mit diesem Port verbindet, kann die Verbindung nicht schnell geschlossen werden. Es wird gezwungen, Systemressourcen zu verbrauchen und zu warten, bis die Verbindung aufgrund eines Timeouts unterbrochen wird, oder sie manuell zu beenden.

Tarpits werden am häufigsten zum Schutz eingesetzt. Die Technik wurde erstmals zur Abwehr von Computerwürmern entwickelt. Heute kann sie verwendet werden, um Spammern und Forschern, die eine umfassende IP-Adressenscanner betreiben, das Leben schwer zu machen (Beispiele auf Habré: Österreich, Ukraine).

Einem der Systemadministratoren, der anscheinend genug von diesem Chaos hatte, namens Chris Vellons, ist es gelungen, ein kleines Programm zu schreiben Endlessh, ein Tarpit für SSH, das eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (standardmäßig wird Port 2222 für Tests angegeben) und gibt sich als SSH-Server aus, während es tatsächlich eine unendliche Verbindung mit dem eingehenden Client herstellt, bis dieser aufgibt. Dies kann mehrere Tage oder länger dauern, bis der Client abbricht.

Installation des Tools:

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

Ein richtig implementierter Tarpit wird den Angreifer mehr Ressourcen kosten, als sie Ihnen abverlangen. Aber es geht nicht nur um die Ressourcen. Der Autor berichtetsagt, dass das Programm süchtig macht. Zurzeit sitzen 27 Clients in seiner Falle, einige davon sind seit Wochen verbunden. In Spitzenzeiten saßen 1378 Clients während 20 Stunden in der Falle!

Im Betrieb sollte der Endlessh-Server auf dem Standardport 22 installiert werden, auf den sich massenhaft Gauner verbinden. Die Standard-Sicherheitsempfehlungen raten immer dazu, SSH auf einen anderen Port zu verlegen, was sofort die Größe der Protokolldateien erheblich reduziert.

Chris Vellons sagt, dass sein Programm einen Absatz aus der Spezifikation ausnutzt RFC 4253 für das SSH-Protokoll. Unmittelbar nach der Etablierung der TCP-Verbindung, aber vor der Anwendung von Kryptographie, müssen beide Seiten eine Identifikationszeile senden. Und dort steht auch: „Der Server KANN andere Datenzeilen senden, bevor er die Zeile mit der Version sendet“. Und es gibt keine Begrenzung für das Volumen dieser Daten, lediglich jede Zeile muss mit SSH-.

Genau das macht das Programm Endlessh: es sendet endloser Strom von zufällig generierten Daten, die RFC 4253 entsprechen, d.h. die Übertragung erfolgt vor der Identifizierung, und jede Zeile beginnt mit SSH- und überschreitet 255 Zeichen nicht, einschließlich des Zeilenendzeichens. Insgesamt alles nach Standard.

Standardmäßig wartet das Programm 10 Sekunden zwischen den Paketübertragungen. Dies verhindert eine Zeitüberschreitung, sodass der Client für immer in der Falle sitzt.

Da die Datenübertragung vor der Anwendung von Kryptografie erfolgt, ist das Programm ausgesprochen einfach. Es müssen keine Verschlüsselungen implementiert oder zahlreiche Protokolle unterstützt werden.

Der Autor hat sich bemüht, das Tool ressourcenschonend zu gestalten und völlig unauffällig auf dem Rechner zu arbeiten. 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 cleverere Softwareimplementierung zu minimieren. Hätte er einfach einen separaten Prozess für jede neue Verbindung gestartet, könnten potenzielle Angreifer DDoS-Angriffe durchführen, indem sie zahlreiche Verbindungen öffnen, um die Ressourcen des Rechners auszuschöpfen. Ein Strom pro Verbindung ist auch nicht die beste Option, da der Kernel Ressourcen für die Verwaltung der Ströme aufwenden würde.

Deshalb wählte Chris Wellons die leichtgewichtigste Option für Endlessh: einen einsträngigen Server poll(2), bei dem gefangene Clients nahezu keine zusätzlichen Ressourcen verbrauchen, abgesehen von dem Socket-Objekt im Kernel und weiteren 78 Byte zur Nachverfolgung in Endlessh. Um keine Empfangs- und Versandpuffer für jeden Client zuzuweisen, öffnet Endlessh einen Direktzugriffs-Socket und überträgt die TCP-Pakete direkt und ignoriert fast den gesamten TCP/IP-Stack des Betriebssystems. Der Eingabepuffer ist überhaupt nicht erforderlich, da uns eingehende Daten nicht interessieren.

Der Autor sagt, dass er zum Zeitpunkt seines Programms nicht wusste von der Existenz von Pythons asycio und anderen Tar pits. Hätte er von asycio gewusst, hätte er sein Tool in nur 18 Zeilen in Python umsetzen 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 zum Schreiben von Tar Pit-Servern. Zum Beispiel kann eine solche Falle Firefox, Chrome oder einen anderen Client, der versucht, sich mit Ihrem HTTP-Server zu verbinden, für viele Stunden aufhalten:

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 Tar Pit ist ein hervorragendes Werkzeug, um Internet-Ganoven zu bestrafen. Allerdings besteht das Risiko, sie auf das ungewöhnliche Verhalten eines bestimmten Servers aufmerksam zu machen. Jemand könnte Rachegedanken hegen und eine gezielte DDoS-Attacke auf Ihre IP planen. Bisher gab es jedoch keine solchen Vorfälle, und Tar Pits funktionieren ausgezeichnet.

Falle (Tarpit) für eingehende SSH-Verbindungen

Quelle: habr.com

Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server 🔥 Zuverlässiges Hosting für Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster