Nu este un secret că internetul este un mediu foarte ostil. De îndată ce ridici un server, acesta este imediat supus atacurilor masive și scanărilor multiple. Exemplul poate evalua amploarea acestui trafic nedorit. De fapt, pe un server mediu, 99% din trafic poate fi malitios.
Tarpit este un port capcană, folosit pentru a încetini conexiunile de intrare. Dacă un sistem extern se conectează la acest port, nu va putea închide rapid conexiunea. Va trebui să își cheltuie resursele de sistem și să aștepte până când conexiunea va fi ruptă din cauza timeout-ului sau să o rupă manual.
Cel mai adesea, tarpiturile sunt folosite pentru protecție. Tehnica a fost dezvoltată inițial pentru a apăra împotriva viermilor informatici. Acum poate fi folosită pentru a strica viața spammerilor și cercetătorilor care efectuează scanări largi ale tuturor adreselor IP (exemple pe Habr: , ).
Unui dintre administratori, pe nume Chris Vellons, probabil că i-a sărit în ochi această mizerie - și a scris un mic program , un tarpit pentru SSH care încetinește conexiunile de intrare. Programul deschide un port (în mod implicit, pentru teste este specificat portul 2222) și se pretinde a fi un server SSH, dar de fapt stabilește o conexiune infinită cu clientul de intrare, până când acesta se dă bătut. Aceasta poate dura câteva zile sau mai mult, până când clientul abandonează.
Instalarea utilitarului:
$ make
$ ./endlessh &
$ ssh -p2222 localhostUn tarpit bine implementat va consuma mai multe resurse de la atacator decât de la tine. Dar problema nu este doar resursele. Autorul , afirmă că programul devine adictiv. Chiar acum, în capcana sa sunt 27 de clienți, unii dintre ei fiind conectați de săptămâni. La vârful activității, în capcană erau 1378 de clienți timp de 20 de ore!
În regimul de lucru, serverul Endlessh trebuie să fie pus pe portul standard 22, unde intră în mod constant atacatori. Recomandările standard de securitate sugerează întotdeauna mutarea SSH pe un alt port, ceea ce reduce imediat volumul de loguri.
Chris Vellons spune că programul său exploatează un paragraf din specificație despre protocolul SSH. Imediat după stabilirea conexiunii TCP, dar înainte de aplicarea criptografiei, ambele părți trebuie să trimită un string de identificare. Și acolo se găsește o notă: „Serverul POATE trimite alte șiruri de date înainte de a trimite șirul cu versiunea“. Și fără limită la volumul acestor date, trebuie doar ca fiecare șir să înceapă cu SSH-.
Exact asta face programul Endlessh: acesta trimite generează un flux continuu de date generate aleator, care respectă RFC 4253, adică trimiterea înainte de identificare, iar fiecare șir începe cu SSH- și nu depășește 255 de caractere, inclusiv simbolul de încheiere a liniei. În general, totul conform standardului.
În mod implicit, programul așteaptă 10 secunde între trimiterea pachetelor. Aceasta previne deconectarea din cauza timeout-ului, astfel încât clientul va fi prins pe termen lung.
Deoarece trimiterea datelor are loc înainte de aplicarea criptografiei, programul este extrem de simplu. Nu trebuie să integreze criptări și să suporte numeroase protocoale.
Autorul s-a străduit să facă utilitarul să consume cât mai puține resurse și să funcționeze complet neobservat pe mașină. Spre deosebire de antivirusurile moderne și alte „sisteme de securitate”, acesta nu ar trebui să încetinească computerul. A reușit să minimizeze atât traficul, cât și consumul de memorie printr-o implementare software puțin mai sofisticată. Dacă ar fi lansat pur și simplu un proces separat pentru fiecare nouă conexiune, potențialii atacatori ar putea efectua un atac DDoS, deschizând numeroase conexiuni pentru a epuiza resursele de pe mașină. Un singur flux pe conexiune - de asemenea, nu este cea mai bună opțiune, deoarece nucleul va consuma resurse pentru gestionarea fluxurilor.
De aceea, Chris Vellons a ales pentru Endlessh cea mai ușoară variantă: un server cu un singur fir poll(2), unde clienții prizonieri consumă practic resurse suplimentare, cu excepția obiectului socket în nucleu și încă 78 de biți pentru urmărirea în Endlessh. Pentru a nu aloca buffere de primire și trimitere pentru fiecare client, Endlessh deschide un socket de acces direct și transmite direct pachetele TCP, ignorând aproape întregul stack TCP/IP al sistemului de operare. Bufferul de intrare nu este deloc necesar, deoarece datele de intrare nu ne interesează.
Autorul menționează că în momentul creării programului său despre existența lui asyncio din Python și alte limitări. Dacă ar fi știut despre asyncio, ar fi putut implementa utilitarul său în doar 18 linii de cod pe 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 perfect pentru a scrie tarp-uri. De exemplu, un astfel de tarp poate suspenda Firefox, Chrome sau alt client care încearcă să se conecteze la serverul dumneavoastră HTTP timp de ore întregi:
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())Tarp-ul este un instrument excelent pentru a pedepsi infractorii cibernetici. Totuși, există un anumit risc că, în schimb, le va atrage atenția asupra comportamentului neobișnuit al unui server anumit. Cineva și la un atac DDoS direcționat asupra IP-ului dumneavoastră. Totuși, până acum nu au fost astfel de incidente, iar tarp-urile funcționează excelent.
Hub-uri:
Python, Securitate cibernetică, Software, Administrare de sistem
Etichete:
SSH, Endlessh, tarpit, tarp, capcană, asycio
Tarpit pentru conexiunile SSH incoming
Nu este un secret că internetul este un mediu foarte ostil. De îndată ce ridici un server, acesta este imediat supus atacurilor masive și scanărilor multiple. Exemplul poate evalua amploarea acestui trafic nedorit. De fapt, pe un server mediu, 99% din trafic poate fi malitios.
Tarpit este un port capcană, folosit pentru a încetini conexiunile de intrare. Dacă un sistem extern se conectează la acest port, nu va putea închide rapid conexiunea. Va trebui să își cheltuie resursele de sistem și să aștepte până când conexiunea va fi ruptă din cauza timeout-ului sau să o rupă manual.
Cel mai adesea, tarpiturile sunt folosite pentru protecție. Tehnica a fost dezvoltată inițial pentru a apăra împotriva viermilor informatici. Acum poate fi folosită pentru a strica viața spammerilor și cercetătorilor care efectuează scanări largi ale tuturor adreselor IP (exemple pe Habr: , ).
Unui dintre administratori, pe nume Chris Vellons, probabil că i-a sărit în ochi această mizerie - și a scris un mic program , un tarpit pentru SSH care încetinește conexiunile de intrare. Programul deschide un port (în mod implicit, pentru teste este specificat portul 2222) și se pretinde a fi un server SSH, dar de fapt stabilește o conexiune infinită cu clientul de intrare, până când acesta se dă bătut. Aceasta poate dura câteva zile sau mai mult, până când clientul abandonează.
Instalarea utilitarului:
$ make
$ ./endlessh &
$ ssh -p2222 localhostUn tarpit bine implementat va consuma mai multe resurse de la atacator decât de la tine. Dar problema nu este doar resursele. Autorul , afirmă că programul devine adictiv. Chiar acum, în capcana sa sunt 27 de clienți, unii dintre ei fiind conectați de săptămâni. La vârful activității, în capcană erau 1378 de clienți timp de 20 de ore!
În regimul de lucru, serverul Endlessh trebuie să fie pus pe portul standard 22, unde intră în mod constant atacatori. Recomandările standard de securitate sugerează întotdeauna mutarea SSH pe un alt port, ceea ce reduce imediat volumul de loguri.
Chris Vellons spune că programul său exploatează un paragraf din specificație despre protocolul SSH. Imediat după stabilirea conexiunii TCP, dar înainte de aplicarea criptografiei, ambele părți trebuie să trimită un string de identificare. Și acolo se găsește o notă: „Serverul POATE trimite alte șiruri de date înainte de a trimite șirul cu versiunea“. Și fără limită la volumul acestor date, trebuie doar ca fiecare șir să înceapă cu SSH-.
Exact asta face programul Endlessh: acesta trimite generează un flux continuu de date generate aleator, care respectă RFC 4253, adică trimiterea înainte de identificare, iar fiecare șir începe cu SSH- și nu depășește 255 de caractere, inclusiv simbolul de încheiere a liniei. În general, totul conform standardului.
În mod implicit, programul așteaptă 10 secunde între trimiterea pachetelor. Aceasta previne deconectarea din cauza timeout-ului, astfel încât clientul va fi prins pe termen lung.
Deoarece trimiterea datelor are loc înainte de aplicarea criptografiei, programul este extrem de simplu. Nu trebuie să integreze criptări și să suporte numeroase protocoale.
Autorul s-a străduit să facă utilitarul să consume cât mai puține resurse și să funcționeze complet neobservat pe mașină. Spre deosebire de antivirusurile moderne și alte „sisteme de securitate”, acesta nu ar trebui să încetinească computerul. A reușit să minimizeze atât traficul, cât și consumul de memorie printr-o implementare software puțin mai sofisticată. Dacă ar fi lansat pur și simplu un proces separat pentru fiecare nouă conexiune, potențialii atacatori ar putea efectua un atac DDoS, deschizând numeroase conexiuni pentru a epuiza resursele de pe mașină. Un singur flux pe conexiune - de asemenea, nu este cea mai bună opțiune, deoarece nucleul va consuma resurse pentru gestionarea fluxurilor.
De aceea, Chris Vellons a ales pentru Endlessh cea mai ușoară variantă: un server cu un singur fir poll(2), unde clienții prizonieri consumă practic resurse suplimentare, cu excepția obiectului socket în nucleu și încă 78 de biți pentru urmărirea în Endlessh. Pentru a nu aloca buffere de primire și trimitere pentru fiecare client, Endlessh deschide un socket de acces direct și transmite direct pachetele TCP, ignorând aproape întregul stack TCP/IP al sistemului de operare. Bufferul de intrare nu este deloc necesar, deoarece datele de intrare nu ne interesează.
Autorul menționează că în momentul creării programului său despre existența lui asyncio din Python și alte limitări. Dacă ar fi știut despre asyncio, ar fi putut implementa utilitarul său în doar 18 linii de cod pe 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 perfect pentru a scrie tarp-uri. De exemplu, un astfel de tarp poate suspenda Firefox, Chrome sau alt client care încearcă să se conecteze la serverul dumneavoastră HTTP timp de ore întregi:
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())Tarp-ul este un instrument excelent pentru a pedepsi infractorii cibernetici. Totuși, există un anumit risc că, în schimb, le va atrage atenția asupra comportamentului neobișnuit al unui server anumit. Cineva și la un atac DDoS direcționat asupra IP-ului dumneavoastră. Totuși, până acum nu au fost astfel de incidente, iar tarp-urile funcționează excelent.
Sursa: habr.com
