Gelen SSH bağlantıları için tuzak (tarpit)

İnternetin çok düşmanca bir ortam olduğu bir sır değil. Bir sunucuyu yükselttiğiniz anda, anında büyük saldırılara ve çoklu taramalara maruz kalır. Örneğin güvenlik görevlilerinin bal küpü bu çöp trafiğinin boyutunu tahmin edebilirsiniz. Aslında ortalama bir sunucuda trafiğin %99'u kötü niyetli olabilir.

Tarpit, gelen bağlantıları yavaşlatmak için kullanılan bir tuzak bağlantı noktasıdır. Bu bağlantı noktasına üçüncü taraf bir sistem bağlanırsa bağlantıyı hızlı bir şekilde kapatamazsınız. Sistem kaynaklarını boşa harcaması ve bağlantının zaman aşımına uğramasını beklemesi veya bağlantıyı manuel olarak sonlandırması gerekecek.

Çoğu zaman, tarpitler koruma için kullanılır. Bu teknik ilk olarak bilgisayar solucanlarına karşı koruma sağlamak için geliştirildi. Ve artık tüm IP adreslerini arka arkaya geniş bir şekilde tarayan spam gönderenlerin ve araştırmacıların hayatlarını mahvetmek için kullanılabilir (Habré'deki örnekler: Avusturya, Ukrayna).

Chris Wellons adındaki sistem yöneticilerinden biri görünüşe göre bu rezaleti izlemekten sıkılmış ve küçük bir program yazmış. Sonsuz, SSH için gelen bağlantıları yavaşlatan bir tarpit. Program bir bağlantı noktası açar (test için varsayılan bağlantı noktası 2222'dir) ve bir SSH sunucusu gibi davranır, ancak gerçekte gelen istemciyle pes edene kadar sonsuz bir bağlantı kurar. Bu, hasta düşene kadar birkaç gün veya daha uzun süre devam edebilir.

Yardımcı programın kurulumu:

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

Doğru şekilde uygulanan bir tarpit, saldırganın sizden daha fazla kaynak almasına neden olacaktır. Ama bu bir kaynak meselesi bile değil. Yazar yazarprogramın bağımlılık yaptığını söyledi. Şu anda 27 müşterisi kapana kısılmış durumda ve bunlardan bazıları haftalardır bağlantıda. Faaliyetin zirvesinde 1378 müşteri 20 saat boyunca mahsur kaldı!

Çalışma modunda, Endlessh sunucusunun, holiganların topluca çaldığı normal 22 numaralı bağlantı noktasına kurulması gerekir. Standart güvenlik önerileri her zaman SSH'nin farklı bir bağlantı noktasına taşınmasını önerir; bu da günlüklerin boyutunu anında büyüklük sırasına göre azaltır.

Chris Wellons, programının spesifikasyonun bir paragrafından yararlandığını söylüyor RFC 4253 SSH protokolüne. TCP bağlantısı kurulduktan hemen sonra, ancak şifreleme uygulanmadan önce her iki tarafın da bir kimlik dizesi göndermesi gerekir. Bir de not var: "Sunucu, sürüm satırını göndermeden önce diğer veri satırlarını GÖNDEREBİLİR". Ve limit yok bu verinin hacmine göre, her satıra şununla başlamanız yeterlidir: SSH-.

Endlessh programının yaptığı da tam olarak budur: gönderir бесконечный rastgele oluşturulmuş veri akışıRFC 4253'e uygundur, yani kimlik doğrulamadan önce gönderilir ve her satır şununla başlar: SSH- ve satır sonu karakteri dahil 255 karakteri geçmez. Genel olarak her şey standarda uygundur.

Varsayılan olarak program, paketlerin gönderilmesi arasında 10 saniye bekler. Bu, istemcinin zaman aşımına uğramasını önler, böylece istemci sonsuza kadar tuzağa düşer.

Veriler kriptografi uygulanmadan önce gönderildiği için program son derece basittir. Herhangi bir şifre uygulamasına gerek yoktur ve birden fazla protokolü destekler.

Yazar, yardımcı programın minimum kaynak tüketmesini ve makinede tamamen fark edilmeden çalışmasını sağlamaya çalıştı. Modern antivirüslerin ve diğer "güvenlik sistemlerinin" aksine, bilgisayarınızı yavaşlatmamalıdır. Biraz daha kurnaz bir yazılım uygulaması sayesinde hem trafiği hem de bellek tüketimini en aza indirmeyi başardı. Yeni bir bağlantıda ayrı bir işlem başlatırsa potansiyel saldırganlar, makinedeki kaynakları tüketmek için birden fazla bağlantı açarak bir DDoS saldırısı başlatabilir. Bağlantı başına bir iş parçacığı da en iyi seçenek değildir çünkü çekirdek, iş parçacıklarını yöneten kaynakları boşa harcar.

Bu nedenle Chris Wellons, Endlessh için en hafif seçeneği seçti: tek iş parçacıklı bir sunucu poll(2)Tuzaktaki istemciler, çekirdekteki soket nesnesini ve Endlessh'te izleme için diğer 78 baytı saymazsak, neredeyse hiç ekstra kaynak tüketmez. Endlessh, her istemci için alma ve gönderme arabellekleri ayırma zorunluluğunu ortadan kaldırmak için doğrudan erişim soketi açar ve neredeyse tüm işletim sistemi TCP/IP yığınını atlayarak TCP paketlerini doğrudan çevirir. Gelen veriyle ilgilenmiyoruz çünkü gelen tampona hiç ihtiyaç yok.

Yazar, programı sırasında şunu söylüyor: bilmiyordum Python'un asycio'sunun ve diğer tarpitlerin varlığı hakkında. Asycio'yu bilseydi, faydasını Python'da sadece 18 satırda uygulayabilirdi:

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 tarpit yazmak için idealdir. Örneğin, bu kanca Firefox'u, Chrome'u veya HTTP sunucunuza bağlanmaya çalışan herhangi bir istemciyi saatlerce donduracaktır:

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, çevrimiçi zorbaları cezalandırmak için harika bir araçtır. Doğru, tam tersine, dikkatlerini belirli bir sunucunun olağandışı davranışına çekme riski var. Birisi intikam almayı düşünebilir ve IP'nize hedefli bir DDoS saldırısı. Ancak şu ana kadar böyle bir durum yaşanmadı ve tarpitler harika çalışıyor.

Merkezler:
Python, Bilgi güvenliği, Yazılım, Sistem yönetimi

Etiketler:
SSH, Endlessh, tarpit, tarpit, trap, asycio
Gelen SSH bağlantıları için tuzak (tarpit)

İnternetin çok düşmanca bir ortam olduğu bir sır değil. Bir sunucuyu yükselttiğiniz anda, anında büyük saldırılara ve çoklu taramalara maruz kalır. Örneğin güvenlik görevlilerinin bal küpü bu çöp trafiğinin boyutunu tahmin edebilirsiniz. Aslında ortalama bir sunucuda trafiğin %99'u kötü niyetli olabilir.

Tarpit, gelen bağlantıları yavaşlatmak için kullanılan bir tuzak bağlantı noktasıdır. Bu bağlantı noktasına üçüncü taraf bir sistem bağlanırsa bağlantıyı hızlı bir şekilde kapatamazsınız. Sistem kaynaklarını boşa harcaması ve bağlantının zaman aşımına uğramasını beklemesi veya bağlantıyı manuel olarak sonlandırması gerekecek.

Çoğu zaman, tarpitler koruma için kullanılır. Bu teknik ilk olarak bilgisayar solucanlarına karşı koruma sağlamak için geliştirildi. Ve artık tüm IP adreslerini arka arkaya geniş bir şekilde tarayan spam gönderenlerin ve araştırmacıların hayatlarını mahvetmek için kullanılabilir (Habré'deki örnekler: Avusturya, Ukrayna).

Chris Wellons adındaki sistem yöneticilerinden biri görünüşe göre bu rezaleti izlemekten sıkılmış ve küçük bir program yazmış. Sonsuz, SSH için gelen bağlantıları yavaşlatan bir tarpit. Program bir bağlantı noktası açar (test için varsayılan bağlantı noktası 2222'dir) ve bir SSH sunucusu gibi davranır, ancak gerçekte gelen istemciyle pes edene kadar sonsuz bir bağlantı kurar. Bu, hasta düşene kadar birkaç gün veya daha uzun süre devam edebilir.

Yardımcı programın kurulumu:

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

Doğru şekilde uygulanan bir tarpit, saldırganın sizden daha fazla kaynak almasına neden olacaktır. Ama bu bir kaynak meselesi bile değil. Yazar yazarprogramın bağımlılık yaptığını söyledi. Şu anda 27 müşterisi kapana kısılmış durumda ve bunlardan bazıları haftalardır bağlantıda. Faaliyetin zirvesinde 1378 müşteri 20 saat boyunca mahsur kaldı!

Çalışma modunda, Endlessh sunucusunun, holiganların topluca çaldığı normal 22 numaralı bağlantı noktasına kurulması gerekir. Standart güvenlik önerileri her zaman SSH'nin farklı bir bağlantı noktasına taşınmasını önerir; bu da günlüklerin boyutunu anında büyüklük sırasına göre azaltır.

Chris Wellons, programının spesifikasyonun bir paragrafından yararlandığını söylüyor RFC 4253 SSH protokolüne. TCP bağlantısı kurulduktan hemen sonra, ancak şifreleme uygulanmadan önce her iki tarafın da bir kimlik dizesi göndermesi gerekir. Bir de not var: "Sunucu, sürüm satırını göndermeden önce diğer veri satırlarını GÖNDEREBİLİR". Ve limit yok bu verinin hacmine göre, her satıra şununla başlamanız yeterlidir: SSH-.

Endlessh programının yaptığı da tam olarak budur: gönderir бесконечный rastgele oluşturulmuş veri akışıRFC 4253'e uygundur, yani kimlik doğrulamadan önce gönderilir ve her satır şununla başlar: SSH- ve satır sonu karakteri dahil 255 karakteri geçmez. Genel olarak her şey standarda uygundur.

Varsayılan olarak program, paketlerin gönderilmesi arasında 10 saniye bekler. Bu, istemcinin zaman aşımına uğramasını önler, böylece istemci sonsuza kadar tuzağa düşer.

Veriler kriptografi uygulanmadan önce gönderildiği için program son derece basittir. Herhangi bir şifre uygulamasına gerek yoktur ve birden fazla protokolü destekler.

Yazar, yardımcı programın minimum kaynak tüketmesini ve makinede tamamen fark edilmeden çalışmasını sağlamaya çalıştı. Modern antivirüslerin ve diğer "güvenlik sistemlerinin" aksine, bilgisayarınızı yavaşlatmamalıdır. Biraz daha kurnaz bir yazılım uygulaması sayesinde hem trafiği hem de bellek tüketimini en aza indirmeyi başardı. Yeni bir bağlantıda ayrı bir işlem başlatırsa potansiyel saldırganlar, makinedeki kaynakları tüketmek için birden fazla bağlantı açarak bir DDoS saldırısı başlatabilir. Bağlantı başına bir iş parçacığı da en iyi seçenek değildir çünkü çekirdek, iş parçacıklarını yöneten kaynakları boşa harcar.

Bu nedenle Chris Wellons, Endlessh için en hafif seçeneği seçti: tek iş parçacıklı bir sunucu poll(2)Tuzaktaki istemciler, çekirdekteki soket nesnesini ve Endlessh'te izleme için diğer 78 baytı saymazsak, neredeyse hiç ekstra kaynak tüketmez. Endlessh, her istemci için alma ve gönderme arabellekleri ayırma zorunluluğunu ortadan kaldırmak için doğrudan erişim soketi açar ve neredeyse tüm işletim sistemi TCP/IP yığınını atlayarak TCP paketlerini doğrudan çevirir. Gelen veriyle ilgilenmiyoruz çünkü gelen tampona hiç ihtiyaç yok.

Yazar, programı sırasında şunu söylüyor: bilmiyordum Python'un asycio'sunun ve diğer tarpitlerin varlığı hakkında. Asycio'yu bilseydi, faydasını Python'da sadece 18 satırda uygulayabilirdi:

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 tarpit yazmak için idealdir. Örneğin, bu kanca Firefox'u, Chrome'u veya HTTP sunucunuza bağlanmaya çalışan herhangi bir istemciyi saatlerce donduracaktır:

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, çevrimiçi zorbaları cezalandırmak için harika bir araçtır. Doğru, tam tersine, dikkatlerini belirli bir sunucunun olağandışı davranışına çekme riski var. Birisi intikam almayı düşünebilir ve IP'nize hedefli bir DDoS saldırısı. Ancak şu ana kadar böyle bir durum yaşanmadı ve tarpitler harika çalışıyor.

Gelen SSH bağlantıları için tuzak (tarpit)

Kaynak: habr.com

Yorum ekle