Perangkap (tarpit) untuk koneksi SSH yang masuk

Bukan rahasia lagi bahwa Internet adalah lingkungan yang sangat tidak bersahabat. Segera setelah Anda meningkatkan server, server tersebut langsung mengalami serangan besar-besaran dan pemindaian berulang kali. Misalnya honeypot dari penjaga keamanan Anda dapat memperkirakan skala lalu lintas sampah ini. Faktanya, pada rata-rata server, 99% lalu lintas mungkin berbahaya.

Tarpit adalah port jebakan yang digunakan untuk memperlambat koneksi masuk. Jika sistem pihak ketiga terhubung ke port ini, Anda tidak akan dapat menutup koneksi dengan cepat. Dia harus membuang sumber daya sistemnya dan menunggu hingga koneksi habis, atau menghentikannya secara manual.

Paling sering, terpal digunakan untuk perlindungan. Teknik ini pertama kali dikembangkan untuk melindungi terhadap worm komputer. Dan sekarang ini dapat digunakan untuk menghancurkan kehidupan para spammer dan peneliti yang terlibat dalam pemindaian luas semua alamat IP secara berturut-turut (contoh di HabrΓ©: Austria, Ukraine).

Salah satu administrator sistem bernama Chris Wellons rupanya bosan melihat aib ini - dan dia menulis sebuah program kecil Tak ada habisnya, tarpit untuk SSH yang memperlambat koneksi masuk. Program ini membuka port (port default untuk pengujian adalah 2222) dan berpura-pura menjadi server SSH, namun kenyataannya program ini membuat koneksi tanpa akhir dengan klien masuk hingga program tersebut menyerah. Hal ini dapat berlanjut selama beberapa hari atau lebih hingga klien terjatuh.

Instalasi utilitas:

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

Tarpit yang diterapkan dengan benar akan mengambil lebih banyak sumber daya dari penyerang dibandingkan dari Anda. Tapi ini bukan soal sumber daya. Pengarang menulisbahwa program ini membuat ketagihan. Saat ini ada 27 klien yang terjebak, beberapa di antaranya terhubung selama berminggu-minggu. Pada puncak aktivitas, 1378 klien terjebak selama 20 jam!

Dalam mode operasi, server Endlessh perlu diinstal pada port 22 biasa, tempat para hooligan mengetuk secara massal. Rekomendasi keamanan standar selalu menyarankan untuk memindahkan SSH ke port lain, yang akan segera mengurangi ukuran log berdasarkan urutan besarnya.

Chris Wellons mengatakan programnya mengeksploitasi satu paragraf spesifikasi RFC 4253 ke protokol SSH. Segera setelah koneksi TCP dibuat, tetapi sebelum kriptografi diterapkan, kedua belah pihak harus mengirimkan string identifikasi. Dan ada juga catatan: "Server MUNGKIN mengirim baris data lain sebelum mengirim baris versi". Dan tidak ada batas pada volume data ini, Anda hanya perlu memulai setiap baris SSH-.

Inilah tepatnya yang dilakukan oleh program Endlessh: itu mengirim tak ada habisnya aliran data yang dihasilkan secara acak, yang mematuhi RFC 4253, yaitu mengirim sebelum otentikasi, dan setiap baris dimulai dengan SSH- dan tidak melebihi 255 karakter, termasuk karakter akhir baris. Secara umum semuanya sesuai standar.

Secara default, program menunggu 10 detik antara pengiriman paket. Hal ini mencegah klien kehabisan waktu, sehingga klien akan terjebak selamanya.

Karena data dikirim sebelum kriptografi diterapkan, program ini sangat sederhana. Itu tidak perlu mengimplementasikan cipher apa pun dan mendukung banyak protokol.

Penulis mencoba memastikan bahwa utilitas tersebut mengkonsumsi sumber daya minimum dan bekerja sepenuhnya tanpa disadari pada mesin. Tidak seperti antivirus modern dan β€œsistem keamanan” lainnya, antivirus ini tidak akan memperlambat komputer Anda. Dia berhasil meminimalkan lalu lintas dan konsumsi memori karena implementasi perangkat lunak yang sedikit lebih cerdik. Jika mesin hanya meluncurkan proses terpisah pada koneksi baru, maka calon penyerang dapat melancarkan serangan DDoS dengan membuka beberapa koneksi untuk menghabiskan sumber daya pada mesin. Satu thread per koneksi juga bukan pilihan terbaik, karena kernel akan membuang-buang sumber daya dalam mengelola thread.

Itu sebabnya Chris Wellons memilih opsi paling ringan untuk Endlessh: server single-threaded poll(2), di mana klien dalam perangkap hampir tidak menggunakan sumber daya tambahan, tidak termasuk objek soket di kernel dan 78 byte lainnya untuk pelacakan di Endlessh. Untuk menghindari keharusan mengalokasikan buffer penerimaan dan pengiriman untuk setiap klien, Endlessh membuka soket akses langsung dan menerjemahkan paket TCP secara langsung, melewati hampir seluruh tumpukan TCP/IP sistem operasi. Buffer yang masuk tidak diperlukan sama sekali, karena kita tidak tertarik dengan data yang masuk.

Penulis mengatakan itu pada saat programnya tidak tahu tentang keberadaan asycio Python dan tarpit lainnya. Jika dia tahu tentang asycio, dia bisa mengimplementasikan utilitasnya hanya dalam 18 baris dengan 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 sangat ideal untuk menulis tarpits. Misalnya, pengait ini akan membekukan Firefox, Chrome, atau klien lain yang mencoba menyambung ke server 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 adalah alat yang hebat untuk menghukum pelaku intimidasi online. Benar, ada risiko, sebaliknya, menarik perhatian mereka pada perilaku tidak biasa dari server tertentu. Seseorang mungkin berpikir tentang balas dendam dan serangan DDoS yang ditargetkan pada IP Anda. Namun, sejauh ini belum ada kasus seperti itu, dan terpal berfungsi dengan baik.

Hub:
Python, Keamanan informasi, Perangkat Lunak, Administrasi sistem

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

Bukan rahasia lagi bahwa Internet adalah lingkungan yang sangat tidak bersahabat. Segera setelah Anda meningkatkan server, server tersebut langsung mengalami serangan besar-besaran dan pemindaian berulang kali. Misalnya honeypot dari penjaga keamanan Anda dapat memperkirakan skala lalu lintas sampah ini. Faktanya, pada rata-rata server, 99% lalu lintas mungkin berbahaya.

Tarpit adalah port jebakan yang digunakan untuk memperlambat koneksi masuk. Jika sistem pihak ketiga terhubung ke port ini, Anda tidak akan dapat menutup koneksi dengan cepat. Dia harus membuang sumber daya sistemnya dan menunggu hingga koneksi habis, atau menghentikannya secara manual.

Paling sering, terpal digunakan untuk perlindungan. Teknik ini pertama kali dikembangkan untuk melindungi terhadap worm komputer. Dan sekarang ini dapat digunakan untuk menghancurkan kehidupan para spammer dan peneliti yang terlibat dalam pemindaian luas semua alamat IP secara berturut-turut (contoh di HabrΓ©: Austria, Ukraine).

Salah satu administrator sistem bernama Chris Wellons rupanya bosan melihat aib ini - dan dia menulis sebuah program kecil Tak ada habisnya, tarpit untuk SSH yang memperlambat koneksi masuk. Program ini membuka port (port default untuk pengujian adalah 2222) dan berpura-pura menjadi server SSH, namun kenyataannya program ini membuat koneksi tanpa akhir dengan klien masuk hingga program tersebut menyerah. Hal ini dapat berlanjut selama beberapa hari atau lebih hingga klien terjatuh.

Instalasi utilitas:

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

Tarpit yang diterapkan dengan benar akan mengambil lebih banyak sumber daya dari penyerang dibandingkan dari Anda. Tapi ini bukan soal sumber daya. Pengarang menulisbahwa program ini membuat ketagihan. Saat ini ada 27 klien yang terjebak, beberapa di antaranya terhubung selama berminggu-minggu. Pada puncak aktivitas, 1378 klien terjebak selama 20 jam!

Dalam mode operasi, server Endlessh perlu diinstal pada port 22 biasa, tempat para hooligan mengetuk secara massal. Rekomendasi keamanan standar selalu menyarankan untuk memindahkan SSH ke port lain, yang akan segera mengurangi ukuran log berdasarkan urutan besarnya.

Chris Wellons mengatakan programnya mengeksploitasi satu paragraf spesifikasi RFC 4253 ke protokol SSH. Segera setelah koneksi TCP dibuat, tetapi sebelum kriptografi diterapkan, kedua belah pihak harus mengirimkan string identifikasi. Dan ada juga catatan: "Server MUNGKIN mengirim baris data lain sebelum mengirim baris versi". Dan tidak ada batas pada volume data ini, Anda hanya perlu memulai setiap baris SSH-.

Inilah tepatnya yang dilakukan oleh program Endlessh: itu mengirim tak ada habisnya aliran data yang dihasilkan secara acak, yang mematuhi RFC 4253, yaitu mengirim sebelum otentikasi, dan setiap baris dimulai dengan SSH- dan tidak melebihi 255 karakter, termasuk karakter akhir baris. Secara umum semuanya sesuai standar.

Secara default, program menunggu 10 detik antara pengiriman paket. Hal ini mencegah klien kehabisan waktu, sehingga klien akan terjebak selamanya.

Karena data dikirim sebelum kriptografi diterapkan, program ini sangat sederhana. Itu tidak perlu mengimplementasikan cipher apa pun dan mendukung banyak protokol.

Penulis mencoba memastikan bahwa utilitas tersebut mengkonsumsi sumber daya minimum dan bekerja sepenuhnya tanpa disadari pada mesin. Tidak seperti antivirus modern dan β€œsistem keamanan” lainnya, antivirus ini tidak akan memperlambat komputer Anda. Dia berhasil meminimalkan lalu lintas dan konsumsi memori karena implementasi perangkat lunak yang sedikit lebih cerdik. Jika mesin hanya meluncurkan proses terpisah pada koneksi baru, maka calon penyerang dapat melancarkan serangan DDoS dengan membuka beberapa koneksi untuk menghabiskan sumber daya pada mesin. Satu thread per koneksi juga bukan pilihan terbaik, karena kernel akan membuang-buang sumber daya dalam mengelola thread.

Itu sebabnya Chris Wellons memilih opsi paling ringan untuk Endlessh: server single-threaded poll(2), di mana klien dalam perangkap hampir tidak menggunakan sumber daya tambahan, tidak termasuk objek soket di kernel dan 78 byte lainnya untuk pelacakan di Endlessh. Untuk menghindari keharusan mengalokasikan buffer penerimaan dan pengiriman untuk setiap klien, Endlessh membuka soket akses langsung dan menerjemahkan paket TCP secara langsung, melewati hampir seluruh tumpukan TCP/IP sistem operasi. Buffer yang masuk tidak diperlukan sama sekali, karena kita tidak tertarik dengan data yang masuk.

Penulis mengatakan itu pada saat programnya tidak tahu tentang keberadaan asycio Python dan tarpit lainnya. Jika dia tahu tentang asycio, dia bisa mengimplementasikan utilitasnya hanya dalam 18 baris dengan 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 sangat ideal untuk menulis tarpits. Misalnya, pengait ini akan membekukan Firefox, Chrome, atau klien lain yang mencoba menyambung ke server 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 adalah alat yang hebat untuk menghukum pelaku intimidasi online. Benar, ada risiko, sebaliknya, menarik perhatian mereka pada perilaku tidak biasa dari server tertentu. Seseorang mungkin berpikir tentang balas dendam dan serangan DDoS yang ditargetkan pada IP Anda. Namun, sejauh ini belum ada kasus seperti itu, dan terpal berfungsi dengan baik.

Perangkap (tarpit) untuk koneksi SSH yang masuk

Sumber: www.habr.com

Tambah komentar