Capcană (tarpit) pentru conexiunile SSH de intrare

Nu este un secret pentru nimeni că Internetul este un mediu foarte ostil. De îndată ce ridicați un server, acesta este supus instantaneu la atacuri masive și scanări multiple. De exemplu honeypot de la securiști puteți estima amploarea acestui trafic de gunoi. De fapt, pe un server mediu, 99% din trafic poate fi rău intenționat.

Tarpit este un port capcană folosit pentru a încetini conexiunile de intrare. Dacă un sistem terță parte se conectează la acest port, nu veți putea închide rapid conexiunea. Ea va trebui să-și irosească resursele de sistem și să aștepte până la expirarea timpului de conexiune sau să o încheie manual.

Cel mai adesea, prelatele sunt folosite pentru protecție. Tehnica a fost dezvoltată mai întâi pentru a proteja împotriva viermilor de computer. Și acum poate fi folosit pentru a ruina viețile spammerilor și cercetătorilor care sunt angajați în scanarea amplă a tuturor adreselor IP la rând (exemple pe Habré: Austria, Ucraina).

Unul dintre administratorii de sistem numit Chris Wellons se pare că s-a săturat să urmărească această rușine - și a scris un mic program Fără sfârşit, un tarpit pentru SSH care încetinește conexiunile de intrare. Programul deschide un port (portul implicit pentru testare este 2222) și se preface a fi un server SSH, dar în realitate stabilește o conexiune nesfârșită cu clientul de intrare până când acesta renunță. Acest lucru poate continua câteva zile sau mai multe până când clientul cade.

Instalarea utilitarului:

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

O tarpit implementată corect va lua mai multe resurse de la atacator decât de la tine. Dar nici măcar nu este o chestiune de resurse. Autor el scriecă programul creează dependență. În acest moment, are 27 de clienți blocați, unii dintre ei conectați de săptămâni. În vârf de activitate, 1378 de clienți au fost prinși timp de 20 de ore!

În modul de funcționare, serverul Endlessh trebuie instalat pe portul obișnuit 22, unde huliganii bat în masă. Recomandările standard de securitate recomandă întotdeauna mutarea SSH pe un alt port, ceea ce reduce imediat dimensiunea jurnalelor cu un ordin de mărime.

Chris Wellons spune că programul său exploatează un paragraf din specificație RFC 4253 la protocolul SSH. Imediat după stabilirea unei conexiuni TCP, dar înainte de aplicarea criptografiei, ambele părți trebuie să trimită un șir de identificare. Și există și o notă: „Serverul POATE trimite alte rânduri de date înainte de a trimite rândul de versiune”. și fara limita pe volumul acestor date, trebuie doar să începeți fiecare linie cu SSH-.

Este exact ceea ce face programul Endlessh: it trimite fără sfârșit flux de date generate aleatoriu, care respectă RFC 4253, adică trimit înainte de autentificare și fiecare linie începe cu SSH- și nu depășește 255 de caractere, inclusiv caracterul de sfârșit de linie. În general, totul este conform standardului.

În mod implicit, programul așteaptă 10 secunde între trimiterea pachetelor. Acest lucru împiedică clientul să fie expirat, astfel încât clientul va fi prins pentru totdeauna.

Deoarece datele sunt trimise înainte de aplicarea criptografiei, programul este extrem de simplu. Nu are nevoie să implementeze nicio cifră și acceptă mai multe protocoale.

Autorul a încercat să se asigure că utilitarul consumă un minim de resurse și funcționează complet neobservat pe mașină. Spre deosebire de antivirusurile moderne și alte „sisteme de securitate”, acesta nu ar trebui să vă încetinească computerul. A reușit să minimizeze atât traficul, cât și consumul de memorie datorită unei implementări software ceva mai viclene. Dacă pur și simplu a lansat un proces separat pe o nouă conexiune, atunci potențialii atacatori ar putea lansa un atac DDoS prin deschiderea mai multor conexiuni pentru a epuiza resursele de pe mașină. De asemenea, un fir pe conexiune nu este cea mai bună opțiune, deoarece nucleul va irosi resurse gestionând firele.

De aceea, Chris Wellons a ales cea mai ușoară opțiune pentru Endlessh: un server cu un singur thread poll(2), unde clienții din capcană nu consumă practic resurse suplimentare, fără a număra obiectul socket din kernel și alți 78 de octeți pentru urmărire în Endlessh. Pentru a evita alocarea bufferelor de primire și trimitere pentru fiecare client, Endlessh deschide un socket de acces direct și traduce pachetele TCP direct, ocolind aproape întregul sistem de operare TCP/IP. Bufferul de intrare nu este deloc necesar, deoarece nu ne interesează datele primite.

Autorul spune că la momentul programului său Nu știam despre existența asycio-ului lui Python și a altor prelate. Dacă ar ști despre asycio, și-ar putea implementa utilitatea în doar 18 rânduri în 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 este ideal pentru scris prelate. De exemplu, acest cârlig va îngheța Firefox, Chrome sau orice alt client care încearcă să se conecteze la serverul HTTP pentru mai multe 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 este un instrument excelent pentru pedepsirea bătăuților online. Adevărat, există un anumit risc, dimpotrivă, de a le atrage atenția asupra comportamentului neobișnuit al unui anumit server. Cineva s-ar putea gândi la răzbunare și un atac DDoS vizat asupra IP-ului dvs. Cu toate acestea, până acum nu au existat astfel de cazuri, iar prelatele funcționează excelent.

Huburi:
Python, securitatea informațiilor, software, administrare de sistem

Tag-uri:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Capcană (tarpit) pentru conexiunile SSH de intrare

Nu este un secret pentru nimeni că Internetul este un mediu foarte ostil. De îndată ce ridicați un server, acesta este supus instantaneu la atacuri masive și scanări multiple. De exemplu honeypot de la securiști puteți estima amploarea acestui trafic de gunoi. De fapt, pe un server mediu, 99% din trafic poate fi rău intenționat.

Tarpit este un port capcană folosit pentru a încetini conexiunile de intrare. Dacă un sistem terță parte se conectează la acest port, nu veți putea închide rapid conexiunea. Ea va trebui să-și irosească resursele de sistem și să aștepte până la expirarea timpului de conexiune sau să o încheie manual.

Cel mai adesea, prelatele sunt folosite pentru protecție. Tehnica a fost dezvoltată mai întâi pentru a proteja împotriva viermilor de computer. Și acum poate fi folosit pentru a ruina viețile spammerilor și cercetătorilor care sunt angajați în scanarea amplă a tuturor adreselor IP la rând (exemple pe Habré: Austria, Ucraina).

Unul dintre administratorii de sistem numit Chris Wellons se pare că s-a săturat să urmărească această rușine - și a scris un mic program Fără sfârşit, un tarpit pentru SSH care încetinește conexiunile de intrare. Programul deschide un port (portul implicit pentru testare este 2222) și se preface a fi un server SSH, dar în realitate stabilește o conexiune nesfârșită cu clientul de intrare până când acesta renunță. Acest lucru poate continua câteva zile sau mai multe până când clientul cade.

Instalarea utilitarului:

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

O tarpit implementată corect va lua mai multe resurse de la atacator decât de la tine. Dar nici măcar nu este o chestiune de resurse. Autor el scriecă programul creează dependență. În acest moment, are 27 de clienți blocați, unii dintre ei conectați de săptămâni. În vârf de activitate, 1378 de clienți au fost prinși timp de 20 de ore!

În modul de funcționare, serverul Endlessh trebuie instalat pe portul obișnuit 22, unde huliganii bat în masă. Recomandările standard de securitate recomandă întotdeauna mutarea SSH pe un alt port, ceea ce reduce imediat dimensiunea jurnalelor cu un ordin de mărime.

Chris Wellons spune că programul său exploatează un paragraf din specificație RFC 4253 la protocolul SSH. Imediat după stabilirea unei conexiuni TCP, dar înainte de aplicarea criptografiei, ambele părți trebuie să trimită un șir de identificare. Și există și o notă: „Serverul POATE trimite alte rânduri de date înainte de a trimite rândul de versiune”. și fara limita pe volumul acestor date, trebuie doar să începeți fiecare linie cu SSH-.

Este exact ceea ce face programul Endlessh: it trimite fără sfârșit flux de date generate aleatoriu, care respectă RFC 4253, adică trimit înainte de autentificare și fiecare linie începe cu SSH- și nu depășește 255 de caractere, inclusiv caracterul de sfârșit de linie. În general, totul este conform standardului.

În mod implicit, programul așteaptă 10 secunde între trimiterea pachetelor. Acest lucru împiedică clientul să fie expirat, astfel încât clientul va fi prins pentru totdeauna.

Deoarece datele sunt trimise înainte de aplicarea criptografiei, programul este extrem de simplu. Nu are nevoie să implementeze nicio cifră și acceptă mai multe protocoale.

Autorul a încercat să se asigure că utilitarul consumă un minim de resurse și funcționează complet neobservat pe mașină. Spre deosebire de antivirusurile moderne și alte „sisteme de securitate”, acesta nu ar trebui să vă încetinească computerul. A reușit să minimizeze atât traficul, cât și consumul de memorie datorită unei implementări software ceva mai viclene. Dacă pur și simplu a lansat un proces separat pe o nouă conexiune, atunci potențialii atacatori ar putea lansa un atac DDoS prin deschiderea mai multor conexiuni pentru a epuiza resursele de pe mașină. De asemenea, un fir pe conexiune nu este cea mai bună opțiune, deoarece nucleul va irosi resurse gestionând firele.

De aceea, Chris Wellons a ales cea mai ușoară opțiune pentru Endlessh: un server cu un singur thread poll(2), unde clienții din capcană nu consumă practic resurse suplimentare, fără a număra obiectul socket din kernel și alți 78 de octeți pentru urmărire în Endlessh. Pentru a evita alocarea bufferelor de primire și trimitere pentru fiecare client, Endlessh deschide un socket de acces direct și traduce pachetele TCP direct, ocolind aproape întregul sistem de operare TCP/IP. Bufferul de intrare nu este deloc necesar, deoarece nu ne interesează datele primite.

Autorul spune că la momentul programului său Nu știam despre existența asycio-ului lui Python și a altor prelate. Dacă ar ști despre asycio, și-ar putea implementa utilitatea în doar 18 rânduri în 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 este ideal pentru scris prelate. De exemplu, acest cârlig va îngheța Firefox, Chrome sau orice alt client care încearcă să se conecteze la serverul HTTP pentru mai multe 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 este un instrument excelent pentru pedepsirea bătăuților online. Adevărat, există un anumit risc, dimpotrivă, de a le atrage atenția asupra comportamentului neobișnuit al unui anumit server. Cineva s-ar putea gândi la răzbunare și un atac DDoS vizat asupra IP-ului dvs. Cu toate acestea, până acum nu au existat astfel de cazuri, iar prelatele funcționează excelent.

Capcană (tarpit) pentru conexiunile SSH de intrare

Sursa: www.habr.com

Adauga un comentariu