Heç kimə sirr deyil ki, İnternet çox düşmən mühitdir. Bir server qaldıran kimi o, dərhal kütləvi hücumlara və çoxsaylı skanlara məruz qalır. Misal üçün
Tarpit, daxil olan əlaqələri yavaşlatmaq üçün istifadə edilən tələ portudur. Bu porta üçüncü tərəf sistemi qoşularsa, siz əlaqəni tez bağlaya bilməyəcəksiniz. O, sistem resurslarını sərf etməli və əlaqə vaxtının bitməsini gözləməli və ya onu əl ilə dayandırmalı olacaq.
Çox vaxt tarpitlər qorunmaq üçün istifadə olunur. Texnika ilk dəfə kompüter qurdlarından qorunmaq üçün hazırlanmışdır. İndi o, ardıcıl olaraq bütün IP ünvanlarının geniş skan edilməsi ilə məşğul olan spam göndərənlərin və tədqiqatçıların həyatını məhv etmək üçün istifadə edilə bilər (Habré-də nümunələr:
Chris Wellons adlı sistem administratorlarından biri yəqin ki, bu biabırçılığı izləməkdən yorulub - və o, kiçik bir proqram yazdı.
Utilityin quraşdırılması:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Düzgün tətbiq olunan tarpit sizdən daha çox təcavüzkardan daha çox resurs alacaq. Ancaq bu, hətta resurs məsələsi deyil. Müəllif
İş rejimində Endlessh serveri xuliqanların kütləvi şəkildə döydüyü adi port 22-də quraşdırılmalıdır. Standart təhlükəsizlik tövsiyələri həmişə SSH-ni fərqli bir porta köçürməyi məsləhət görür ki, bu da jurnalların ölçüsünü dərhal böyüklük sırası ilə azaldır.
Chris Wellons deyir ki, onun proqramı spesifikasiyanın bir paraqrafından istifadə edir SSH-
.
Bu, Endlessh proqramının etdiyi şeydir: o göndərir sonsuz təsadüfi yaradılan məlumat axını, RFC 4253-ə uyğundur, yəni autentifikasiyadan əvvəl göndərilir və hər sətir ilə başlayır SSH-
və sətir sonu simvolu daxil olmaqla 255 simvoldan çox deyil. Ümumiyyətlə, hər şey standarta uyğundur.
Varsayılan olaraq, proqram paketlərin göndərilməsi arasında 10 saniyə gözləyir. Bu, müştərinin vaxt aşımına uğramasının qarşısını alır, beləliklə, müştəri həmişəlik tələyə düşəcək.
Məlumatlar kriptoqrafiya tətbiq edilməzdən əvvəl göndərildiyi üçün proqram olduqca sadədir. Heç bir şifrə tətbiq etməyə ehtiyac yoxdur və çoxlu protokolları dəstəkləyir.
Müəllif, kommunalın minimum resurs istehlak etməsini və maşında tamamilə fərq edilmədən işləməsini təmin etməyə çalışdı. Müasir antiviruslardan və digər “təhlükəsizlik sistemlərindən” fərqli olaraq, o, kompüterinizi yavaşlatmamalıdır. O, bir az daha hiyləgər proqram tətbiqi sayəsində həm trafik, həm də yaddaş istehlakını minimuma endirməyi bacardı. Əgər o, sadəcə olaraq yeni bir əlaqədə ayrıca bir proses başlatdısa, potensial təcavüzkarlar maşındakı resursları tükəndirmək üçün birdən çox əlaqə açaraq DDoS hücumuna başlaya bilər. Hər bir əlaqə üçün bir ip də ən yaxşı seçim deyil, çünki nüvə mövzuları idarə etmək üçün resursları sərf edəcək.
Buna görə Chris Wellons Endlessh üçün ən yüngül variantı seçdi: tək yivli server poll(2)
, burada tələdəki müştərilər kerneldəki yuva obyektini və Endlessh-də izləmə üçün başqa 78 baytı saymasaq, faktiki olaraq heç bir əlavə resurs istehlak etmirlər. Hər bir müştəri üçün qəbul və göndərmə buferləri ayırmaq məcburiyyətində qalmamaq üçün Endlessh birbaşa giriş yuvası açır və demək olar ki, bütün əməliyyat sisteminin TCP/IP yığınını keçərək TCP paketlərini birbaşa tərcümə edir. Gələn buferə ümumiyyətlə ehtiyac yoxdur, çünki daxil olan məlumatlar bizi maraqlandırmır.
Müəllif deyir ki, verilişi zamanı
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 tarpitlər yazmaq üçün idealdır. Məsələn, bu qarmaq Firefox, Chrome və ya HTTP serverinizə bir neçə saat qoşulmağa çalışan hər hansı digər müştərini donduracaq:
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 onlayn zorakılıqları cəzalandırmaq üçün əla vasitədir. Düzdür, əksinə, onların diqqətini müəyyən bir serverin qeyri-adi davranışına cəlb etmək riski var. Kimsə
Qovşaqlar:
Python, İnformasiya təhlükəsizliyi, Proqram təminatı, Sistem idarəçiliyi
Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Daxil olan SSH əlaqələri üçün tələ (tarpit).
Heç kimə sirr deyil ki, İnternet çox düşmən mühitdir. Bir server qaldıran kimi o, dərhal kütləvi hücumlara və çoxsaylı skanlara məruz qalır. Misal üçün
Tarpit, daxil olan əlaqələri yavaşlatmaq üçün istifadə edilən tələ portudur. Bu porta üçüncü tərəf sistemi qoşularsa, siz əlaqəni tez bağlaya bilməyəcəksiniz. O, sistem resurslarını sərf etməli və əlaqə vaxtının bitməsini gözləməli və ya onu əl ilə dayandırmalı olacaq.
Çox vaxt tarpitlər qorunmaq üçün istifadə olunur. Texnika ilk dəfə kompüter qurdlarından qorunmaq üçün hazırlanmışdır. İndi o, ardıcıl olaraq bütün IP ünvanlarının geniş skan edilməsi ilə məşğul olan spam göndərənlərin və tədqiqatçıların həyatını məhv etmək üçün istifadə edilə bilər (Habré-də nümunələr:
Chris Wellons adlı sistem administratorlarından biri yəqin ki, bu biabırçılığı izləməkdən yorulub - və o, kiçik bir proqram yazdı.
Utilityin quraşdırılması:
$ make
$ ./endlessh &
$ ssh -p2222 localhost
Düzgün tətbiq olunan tarpit sizdən daha çox təcavüzkardan daha çox resurs alacaq. Ancaq bu, hətta resurs məsələsi deyil. Müəllif
İş rejimində Endlessh serveri xuliqanların kütləvi şəkildə döydüyü adi port 22-də quraşdırılmalıdır. Standart təhlükəsizlik tövsiyələri həmişə SSH-ni fərqli bir porta köçürməyi məsləhət görür ki, bu da jurnalların ölçüsünü dərhal böyüklük sırası ilə azaldır.
Chris Wellons deyir ki, onun proqramı spesifikasiyanın bir paraqrafından istifadə edir SSH-
.
Bu, Endlessh proqramının etdiyi şeydir: o göndərir sonsuz təsadüfi yaradılan məlumat axını, RFC 4253-ə uyğundur, yəni autentifikasiyadan əvvəl göndərilir və hər sətir ilə başlayır SSH-
və sətir sonu simvolu daxil olmaqla 255 simvoldan çox deyil. Ümumiyyətlə, hər şey standarta uyğundur.
Varsayılan olaraq, proqram paketlərin göndərilməsi arasında 10 saniyə gözləyir. Bu, müştərinin vaxt aşımına uğramasının qarşısını alır, beləliklə, müştəri həmişəlik tələyə düşəcək.
Məlumatlar kriptoqrafiya tətbiq edilməzdən əvvəl göndərildiyi üçün proqram olduqca sadədir. Heç bir şifrə tətbiq etməyə ehtiyac yoxdur və çoxlu protokolları dəstəkləyir.
Müəllif, kommunalın minimum resurs istehlak etməsini və maşında tamamilə fərq edilmədən işləməsini təmin etməyə çalışdı. Müasir antiviruslardan və digər “təhlükəsizlik sistemlərindən” fərqli olaraq, o, kompüterinizi yavaşlatmamalıdır. O, bir az daha hiyləgər proqram tətbiqi sayəsində həm trafik, həm də yaddaş istehlakını minimuma endirməyi bacardı. Əgər o, sadəcə olaraq yeni bir əlaqədə ayrıca bir proses başlatdısa, potensial təcavüzkarlar maşındakı resursları tükəndirmək üçün birdən çox əlaqə açaraq DDoS hücumuna başlaya bilər. Hər bir əlaqə üçün bir ip də ən yaxşı seçim deyil, çünki nüvə mövzuları idarə etmək üçün resursları sərf edəcək.
Buna görə Chris Wellons Endlessh üçün ən yüngül variantı seçdi: tək yivli server poll(2)
, burada tələdəki müştərilər kerneldəki yuva obyektini və Endlessh-də izləmə üçün başqa 78 baytı saymasaq, faktiki olaraq heç bir əlavə resurs istehlak etmirlər. Hər bir müştəri üçün qəbul və göndərmə buferləri ayırmaq məcburiyyətində qalmamaq üçün Endlessh birbaşa giriş yuvası açır və demək olar ki, bütün əməliyyat sisteminin TCP/IP yığınını keçərək TCP paketlərini birbaşa tərcümə edir. Gələn buferə ümumiyyətlə ehtiyac yoxdur, çünki daxil olan məlumatlar bizi maraqlandırmır.
Müəllif deyir ki, verilişi zamanı
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 tarpitlər yazmaq üçün idealdır. Məsələn, bu qarmaq Firefox, Chrome və ya HTTP serverinizə bir neçə saat qoşulmağa çalışan hər hansı digər müştərini donduracaq:
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 onlayn zorakılıqları cəzalandırmaq üçün əla vasitədir. Düzdür, əksinə, onların diqqətini müəyyən bir serverin qeyri-adi davranışına cəlb etmək riski var. Kimsə
Mənbə: www.habr.com