Trap (tarpit) voor inkomende SSH-verbindingen

Het is geen geheim dat internet een zeer vijandige omgeving is. Zodra je een server aanzet, wordt deze onmiddellijk onderworpen aan massale aanvallen en meerdere scans. Bijvoorbeeld honingpot van bewakers je kunt de omvang van dit afvalverkeer schatten. Op de gemiddelde server kan 99% van het verkeer kwaadaardig zijn.

Tarpit is een trappoort die wordt gebruikt om inkomende verbindingen te vertragen. Als een systeem van een derde partij verbinding maakt met deze poort, kunt u de verbinding niet snel verbreken. Ze zal haar systeembronnen moeten verspillen en moeten wachten tot de verbindingstime-outs zijn bereikt, of de verbinding handmatig moeten beëindigen.

Meestal worden tarpits gebruikt voor bescherming. De techniek werd in eerste instantie ontwikkeld ter bescherming tegen computerwormen. En nu kan het worden gebruikt om de levens te ruïneren van spammers en onderzoekers die bezig zijn met het breed scannen van alle IP-adressen op een rij (voorbeelden op Habré: Oostenrijk, Oekraïne).

Een van de systeembeheerders, Chris Wellons genaamd, werd blijkbaar het beu om naar deze schande te kijken - en hij schreef een klein programma Eindeloos, een tarpit voor SSH die inkomende verbindingen vertraagt. Het programma opent een poort (de standaardpoort voor testen is 2222) en doet zich voor als een SSH-server, maar in werkelijkheid brengt het een eindeloze verbinding tot stand met de binnenkomende client totdat deze het opgeeft. Dit kan enkele dagen of langer aanhouden totdat de cliënt eraf valt.

Installatie van het hulpprogramma:

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

Een goed geïmplementeerde tarpit zal meer middelen van de aanvaller vergen dan van jou. Maar het is niet eens een kwestie van middelen. Auteur schrijftdat het programma verslavend is. Op dit moment zitten er 27 cliënten vast, waarvan sommigen al wekenlang verbonden zijn. Op het hoogtepunt van de activiteit zaten 1378 cliënten twintig uur lang vast!

In de bedrijfsmodus moet de Endlessh-server op de gebruikelijke poort 22 worden geïnstalleerd, waar hooligans massaal aankloppen. Standaard beveiligingsaanbevelingen adviseren altijd om SSH naar een andere poort te verplaatsen, waardoor de omvang van de logs onmiddellijk met een orde van grootte wordt verkleind.

Chris Wellons zegt dat zijn programma één paragraaf van de specificatie exploiteert RFC 4253 volgens het SSH-protocol. Onmiddellijk nadat een TCP-verbinding tot stand is gebracht, maar voordat cryptografie wordt toegepast, moeten beide partijen een identificatiereeks verzenden. En er is ook een opmerking: "De server KAN andere rijen met gegevens verzenden voordat de versierij wordt verzonden". en geen limiet afhankelijk van het volume van deze gegevens hoeft u alleen maar elke regel te beginnen SSH-.

Dit is precies wat het Endlessh-programma doet: it stuurt eindeloos stroom van willekeurig gegenereerde gegevens, die voldoen aan RFC 4253, dat wil zeggen verzenden vóór authenticatie, en elke regel begint met SSH- en mag niet langer zijn dan 255 tekens, inclusief het regeleindteken. Over het algemeen is alles volgens de standaard.

Standaard wacht het programma 10 seconden tussen het verzenden van pakketten. Dit voorkomt dat de client een time-out krijgt, waardoor de client voor altijd vastzit.

Omdat de gegevens worden verzonden voordat cryptografie wordt toegepast, is het programma uiterst eenvoudig. Het hoeft geen cijfers te implementeren en ondersteunt meerdere protocollen.

De auteur probeerde ervoor te zorgen dat het hulpprogramma een minimum aan bronnen verbruikt en volledig onopgemerkt op de machine werkt. In tegenstelling tot moderne antivirusprogramma's en andere 'beveiligingssystemen' zou het uw computer niet moeten vertragen. Hij slaagde erin zowel het verkeer als het geheugenverbruik te minimaliseren dankzij een iets sluwere software-implementatie. Als het eenvoudigweg een afzonderlijk proces op een nieuwe verbinding zou starten, zouden potentiële aanvallers een DDoS-aanval kunnen lanceren door meerdere verbindingen te openen om de bronnen op de machine uit te putten. Eén thread per verbinding is ook niet de beste optie, omdat de kernel middelen zal verspillen aan het beheren van threads.

Daarom koos Chris Wellons voor de lichtste optie voor Endlessh: een single-threaded server poll(2), waarbij de clients in de trap vrijwel geen extra bronnen verbruiken, het socketobject in de kernel en nog eens 78 bytes voor tracking in Endlessh niet meegerekend. Om te voorkomen dat u voor elke client ontvangst- en verzendbuffers moet toewijzen, opent Endlessh een directe toegangssocket en vertaalt TCP-pakketten rechtstreeks, waarbij bijna de gehele TCP/IP-stack van het besturingssysteem wordt omzeild. De inkomende buffer is helemaal niet nodig, omdat we niet geïnteresseerd zijn in de binnenkomende gegevens.

Dat zegt de auteur ten tijde van zijn programma wist niet over het bestaan ​​van Python's asycio en andere tarpits. Als hij iets van asycio afwist, zou hij zijn hulpprogramma in slechts 18 regels in Python kunnen implementeren:

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 is ideaal voor het schrijven van tarpits. Deze hook zorgt er bijvoorbeeld voor dat Firefox, Chrome of elke andere client die verbinding probeert te maken met uw HTTP-server urenlang vastloopt:

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 is een geweldig hulpmiddel voor het straffen van online pestkoppen. Het is waar dat er integendeel enig risico bestaat dat hun aandacht wordt gevestigd op het ongebruikelijke gedrag van een bepaalde server. Iemand misschien aan wraak denken en een gerichte DDoS-aanval op uw IP. Tot nu toe zijn er echter geen dergelijke gevallen geweest en tarpits werken prima.

Naven:
Python, Informatiebeveiliging, Software, Systeembeheer

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Trap (tarpit) voor inkomende SSH-verbindingen

Het is geen geheim dat internet een zeer vijandige omgeving is. Zodra je een server aanzet, wordt deze onmiddellijk onderworpen aan massale aanvallen en meerdere scans. Bijvoorbeeld honingpot van bewakers je kunt de omvang van dit afvalverkeer schatten. Op de gemiddelde server kan 99% van het verkeer kwaadaardig zijn.

Tarpit is een trappoort die wordt gebruikt om inkomende verbindingen te vertragen. Als een systeem van een derde partij verbinding maakt met deze poort, kunt u de verbinding niet snel verbreken. Ze zal haar systeembronnen moeten verspillen en moeten wachten tot de verbindingstime-outs zijn bereikt, of de verbinding handmatig moeten beëindigen.

Meestal worden tarpits gebruikt voor bescherming. De techniek werd in eerste instantie ontwikkeld ter bescherming tegen computerwormen. En nu kan het worden gebruikt om de levens te ruïneren van spammers en onderzoekers die bezig zijn met het breed scannen van alle IP-adressen op een rij (voorbeelden op Habré: Oostenrijk, Oekraïne).

Een van de systeembeheerders, Chris Wellons genaamd, werd blijkbaar het beu om naar deze schande te kijken - en hij schreef een klein programma Eindeloos, een tarpit voor SSH die inkomende verbindingen vertraagt. Het programma opent een poort (de standaardpoort voor testen is 2222) en doet zich voor als een SSH-server, maar in werkelijkheid brengt het een eindeloze verbinding tot stand met de binnenkomende client totdat deze het opgeeft. Dit kan enkele dagen of langer aanhouden totdat de cliënt eraf valt.

Installatie van het hulpprogramma:

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

Een goed geïmplementeerde tarpit zal meer middelen van de aanvaller vergen dan van jou. Maar het is niet eens een kwestie van middelen. Auteur schrijftdat het programma verslavend is. Op dit moment zitten er 27 cliënten vast, waarvan sommigen al wekenlang verbonden zijn. Op het hoogtepunt van de activiteit zaten 1378 cliënten twintig uur lang vast!

In de bedrijfsmodus moet de Endlessh-server op de gebruikelijke poort 22 worden geïnstalleerd, waar hooligans massaal aankloppen. Standaard beveiligingsaanbevelingen adviseren altijd om SSH naar een andere poort te verplaatsen, waardoor de omvang van de logs onmiddellijk met een orde van grootte wordt verkleind.

Chris Wellons zegt dat zijn programma één paragraaf van de specificatie exploiteert RFC 4253 volgens het SSH-protocol. Onmiddellijk nadat een TCP-verbinding tot stand is gebracht, maar voordat cryptografie wordt toegepast, moeten beide partijen een identificatiereeks verzenden. En er is ook een opmerking: "De server KAN andere rijen met gegevens verzenden voordat de versierij wordt verzonden". en geen limiet afhankelijk van het volume van deze gegevens hoeft u alleen maar elke regel te beginnen SSH-.

Dit is precies wat het Endlessh-programma doet: it stuurt eindeloos stroom van willekeurig gegenereerde gegevens, die voldoen aan RFC 4253, dat wil zeggen verzenden vóór authenticatie, en elke regel begint met SSH- en mag niet langer zijn dan 255 tekens, inclusief het regeleindteken. Over het algemeen is alles volgens de standaard.

Standaard wacht het programma 10 seconden tussen het verzenden van pakketten. Dit voorkomt dat de client een time-out krijgt, waardoor de client voor altijd vastzit.

Omdat de gegevens worden verzonden voordat cryptografie wordt toegepast, is het programma uiterst eenvoudig. Het hoeft geen cijfers te implementeren en ondersteunt meerdere protocollen.

De auteur probeerde ervoor te zorgen dat het hulpprogramma een minimum aan bronnen verbruikt en volledig onopgemerkt op de machine werkt. In tegenstelling tot moderne antivirusprogramma's en andere 'beveiligingssystemen' zou het uw computer niet moeten vertragen. Hij slaagde erin zowel het verkeer als het geheugenverbruik te minimaliseren dankzij een iets sluwere software-implementatie. Als het eenvoudigweg een afzonderlijk proces op een nieuwe verbinding zou starten, zouden potentiële aanvallers een DDoS-aanval kunnen lanceren door meerdere verbindingen te openen om de bronnen op de machine uit te putten. Eén thread per verbinding is ook niet de beste optie, omdat de kernel middelen zal verspillen aan het beheren van threads.

Daarom koos Chris Wellons voor de lichtste optie voor Endlessh: een single-threaded server poll(2), waarbij de clients in de trap vrijwel geen extra bronnen verbruiken, het socketobject in de kernel en nog eens 78 bytes voor tracking in Endlessh niet meegerekend. Om te voorkomen dat u voor elke client ontvangst- en verzendbuffers moet toewijzen, opent Endlessh een directe toegangssocket en vertaalt TCP-pakketten rechtstreeks, waarbij bijna de gehele TCP/IP-stack van het besturingssysteem wordt omzeild. De inkomende buffer is helemaal niet nodig, omdat we niet geïnteresseerd zijn in de binnenkomende gegevens.

Dat zegt de auteur ten tijde van zijn programma wist niet over het bestaan ​​van Python's asycio en andere tarpits. Als hij iets van asycio afwist, zou hij zijn hulpprogramma in slechts 18 regels in Python kunnen implementeren:

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 is ideaal voor het schrijven van tarpits. Deze hook zorgt er bijvoorbeeld voor dat Firefox, Chrome of elke andere client die verbinding probeert te maken met uw HTTP-server urenlang vastloopt:

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 is een geweldig hulpmiddel voor het straffen van online pestkoppen. Het is waar dat er integendeel enig risico bestaat dat hun aandacht wordt gevestigd op het ongebruikelijke gedrag van een bepaalde server. Iemand misschien aan wraak denken en een gerichte DDoS-aanval op uw IP. Tot nu toe zijn er echter geen dergelijke gevallen geweest en tarpits werken prima.

Trap (tarpit) voor inkomende SSH-verbindingen

Bron: www.habr.com

Voeg een reactie