Trap (tarpit) per le connessioni SSH in entrata

Non è un segreto che Internet sia un ambiente molto ostile. Non appena si solleva un server, questo viene immediatamente sottoposto ad attacchi massicci e scansioni multiple. Per esempio honeypot dalle guardie di sicurezza puoi stimare la portata di questo traffico di rifiuti. Infatti, su un server medio, il 99% del traffico potrebbe essere dannoso.

Tarpit è una porta trap utilizzata per rallentare le connessioni in entrata. Se un sistema di terze parti si connette a questa porta, non sarai in grado di chiudere rapidamente la connessione. Dovrà sprecare le risorse del sistema e attendere fino al timeout della connessione o terminarla manualmente.

Molto spesso, i teloni vengono utilizzati per la protezione. La tecnica è stata inizialmente sviluppata per proteggere dai worm informatici. E ora può essere utilizzato per rovinare la vita agli spammer e ai ricercatori impegnati nella scansione ad ampio raggio di tutti gli indirizzi IP di seguito (esempi su Habré: Austria, Ucraina).

Apparentemente uno degli amministratori di sistema di nome Chris Wellons si è stancato di guardare questa disgrazia e ha scritto un piccolo programma Infinito, un tarpit per SSH che rallenta le connessioni in entrata. Il programma apre una porta (la porta predefinita per il test è 2222) e finge di essere un server SSH, ma in realtà stabilisce una connessione infinita con il client in entrata finché non si arrende. Ciò può continuare per diversi giorni o più finché il cliente non cade.

Installazione dell'utilità:

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

Un tarpit correttamente implementato richiederà più risorse all'attaccante che a te. Ma non è nemmeno una questione di risorse. Autore scriveche il programma crea dipendenza. Al momento ci sono 27 clienti intrappolati, alcuni dei quali connessi da settimane. Al culmine dell'attività, 1378 clienti sono rimasti intrappolati per 20 ore!

In modalità operativa, il server Endlessh deve essere installato sulla solita porta 22, dove gli hooligan bussano in massa. Le raccomandazioni di sicurezza standard consigliano sempre di spostare SSH su una porta diversa, il che riduce immediatamente la dimensione dei log di un ordine di grandezza.

Chris Wellons afferma che il suo programma sfrutta un paragrafo delle specifiche RFC 4253 al protocollo SSH. Immediatamente dopo aver stabilito una connessione TCP, ma prima che venga applicata la crittografia, entrambe le parti devono inviare una stringa di identificazione. E c'è anche una nota: "Il server PUÒ inviare altre righe di dati prima di inviare la riga della versione". e Senza limiti sul volume di questi dati, devi solo iniziare ogni riga con SSH-.

Questo è esattamente ciò che fa il programma Endlessh: it invia infinito flusso di dati generati casualmente, che sono conformi alla RFC 4253, ovvero inviati prima dell'autenticazione e ogni riga inizia con SSH- e non supera i 255 caratteri, compreso il carattere di fine riga. In generale, tutto è secondo lo standard.

Per impostazione predefinita, il programma attende 10 secondi tra l'invio dei pacchetti. Ciò impedisce il timeout del client, quindi il client rimarrà intrappolato per sempre.

Poiché i dati vengono inviati prima dell'applicazione della crittografia, il programma è estremamente semplice. Non è necessario implementare alcuna cifratura e supporta più protocolli.

L'autore ha cercato di garantire che l'utilità consumi un minimo di risorse e funzioni completamente inosservata sulla macchina. A differenza dei moderni antivirus e di altri “sistemi di sicurezza”, non dovrebbe rallentare il tuo computer. È riuscito a ridurre al minimo sia il traffico che il consumo di memoria grazie a un'implementazione software leggermente più astuta. Se lanciasse semplicemente un processo separato su una nuova connessione, i potenziali aggressori potrebbero lanciare un attacco DDoS aprendo più connessioni per esaurire le risorse sulla macchina. Anche un thread per connessione non è l'opzione migliore, perché il kernel sprecherà risorse nella gestione dei thread.

Ecco perché Chris Wellons ha scelto l'opzione più leggera per Endlessh: un server a thread singolo poll(2), dove i client nella trap non consumano praticamente alcuna risorsa aggiuntiva, senza contare l'oggetto socket nel kernel e altri 78 byte per il tracciamento in Endlessh. Per evitare di dover allocare buffer di ricezione e invio per ciascun client, Endlessh apre un socket di accesso diretto e traduce direttamente i pacchetti TCP, bypassando quasi l'intero stack TCP/IP del sistema operativo. Il buffer in entrata non è affatto necessario perché non siamo interessati ai dati in entrata.

L'autore lo dice al momento del suo programma non lo sapevo sull'esistenza dell'asicio di Python e di altri tarpit. Se conoscesse asycio, potrebbe implementare la sua utilità in sole 18 righe in Python:

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 è ideale per scrivere tarpit. Ad esempio, questo hook bloccherà Firefox, Chrome o qualsiasi altro client che sta tentando di connettersi al tuo server HTTP per molte ore:

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 è un ottimo strumento per punire i bulli online. È vero, al contrario, c'è il rischio di attirare la loro attenzione sul comportamento insolito di un determinato server. Qualcuno potrebbe pensare alla vendetta e un attacco DDoS mirato al tuo IP. Tuttavia, finora non si sono verificati casi del genere e i tarpit funzionano alla grande.

Hub:
Python, Sicurezza delle informazioni, Software, Amministrazione di sistema

tag:
SSH, Endlessh, tarpit, tarpit, trappola, asycio
Trap (tarpit) per le connessioni SSH in entrata

Non è un segreto che Internet sia un ambiente molto ostile. Non appena si solleva un server, questo viene immediatamente sottoposto ad attacchi massicci e scansioni multiple. Per esempio honeypot dalle guardie di sicurezza puoi stimare la portata di questo traffico di rifiuti. Infatti, su un server medio, il 99% del traffico potrebbe essere dannoso.

Tarpit è una porta trap utilizzata per rallentare le connessioni in entrata. Se un sistema di terze parti si connette a questa porta, non sarai in grado di chiudere rapidamente la connessione. Dovrà sprecare le risorse del sistema e attendere fino al timeout della connessione o terminarla manualmente.

Molto spesso, i teloni vengono utilizzati per la protezione. La tecnica è stata inizialmente sviluppata per proteggere dai worm informatici. E ora può essere utilizzato per rovinare la vita agli spammer e ai ricercatori impegnati nella scansione ad ampio raggio di tutti gli indirizzi IP di seguito (esempi su Habré: Austria, Ucraina).

Apparentemente uno degli amministratori di sistema di nome Chris Wellons si è stancato di guardare questa disgrazia e ha scritto un piccolo programma Infinito, un tarpit per SSH che rallenta le connessioni in entrata. Il programma apre una porta (la porta predefinita per il test è 2222) e finge di essere un server SSH, ma in realtà stabilisce una connessione infinita con il client in entrata finché non si arrende. Ciò può continuare per diversi giorni o più finché il cliente non cade.

Installazione dell'utilità:

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

Un tarpit correttamente implementato richiederà più risorse all'attaccante che a te. Ma non è nemmeno una questione di risorse. Autore scriveche il programma crea dipendenza. Al momento ci sono 27 clienti intrappolati, alcuni dei quali connessi da settimane. Al culmine dell'attività, 1378 clienti sono rimasti intrappolati per 20 ore!

In modalità operativa, il server Endlessh deve essere installato sulla solita porta 22, dove gli hooligan bussano in massa. Le raccomandazioni di sicurezza standard consigliano sempre di spostare SSH su una porta diversa, il che riduce immediatamente la dimensione dei log di un ordine di grandezza.

Chris Wellons afferma che il suo programma sfrutta un paragrafo delle specifiche RFC 4253 al protocollo SSH. Immediatamente dopo aver stabilito una connessione TCP, ma prima che venga applicata la crittografia, entrambe le parti devono inviare una stringa di identificazione. E c'è anche una nota: "Il server PUÒ inviare altre righe di dati prima di inviare la riga della versione". e Senza limiti sul volume di questi dati, devi solo iniziare ogni riga con SSH-.

Questo è esattamente ciò che fa il programma Endlessh: it invia infinito flusso di dati generati casualmente, che sono conformi alla RFC 4253, ovvero inviati prima dell'autenticazione e ogni riga inizia con SSH- e non supera i 255 caratteri, compreso il carattere di fine riga. In generale, tutto è secondo lo standard.

Per impostazione predefinita, il programma attende 10 secondi tra l'invio dei pacchetti. Ciò impedisce il timeout del client, quindi il client rimarrà intrappolato per sempre.

Poiché i dati vengono inviati prima dell'applicazione della crittografia, il programma è estremamente semplice. Non è necessario implementare alcuna cifratura e supporta più protocolli.

L'autore ha cercato di garantire che l'utilità consumi un minimo di risorse e funzioni completamente inosservata sulla macchina. A differenza dei moderni antivirus e di altri “sistemi di sicurezza”, non dovrebbe rallentare il tuo computer. È riuscito a ridurre al minimo sia il traffico che il consumo di memoria grazie a un'implementazione software leggermente più astuta. Se lanciasse semplicemente un processo separato su una nuova connessione, i potenziali aggressori potrebbero lanciare un attacco DDoS aprendo più connessioni per esaurire le risorse sulla macchina. Anche un thread per connessione non è l'opzione migliore, perché il kernel sprecherà risorse nella gestione dei thread.

Ecco perché Chris Wellons ha scelto l'opzione più leggera per Endlessh: un server a thread singolo poll(2), dove i client nella trap non consumano praticamente alcuna risorsa aggiuntiva, senza contare l'oggetto socket nel kernel e altri 78 byte per il tracciamento in Endlessh. Per evitare di dover allocare buffer di ricezione e invio per ciascun client, Endlessh apre un socket di accesso diretto e traduce direttamente i pacchetti TCP, bypassando quasi l'intero stack TCP/IP del sistema operativo. Il buffer in entrata non è affatto necessario perché non siamo interessati ai dati in entrata.

L'autore lo dice al momento del suo programma non lo sapevo sull'esistenza dell'asicio di Python e di altri tarpit. Se conoscesse asycio, potrebbe implementare la sua utilità in sole 18 righe in Python:

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 è ideale per scrivere tarpit. Ad esempio, questo hook bloccherà Firefox, Chrome o qualsiasi altro client che sta tentando di connettersi al tuo server HTTP per molte ore:

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 è un ottimo strumento per punire i bulli online. È vero, al contrario, c'è il rischio di attirare la loro attenzione sul comportamento insolito di un determinato server. Qualcuno potrebbe pensare alla vendetta e un attacco DDoS mirato al tuo IP. Tuttavia, finora non si sono verificati casi del genere e i tarpit funzionano alla grande.

Trap (tarpit) per le connessioni SSH in entrata

Fonte: habr.com

Aggiungi un commento