Falle (Tarpit) für eingehende SSH-Verbindungen

Es ist kein Geheimnis, dass das Internet eine sehr feindselige Umgebung ist. Sobald Sie einen Server hochfahren, ist er sofort massiven Angriffen und mehreren Scans ausgesetzt. Zum Beispiel Honeypot von Sicherheitsleuten Sie können das Ausmaß dieses Müllverkehrs abschätzen. Tatsächlich können auf einem durchschnittlichen Server 99 % des Datenverkehrs bösartig sein.

Tarpit ist ein Trap-Port, der dazu dient, eingehende Verbindungen zu verlangsamen. Wenn sich ein Drittsystem mit diesem Port verbindet, können Sie die Verbindung nicht schnell trennen. Sie muss ihre Systemressourcen verschwenden und warten, bis die Verbindung abbricht, oder sie manuell beenden.

Am häufigsten werden Planen zum Schutz verwendet. Die Technik wurde ursprünglich zum Schutz vor Computerwürmern entwickelt. Und jetzt kann es dazu verwendet werden, das Leben von Spammern und Forschern zu ruinieren, die alle IP-Adressen nacheinander umfassend scannen (Beispiele zu Habré: Österreich, Ukraine).

Einer der Systemadministratoren namens Chris Wellons hatte es offenbar satt, dieser Schande zuzuschauen – und schrieb ein kleines Programm Endlos, eine Plane für SSH, die eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (der Standardport zum Testen ist 2222) und gibt vor, ein SSH-Server zu sein, baut aber in Wirklichkeit eine endlose Verbindung mit dem eingehenden Client auf, bis dieser aufgibt. Dies kann mehrere Tage oder länger andauern, bis der Klient abstürzt.

Installation des Dienstprogramms:

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

Eine ordnungsgemäß implementierte Plane nimmt dem Angreifer mehr Ressourcen ab als Ihnen. Aber es ist nicht einmal eine Frage der Ressourcen. Autor schreibtdass das Programm süchtig macht. Derzeit sind 27 Clients in der Falle, von denen einige wochenlang verbunden sind. Auf dem Höhepunkt der Aktivität waren 1378 Kunden 20 Stunden lang gefangen!

Im Betriebsmodus muss der Endlessh-Server auf dem üblichen Port 22 installiert werden, wo Hooligans massenhaft klopfen. Standard-Sicherheitsempfehlungen raten immer dazu, SSH auf einen anderen Port zu verschieben, wodurch sich die Größe der Protokolle sofort um eine Größenordnung verringert.

Chris Wellons sagt, dass sein Programm einen Absatz der Spezifikation ausnutzt RFC 4253 zum SSH-Protokoll. Unmittelbar nach dem Aufbau einer TCP-Verbindung, aber bevor die Kryptografie angewendet wird, müssen beide Parteien eine Identifikationszeichenfolge senden. Und es gibt auch einen Hinweis: „Der Server sendet möglicherweise andere Datenzeilen, bevor er die Versionszeile sendet.“. und keine Begrenzung Je nach Umfang dieser Daten müssen Sie lediglich jede Zeile mit beginnen SSH-.

Genau das macht das Endlessh-Programm: es sendet endlos Strom zufällig generierter Daten, die RFC 4253 entsprechen, d. h. vor der Authentifizierung senden, und jede Zeile beginnt mit SSH- und darf 255 Zeichen einschließlich des Zeilenendezeichens nicht überschreiten. Im Allgemeinen entspricht alles dem Standard.

Standardmäßig wartet das Programm 10 Sekunden zwischen dem Senden von Paketen. Dadurch wird verhindert, dass es beim Client zu einer Zeitüberschreitung kommt, sodass der Client für immer in der Falle bleibt.

Da die Daten vor der Anwendung der Kryptographie gesendet werden, ist das Programm äußerst einfach. Es muss keine Verschlüsselung implementiert werden und unterstützt mehrere Protokolle.

Der Autor hat versucht sicherzustellen, dass das Dienstprogramm ein Minimum an Ressourcen verbraucht und auf dem Computer völlig unbemerkt arbeitet. Im Gegensatz zu modernen Antivirenprogrammen und anderen „Sicherheitssystemen“ sollte es Ihren Computer nicht verlangsamen. Dank einer etwas ausgefeilteren Softwareimplementierung gelang es ihm, sowohl den Datenverkehr als auch den Speicherverbrauch zu minimieren. Wenn einfach ein separater Prozess für eine neue Verbindung gestartet würde, könnten potenzielle Angreifer einen DDoS-Angriff starten, indem sie mehrere Verbindungen öffnen und so die Ressourcen auf dem Computer erschöpfen. Ein Thread pro Verbindung ist auch nicht die beste Option, da der Kernel Ressourcen für die Threadverwaltung verschwendet.

Aus diesem Grund hat sich Chris Wellons für die einfachste Option für Endlessh entschieden: einen Single-Threaded-Server poll(2), wobei die Clients in der Falle praktisch keine zusätzlichen Ressourcen verbrauchen, abgesehen vom Socket-Objekt im Kernel und weiteren 78 Bytes für die Nachverfolgung in Endlessh. Um zu vermeiden, dass jedem Client Empfangs- und Sendepuffer zugewiesen werden müssen, öffnet Endlessh einen Direktzugriffs-Socket und übersetzt TCP-Pakete direkt und umgeht dabei fast den gesamten TCP/IP-Stack des Betriebssystems. Der Eingangspuffer wird überhaupt nicht benötigt, da uns die eingehenden Daten nicht interessieren.

Das sagt der Autor zum Zeitpunkt seiner Sendung Wußte nicht über die Existenz von Pythons Asycio und anderen Tarpits. Wenn er über asycio Bescheid wüsste, könnte er sein Dienstprogramm in nur 18 Zeilen in Python implementieren:

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 ist ideal zum Schreiben von Tarpits. Dieser Hook friert beispielsweise Firefox, Chrome oder jeden anderen Client ein, der viele Stunden lang versucht, eine Verbindung zu Ihrem HTTP-Server herzustellen:

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 ist ein großartiges Tool zur Bestrafung von Online-Mobbern. Allerdings besteht im Gegenteil ein gewisses Risiko, dass sie auf das ungewöhnliche Verhalten eines bestimmten Servers aufmerksam gemacht werden. Jemand könnte über Rache nachdenken und ein gezielter DDoS-Angriff auf Ihre IP. Bisher gab es jedoch keine derartigen Fälle und Planen funktionieren hervorragend.

Hubs:
Python, Informationssicherheit, Software, Systemadministration

Stichworte:
SSH, Endlessh, Tarpit, Tarpit, Trap, Asycio
Falle (Tarpit) für eingehende SSH-Verbindungen

Es ist kein Geheimnis, dass das Internet eine sehr feindselige Umgebung ist. Sobald Sie einen Server hochfahren, ist er sofort massiven Angriffen und mehreren Scans ausgesetzt. Zum Beispiel Honeypot von Sicherheitsleuten Sie können das Ausmaß dieses Müllverkehrs abschätzen. Tatsächlich können auf einem durchschnittlichen Server 99 % des Datenverkehrs bösartig sein.

Tarpit ist ein Trap-Port, der dazu dient, eingehende Verbindungen zu verlangsamen. Wenn sich ein Drittsystem mit diesem Port verbindet, können Sie die Verbindung nicht schnell trennen. Sie muss ihre Systemressourcen verschwenden und warten, bis die Verbindung abbricht, oder sie manuell beenden.

Am häufigsten werden Planen zum Schutz verwendet. Die Technik wurde ursprünglich zum Schutz vor Computerwürmern entwickelt. Und jetzt kann es dazu verwendet werden, das Leben von Spammern und Forschern zu ruinieren, die alle IP-Adressen nacheinander umfassend scannen (Beispiele zu Habré: Österreich, Ukraine).

Einer der Systemadministratoren namens Chris Wellons hatte es offenbar satt, dieser Schande zuzuschauen – und schrieb ein kleines Programm Endlos, eine Plane für SSH, die eingehende Verbindungen verlangsamt. Das Programm öffnet einen Port (der Standardport zum Testen ist 2222) und gibt vor, ein SSH-Server zu sein, baut aber in Wirklichkeit eine endlose Verbindung mit dem eingehenden Client auf, bis dieser aufgibt. Dies kann mehrere Tage oder länger andauern, bis der Klient abstürzt.

Installation des Dienstprogramms:

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

Eine ordnungsgemäß implementierte Plane nimmt dem Angreifer mehr Ressourcen ab als Ihnen. Aber es ist nicht einmal eine Frage der Ressourcen. Autor schreibtdass das Programm süchtig macht. Derzeit sind 27 Clients in der Falle, von denen einige wochenlang verbunden sind. Auf dem Höhepunkt der Aktivität waren 1378 Kunden 20 Stunden lang gefangen!

Im Betriebsmodus muss der Endlessh-Server auf dem üblichen Port 22 installiert werden, wo Hooligans massenhaft klopfen. Standard-Sicherheitsempfehlungen raten immer dazu, SSH auf einen anderen Port zu verschieben, wodurch sich die Größe der Protokolle sofort um eine Größenordnung verringert.

Chris Wellons sagt, dass sein Programm einen Absatz der Spezifikation ausnutzt RFC 4253 zum SSH-Protokoll. Unmittelbar nach dem Aufbau einer TCP-Verbindung, aber bevor die Kryptografie angewendet wird, müssen beide Parteien eine Identifikationszeichenfolge senden. Und es gibt auch einen Hinweis: „Der Server sendet möglicherweise andere Datenzeilen, bevor er die Versionszeile sendet.“. und keine Begrenzung Je nach Umfang dieser Daten müssen Sie lediglich jede Zeile mit beginnen SSH-.

Genau das macht das Endlessh-Programm: es sendet endlos Strom zufällig generierter Daten, die RFC 4253 entsprechen, d. h. vor der Authentifizierung senden, und jede Zeile beginnt mit SSH- und darf 255 Zeichen einschließlich des Zeilenendezeichens nicht überschreiten. Im Allgemeinen entspricht alles dem Standard.

Standardmäßig wartet das Programm 10 Sekunden zwischen dem Senden von Paketen. Dadurch wird verhindert, dass es beim Client zu einer Zeitüberschreitung kommt, sodass der Client für immer in der Falle bleibt.

Da die Daten vor der Anwendung der Kryptographie gesendet werden, ist das Programm äußerst einfach. Es muss keine Verschlüsselung implementiert werden und unterstützt mehrere Protokolle.

Der Autor hat versucht sicherzustellen, dass das Dienstprogramm ein Minimum an Ressourcen verbraucht und auf dem Computer völlig unbemerkt arbeitet. Im Gegensatz zu modernen Antivirenprogrammen und anderen „Sicherheitssystemen“ sollte es Ihren Computer nicht verlangsamen. Dank einer etwas ausgefeilteren Softwareimplementierung gelang es ihm, sowohl den Datenverkehr als auch den Speicherverbrauch zu minimieren. Wenn einfach ein separater Prozess für eine neue Verbindung gestartet würde, könnten potenzielle Angreifer einen DDoS-Angriff starten, indem sie mehrere Verbindungen öffnen und so die Ressourcen auf dem Computer erschöpfen. Ein Thread pro Verbindung ist auch nicht die beste Option, da der Kernel Ressourcen für die Threadverwaltung verschwendet.

Aus diesem Grund hat sich Chris Wellons für die einfachste Option für Endlessh entschieden: einen Single-Threaded-Server poll(2), wobei die Clients in der Falle praktisch keine zusätzlichen Ressourcen verbrauchen, abgesehen vom Socket-Objekt im Kernel und weiteren 78 Bytes für die Nachverfolgung in Endlessh. Um zu vermeiden, dass jedem Client Empfangs- und Sendepuffer zugewiesen werden müssen, öffnet Endlessh einen Direktzugriffs-Socket und übersetzt TCP-Pakete direkt und umgeht dabei fast den gesamten TCP/IP-Stack des Betriebssystems. Der Eingangspuffer wird überhaupt nicht benötigt, da uns die eingehenden Daten nicht interessieren.

Das sagt der Autor zum Zeitpunkt seiner Sendung Wußte nicht über die Existenz von Pythons Asycio und anderen Tarpits. Wenn er über asycio Bescheid wüsste, könnte er sein Dienstprogramm in nur 18 Zeilen in Python implementieren:

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 ist ideal zum Schreiben von Tarpits. Dieser Hook friert beispielsweise Firefox, Chrome oder jeden anderen Client ein, der viele Stunden lang versucht, eine Verbindung zu Ihrem HTTP-Server herzustellen:

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 ist ein großartiges Tool zur Bestrafung von Online-Mobbern. Allerdings besteht im Gegenteil ein gewisses Risiko, dass sie auf das ungewöhnliche Verhalten eines bestimmten Servers aufmerksam gemacht werden. Jemand könnte über Rache nachdenken und ein gezielter DDoS-Angriff auf Ihre IP. Bisher gab es jedoch keine derartigen Fälle und Planen funktionieren hervorragend.

Falle (Tarpit) für eingehende SSH-Verbindungen

Source: habr.com

Kommentar hinzufügen