Perangkap (tarpit) untuk sambungan SSH masuk

Bukan rahsia lagi bahawa Internet adalah persekitaran yang sangat bermusuhan. Sebaik sahaja anda menaikkan pelayan, ia serta-merta tertakluk kepada serangan besar-besaran dan berbilang imbasan. Sebagai contoh honeypot daripada pengawal keselamatan anda boleh menganggarkan skala trafik sampah ini. Malah, pada pelayan purata, 99% trafik mungkin berniat jahat.

Tarpit ialah port perangkap yang digunakan untuk memperlahankan sambungan masuk. Jika sistem pihak ketiga bersambung ke port ini, anda tidak akan dapat menutup sambungan dengan cepat. Dia perlu membazirkan sumber sistemnya dan menunggu sehingga tamat masa sambungan, atau menamatkannya secara manual.

Selalunya, tarpit digunakan untuk perlindungan. Teknik ini mula-mula dibangunkan untuk melindungi daripada cecacing komputer. Dan kini ia boleh digunakan untuk merosakkan kehidupan pengirim spam dan penyelidik yang terlibat dalam pengimbasan luas semua alamat IP berturut-turut (contoh pada HabrΓ©: Austria, Ukraine).

Salah seorang pentadbir sistem bernama Chris Wellons nampaknya bosan menonton aib ini - dan dia menulis program kecil tak berkesudahan, tarpit untuk SSH yang melambatkan sambungan masuk. Program ini membuka port (port lalai untuk ujian ialah 2222) dan berpura-pura menjadi pelayan SSH, tetapi sebenarnya ia mewujudkan sambungan yang tidak berkesudahan dengan klien masuk sehingga ia berputus asa. Ini mungkin berterusan selama beberapa hari atau lebih sehingga pelanggan jatuh.

Pemasangan utiliti:

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

Tarpit yang dilaksanakan dengan betul akan mengambil lebih banyak sumber daripada penyerang daripada anda. Tetapi ia bukan masalah sumber. Pengarang menulisbahawa program itu ketagihan. Pada masa ini ia mempunyai 27 pelanggan terperangkap, sebahagian daripada mereka berhubung selama berminggu-minggu. Pada puncak aktiviti, 1378 pelanggan terperangkap selama 20 jam!

Dalam mod pengendalian, pelayan Endlessh perlu dipasang pada port biasa 22, di mana samseng mengetuk beramai-ramai. Pengesyoran keselamatan standard sentiasa menasihati mengalihkan SSH ke port lain, yang dengan serta-merta mengurangkan saiz log mengikut susunan magnitud.

Chris Wellons berkata programnya mengeksploitasi satu perenggan spesifikasi RFC 4253 kepada protokol SSH. Sejurus selepas sambungan TCP diwujudkan, tetapi sebelum kriptografi digunakan, kedua-dua pihak mesti menghantar rentetan pengenalan. Dan terdapat juga nota: "Pelayan MUNGKIN menghantar baris data lain sebelum menghantar baris versi". Dan tiada had pada volum data ini, anda hanya perlu memulakan setiap baris dengan SSH-.

Inilah yang dilakukan oleh program Endlessh: ia menghantar tak terhingga aliran data yang dijana secara rawak, yang mematuhi RFC 4253, iaitu, hantar sebelum pengesahan, dan setiap baris bermula dengan SSH- dan tidak melebihi 255 aksara, termasuk aksara akhir baris. Secara umum, semuanya mengikut piawaian.

Secara lalai, program menunggu 10 saat antara menghantar paket. Ini menghalang pelanggan daripada tamat masa, jadi pelanggan akan terperangkap selama-lamanya.

Memandangkan data dihantar sebelum kriptografi digunakan, program ini sangat mudah. Ia tidak perlu melaksanakan sebarang sifir dan menyokong pelbagai protokol.

Penulis cuba memastikan bahawa utiliti menggunakan sumber minimum dan berfungsi sepenuhnya tanpa disedari pada mesin. Tidak seperti antivirus moden dan "sistem keselamatan" lain, ia tidak seharusnya memperlahankan komputer anda. Dia berjaya meminimumkan penggunaan trafik dan memori kerana pelaksanaan perisian yang lebih licik. Jika ia hanya melancarkan proses berasingan pada sambungan baharu, maka penyerang berpotensi boleh melancarkan serangan DDoS dengan membuka berbilang sambungan untuk menghabiskan sumber pada mesin. Satu utas bagi setiap sambungan juga bukan pilihan terbaik, kerana kernel akan membazir sumber menguruskan benang.

Itulah sebabnya Chris Wellons memilih pilihan yang paling ringan untuk Endlessh: pelayan satu benang poll(2), di mana pelanggan dalam perangkap menggunakan hampir tiada sumber tambahan, tidak mengira objek soket dalam kernel dan 78 bait lagi untuk penjejakan dalam Endlessh. Untuk mengelak daripada memperuntukkan menerima dan menghantar penimbal untuk setiap pelanggan, Endlessh membuka soket akses terus dan menterjemah paket TCP secara langsung, memintas hampir keseluruhan susunan TCP/IP sistem pengendalian. Penampan masuk tidak diperlukan sama sekali, kerana kami tidak berminat dengan data masuk.

Penulis mengatakan bahawa pada masa programnya tidak tahu tentang kewujudan asycio Python dan tarpit lain. Jika dia tahu tentang asycio, dia boleh melaksanakan utilitinya hanya dalam 18 baris dalam 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 sesuai untuk menulis tarpit. Contohnya, cangkuk ini akan membekukan Firefox, Chrome atau mana-mana pelanggan lain yang cuba menyambung ke pelayan HTTP anda selama berjam-jam:

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 ialah alat yang hebat untuk menghukum pembuli dalam talian. Benar, terdapat beberapa risiko, sebaliknya, menarik perhatian mereka kepada tingkah laku luar biasa pelayan tertentu. Seseorang mungkin berfikir tentang balas dendam dan serangan DDoS yang disasarkan pada IP anda. Walau bagaimanapun, setakat ini tidak ada kes sedemikian, dan tarpit berfungsi dengan baik.

Hab:
Python, Keselamatan maklumat, Perisian, Pentadbiran sistem

Tags:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Perangkap (tarpit) untuk sambungan SSH masuk

Bukan rahsia lagi bahawa Internet adalah persekitaran yang sangat bermusuhan. Sebaik sahaja anda menaikkan pelayan, ia serta-merta tertakluk kepada serangan besar-besaran dan berbilang imbasan. Sebagai contoh honeypot daripada pengawal keselamatan anda boleh menganggarkan skala trafik sampah ini. Malah, pada pelayan purata, 99% trafik mungkin berniat jahat.

Tarpit ialah port perangkap yang digunakan untuk memperlahankan sambungan masuk. Jika sistem pihak ketiga bersambung ke port ini, anda tidak akan dapat menutup sambungan dengan cepat. Dia perlu membazirkan sumber sistemnya dan menunggu sehingga tamat masa sambungan, atau menamatkannya secara manual.

Selalunya, tarpit digunakan untuk perlindungan. Teknik ini mula-mula dibangunkan untuk melindungi daripada cecacing komputer. Dan kini ia boleh digunakan untuk merosakkan kehidupan pengirim spam dan penyelidik yang terlibat dalam pengimbasan luas semua alamat IP berturut-turut (contoh pada HabrΓ©: Austria, Ukraine).

Salah seorang pentadbir sistem bernama Chris Wellons nampaknya bosan menonton aib ini - dan dia menulis program kecil tak berkesudahan, tarpit untuk SSH yang melambatkan sambungan masuk. Program ini membuka port (port lalai untuk ujian ialah 2222) dan berpura-pura menjadi pelayan SSH, tetapi sebenarnya ia mewujudkan sambungan yang tidak berkesudahan dengan klien masuk sehingga ia berputus asa. Ini mungkin berterusan selama beberapa hari atau lebih sehingga pelanggan jatuh.

Pemasangan utiliti:

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

Tarpit yang dilaksanakan dengan betul akan mengambil lebih banyak sumber daripada penyerang daripada anda. Tetapi ia bukan masalah sumber. Pengarang menulisbahawa program itu ketagihan. Pada masa ini ia mempunyai 27 pelanggan terperangkap, sebahagian daripada mereka berhubung selama berminggu-minggu. Pada puncak aktiviti, 1378 pelanggan terperangkap selama 20 jam!

Dalam mod pengendalian, pelayan Endlessh perlu dipasang pada port biasa 22, di mana samseng mengetuk beramai-ramai. Pengesyoran keselamatan standard sentiasa menasihati mengalihkan SSH ke port lain, yang dengan serta-merta mengurangkan saiz log mengikut susunan magnitud.

Chris Wellons berkata programnya mengeksploitasi satu perenggan spesifikasi RFC 4253 kepada protokol SSH. Sejurus selepas sambungan TCP diwujudkan, tetapi sebelum kriptografi digunakan, kedua-dua pihak mesti menghantar rentetan pengenalan. Dan terdapat juga nota: "Pelayan MUNGKIN menghantar baris data lain sebelum menghantar baris versi". Dan tiada had pada volum data ini, anda hanya perlu memulakan setiap baris dengan SSH-.

Inilah yang dilakukan oleh program Endlessh: ia menghantar tak terhingga aliran data yang dijana secara rawak, yang mematuhi RFC 4253, iaitu, hantar sebelum pengesahan, dan setiap baris bermula dengan SSH- dan tidak melebihi 255 aksara, termasuk aksara akhir baris. Secara umum, semuanya mengikut piawaian.

Secara lalai, program menunggu 10 saat antara menghantar paket. Ini menghalang pelanggan daripada tamat masa, jadi pelanggan akan terperangkap selama-lamanya.

Memandangkan data dihantar sebelum kriptografi digunakan, program ini sangat mudah. Ia tidak perlu melaksanakan sebarang sifir dan menyokong pelbagai protokol.

Penulis cuba memastikan bahawa utiliti menggunakan sumber minimum dan berfungsi sepenuhnya tanpa disedari pada mesin. Tidak seperti antivirus moden dan "sistem keselamatan" lain, ia tidak seharusnya memperlahankan komputer anda. Dia berjaya meminimumkan penggunaan trafik dan memori kerana pelaksanaan perisian yang lebih licik. Jika ia hanya melancarkan proses berasingan pada sambungan baharu, maka penyerang berpotensi boleh melancarkan serangan DDoS dengan membuka berbilang sambungan untuk menghabiskan sumber pada mesin. Satu utas bagi setiap sambungan juga bukan pilihan terbaik, kerana kernel akan membazir sumber menguruskan benang.

Itulah sebabnya Chris Wellons memilih pilihan yang paling ringan untuk Endlessh: pelayan satu benang poll(2), di mana pelanggan dalam perangkap menggunakan hampir tiada sumber tambahan, tidak mengira objek soket dalam kernel dan 78 bait lagi untuk penjejakan dalam Endlessh. Untuk mengelak daripada memperuntukkan menerima dan menghantar penimbal untuk setiap pelanggan, Endlessh membuka soket akses terus dan menterjemah paket TCP secara langsung, memintas hampir keseluruhan susunan TCP/IP sistem pengendalian. Penampan masuk tidak diperlukan sama sekali, kerana kami tidak berminat dengan data masuk.

Penulis mengatakan bahawa pada masa programnya tidak tahu tentang kewujudan asycio Python dan tarpit lain. Jika dia tahu tentang asycio, dia boleh melaksanakan utilitinya hanya dalam 18 baris dalam 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 sesuai untuk menulis tarpit. Contohnya, cangkuk ini akan membekukan Firefox, Chrome atau mana-mana pelanggan lain yang cuba menyambung ke pelayan HTTP anda selama berjam-jam:

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 ialah alat yang hebat untuk menghukum pembuli dalam talian. Benar, terdapat beberapa risiko, sebaliknya, menarik perhatian mereka kepada tingkah laku luar biasa pelayan tertentu. Seseorang mungkin berfikir tentang balas dendam dan serangan DDoS yang disasarkan pada IP anda. Walau bagaimanapun, setakat ini tidak ada kes sedemikian, dan tarpit berfungsi dengan baik.

Perangkap (tarpit) untuk sambungan SSH masuk

Sumber: www.habr.com

Tambah komen