- Portspoof, 65535 TCP portunun tamamını açıkmış gibi gösterip hizmet imzalarını emüle ederek saldırganın keşif aşamasını hızlı bir taramadan uzun ve maliyetli bir işe dönüştürür
- Tüm bağlantı denemelerine
SYN+ACK döndürür ve 9000'den fazla regex tabanlı dinamik hizmet imzası ile her port, farklı ve meşru bir hizmet gibi yanıt verir
- Her porta başlangıçta anlık banner, gecikmeli yanıt, yanıtsız bekletme gibi karma teslim modları atanır ve bağlantıyı açık tutma süresine jitter eklenerek zamanlama tabanlı filtreleme zorlaştırılır
- Varsayılan tarpit ayarında tam sürüm taraması
nmap -sV -p- 10 saatten uzun sürebilir ve yüzlerce MB sahte veri üretebilir; saldırgan tarayıcısının zamanını ve iş parçacıklarını tüketir
- Uygulama tek iş parçacıklı bir
epoll olay döngüsü kullanır, kullanıcı alanında root yetkisi olmadan çalışır ve çalışan her örnek başına yalnızca bir TCP portuna bağlanır
Portspoof'un çözmeye çalıştığı sorun
- Portspoof'un amacı saldırganın keşif sürecini yavaş, pahalı ve güvenilmez hale getirmektir
- Normalde 5 saniyelik tipik bir Nmap taraması bir sistemin gerçek hizmetlerini haritalandırırken, Portspoof'un önünde 65535 portun tamamı açıkmış gibi görünür
- Her port farklı ve meşru bir hizmet gibi görünür; hangi portun gerçek hizmet olduğu hızlıca ayırt edilemeyecek şekilde tasarlanmıştır
Temel özellikler
-
Tüm 65535 TCP portu açıkmış gibi yanıt verir
- Bir portun
CLOSED veya FILTERED olduğunu bildirmek yerine tüm bağlantı denemelerine SYN+ACK döndürür
-
Hizmet emülasyonu
- 9000'den fazla regex tabanlı dinamik hizmet imzası kullanır
- Her portta tarayıcının problarına farklı ve ikna edici bir hizmet kimliğiyle yanıt verir
-
Karma teslim modları
- Her port başlangıçta farklı bir davranış profili alır
- Anında banner gönderme, gecikmeli yanıt ve yanıtsız bekletme modları karışık kullanılır
- Bekletme süreleri geniş bir aralığa dağıtılarak tam aralık sürüm tespiti
nmap -sV -p- pratik sınırların ötesine taşınır
-
Saldırgan savunma
- Saldırganın tarama araçlarındaki zafiyetleri hedefleyen bir “Exploitation Framework Frontend” olarak kullanılabilir
-
Hafif çalışma modeli
- Kullanıcı alanında çalışır
- Root yetkisi gerektirmez
- Çalışan her örnek başına yalnızca bir TCP portuna bağlanır
- CPU ve bellek kullanımı düşüktür
Tarayıcıları ve sürüm tespitini nasıl şaşırtır
- Basit port taramalarında 1~20 gibi küçük port aralıkları bile tamamen
open görünür
- Örnek çıktıda
tcpmux, compressnet, echo, daytime, ftp-data gibi hizmet adları karışık şekilde gösterilir
- Sürüm tespit taramalarında hizmet problarına geçerli dinamik imzalar döndürür
- 1~100 port örneğinde
irc, http, pop3, ssh, ftp, smtp, telnet, tor-control gibi çeşitli hizmetler ve sürüm dizeleri görünür
- Sonuç olarak saldırgan, sistemin gerçekte hangi port numaralarını kullandığını belirlemekte zorlanır
- Tam sürüm taraması
nmap -sV -p-, varsayılan tarpit ayarında 10 saatten uzun sürer ve yüzlerce MB sahte veri üretir
- Tarayıcı, gerçek sonuca götürmeyen bağlantılara zamanını ve iş parçacıklarını harcar
Tasarım yaklaşımı: tek iş parçacıklı epoll tarpit
- SSH, SMTP, FTP, HTTP gibi gerçek hizmetler banner gönderir, bağlantıyı açık tutar ve istemci girdisini bekler
- İkna edici bir emülasyon da aynı şekilde accept, send, hold akışını izlemelidir
- Her istemci için iş parçacığı kullanan model bellek ve CPU tüketir; bağlam değiştirme maliyeti yüzünden savunmacı önce kaynak tüketebilir
- Portspoof tek iş parçacıklı bir
epoll olay döngüsü kullanır
- Her porta başlangıçta bir teslim modu atanır
- Bazı portlar anında banner gönderir, bazıları istemci verisinden sonra yanıt verir, bazıları ise sessiz kalır
- Bekletme süreleri onlarca milisaniyeden dakikalara kadar birkaç büyüklük mertebesine dağıtılır
- Her bağlantıda jitter vardır; aynı port tekrar tekrar yoklansa bile aynı zamanlama dönmez
- Bu yaklaşım, tüm portlara rastgele veri gönderip yanıt zamanlamasını ölçen saldırıları zorlaştırır
- Basit bir tarpit birkaç saniye bağlantıyı tutabilirken, gerçek hizmetler yanlış protokole genelde hızla kapanabilir
- Karma modlar ve geniş zamanlama dağılımında binlerce sahte port da gerçek hizmetlere benzer aralıklarda kapanır
- Filtreleme için kullanılabilecek temiz bir eşik kalmaz
Maliyet asimetrisi
- Savunmacı maliyeti, boşta duran bağlantı başına yaklaşık 1~2KB çekirdek belleğidir
epoll döngüsü tek iş parçacıklı olduğundan bağlam değiştirme ek yükü yoktur
- Orta düzey donanım bile 10 binden fazla eşzamanlı bağlantıyı kaldırabilir
- Saldırgan maliyeti zamana ve emeğe kaydırılır
- Yalnızca port taramasıyla tüm portlar açık göründüğü için anlamlı bilgi elde etmek zordur
- Gerçek hizmetleri bulmak için 65535 portun tamamında sürüm tespiti ve makul görünen hedeflerde protokol düzeyinde inceleme gerekir
- 5 saniyelik tarama, 10 saati aşan aktif bir işe dönüşür ve sonuç yine de samanlıkta iğne aramaya benzer
v2.0 değişiklikleri
- v2.0, önceki banner gönderip bağlantıyı kapatma yaklaşımından uzaklaşır
- Önceki yöntem, Vicarius/Hored1971 blog yazısında ele alınan bağlantı kapatma tabanlı atlatmaya karşı savunmasızdı
- Yeni tarpit motoru tüm bağlantıları karma zamanlamayla açık tutar
- Bu yaklaşımın amacı bağlantı kapatma filtrelemesini, zamanlama parmak izini, banner analizini ve istatistiksel desen modellemeyi engellemektir
Kurulum ve temel yapılandırma
- Derleme için bir C++ derleyicisi ve CMake 3.10+ gerekir
- Kaynaktan derleme adımları şöyledir
mkdir build && cd build
cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc ..
make
sudo make install
- Portspoof kullanıcı alanında çalışır, ancak diğer portlara giden trafiği yakalamak için sistem güvenlik duvarı kuralları gerekir
- Varsayılan port 4444'tür; gerçek hizmet portları önce hariç tutulur, ardından kalan TCP trafiği Portspoof'a yönlendirilir
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 22 -j RETURN
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp -j REDIRECT --to-ports 4444
eth0, gerçek ağ arayüzüyle değiştirilmelidir
- Gerçek hizmet çalıştırılan her port için bir
RETURN kuralı eklenmelidir
- Kalıcı uygulama için iptables kurallarını kaydedebilir veya
system_files dizinindeki iptables-config kullanılabilir
- Başlatma betiği için
system_files/init.d/ içindeki örnekler kullanılabilir
Çalışma modları
- Hizmet emülasyonu modu önerilen moddur
- Port tarayıcılarına iletilmek üzere sahte hizmet imzaları üretir
portspoof -c /etc/portspoof.conf -s /etc/portspoof_signatures -D
- Özel tarpit zamanlaması
-t ve -T ile belirtilir
- Örnekte her bağlantı 10~60 saniye boyunca açık tutulur
portspoof -s /etc/portspoof_signatures -t 10 -T 60 -D
- Open Port Mode, hizmet banner'ı olmadan tüm bağlantı denemelerine yalnızca
OPEN durumu döndürür
- Bağlantılar yine de tarpit işlemine tabi tutulur
portspoof -D
- Fuzzing Mode, tarama araçlarına rastgele veya wordlist tabanlı payload'lar göndermek için kullanılabilir
portspoof -1 -v
portspoof -f payloads.txt -v
iptables tabanlı güçlendirme
- Yalnızca temel
REDIRECT kuralıyla da çalışır, ancak saldırgan tarayıcılar bağlantı sayısıyla Portspoof'u zorlayabilir
- Güçlendirme kuralları hız sınırlama ve otomatik engelleme ekler
- Gerçek hizmet portları yönlendirmeden hariç tutulur
- Örnekte SSH portu 22 hariç tutulur
- Genel engelleme kuralı gerçek hizmetlere de uygulanır
- Kural örneği şu öğeleri içerir
- Loopback'e izin verme
PORTSCAN olarak işaretlenen IP'leri 60 saniye boyunca düşürme
- Kaynak IP başına saniyede 10 yeni SYN ve 30 burst sınırını aşanı düşürme
- Tek bir IP, Portspoof portu 4444 üzerinde 100'den fazla bağlantı tutarsa işaretleyip düşürme
- established/related trafik ile yeni SYN'e izin verip kalanı düşürme
- Yüksek trafikli dağıtımlarda
xt_recent liste boyutu artırılabilir
echo "options xt_recent ip_list_tot=10000" > /etc/modprobe.d/xt_recent.conf
- Çekirdek bağlantı takibi ve backlog ile ilgili ayarlar da düzenlenebilir
sysctl -w net.netfilter.nf_conntrack_max=131072
sysctl -w net.core.somaxconn=4096
Portspoof Pro
- Portspoof Pro, deception yaklaşımını tek ana makine yerine tüm ağ düzeyine genişletir
- Tek bir sensör, tüm
/16 ağı emüle eder
- Binlerce IP sunar
- Her IP, tüm portlarda benzersiz hizmetlere sahiptir
- Durum bilgili çok aşamalı diyalogları sürdürür
- Ağ genelinde deception yetenekleri sağlar
- Dark IP alanını ve kullanılmayan alt ağları aktif bir deception grid'ine dönüştürür
- Emüle edilen her ana makine, kaynak IP'ye göre farklı karakterde benzersiz hizmetler sunar
- Etkin tarpit, saldırganın soket havuzunu tüketir ve otomasyon araçlarını throttling eder
- Tarama tespiti ve araç parmak izi çıkarımını destekler
- SYN, FIN, NULL, XMAS, ACK tarama tekniklerini tespit eder
- Nmap, Masscan, ZMap ve özel tarayıcıların parmak izini çıkarır
- MITRE ATT&CK eşlemesi içeren yapılandırılmış JSON telemetrisini SIEM'e akıtır
- Operasyonel ortam dağıtımı düşünülerek tasarlanmıştır
- Üretim trafiğinin yanında sandbox bir ortamda çalışır
- Yönlendirme politikaları deception trafiğini sensöre gönderir
- Inline tap gerektirmediği ve gerçek iş yükü için risk oluşturmadığı belirtilir
- NIS2, DORA, ISO 27001, NIST CSF ve CIS Controls uyumluluğunu destekler
Lisans ve sorun bildirimi
- Portspoof GNU GPLv2 lisansını kullanır
- Ticari ve yasal uygulamalar için uygun lisans görüşmesi amacıyla yazarla iletişime geçilmesi önerilir
- Hata ve özellik istekleri GitHub Issue Tracker veya e-posta üzerinden bildirilebilir
1 yorum
Hacker News yorumları
Port sayısı 65536’dır; port 0 da bazı işletim sistemlerinde internetten erişilebilen bir servis çalıştırılabilecek bir porttur.
Ayrıca MariaDB geliştiricileri görürse: internete erişimi engellemek için veritabanının port 0 üzerinde dinlemesini sağlayan varsayılan ayar, pratikte oldukça fazla sistemde DB’nin internet erişimini engellemez.
if (mysqld_port),mysqld_portdeğerinin 0’dan farklı olduğu anlamına gelir ve en azından MariaDB 5.5’ten beri var olan bir davranış gibi görünüyor.Bilgisayar güvenliği eninde sonunda yukarıdakine benzer aktif savunma biçimleriyle evrilmeye devam etmek zorunda gibi görünüyor.
Bağışıklık sisteminin ne kadar karmaşık ve çok katmanlı olduğuna bakınca, bir gün bilgisayarların ya da ağların da ona benzer bir hâl alacağını düşünüyorum.
Bir gün IT de yeterince yerleşik ve ustalaşmış bir alan olacak, ama bugün o gün değil.
Yine de bu yönleri de dahil edince, aksine endişe verici paralellikler de görülebiliyor.
E-posta toplayan spambots’ları engellemek için, sonsuz sayıda rastgele e-posta adresi üreten bir web sayfası yapmıştım: http://web.archive.org/web/20020610054821/http://www.sourtim...
Böyle bir şeyi çalıştırırsanız, biri makinenizi tarayıp “X’in bilinen açık içeren sürümü çalışıyor” diyerek size onlarca bug bounty talebi gönderebilir.
90’ların ortasında CyberCop Sting adlı bir honeypot ürünü vardı ve Secure Networks’ün Ballista’sından önce geliyordu.
CyberCop Sting, çeşitli implementasyonların TCP/UDP servislerini simüle edebiliyordu; yanlış hatırlamıyorsam farklı işletim sistemleri gibi görünmesi için TCP/IP stack davranışı da yapılandırılabiliyordu. Neredeyse 30 yıl öncesi için oldukça yenilikçi özelliklerdi.
[1] https://theswissbay.ch/pdf/Gentoomen%20Library/Security/0321...
[2] https://news.ycombinator.com/item?id=26440139
Elbette birilerinin yapmış olabileceği bir şey, ama daha önce hiç aklıma gelmemiş olması biraz şaşırtıcı; bu fikri ilk kez duyuyor olmam daha da şaşırtıcı.
Böyle yapmak sonunda hacker’ların ya da bot’ların sunucuya daha ayrıntılı bakmasına veya en azından daha fazla trafik çekmesine yol açmaz mı diye düşünüyorum.
Çoğu script kiddie’nin kendi araçlarında olası honeypot’ları ya da bu tür düzenekleri filtrelediğini sanmıyorum.
Ama host’un canlı olduğu anlaşıldıktan sonra sorun hangi porta dokunulacağı. Her sunucudaki her portu taramanın ya da saldırmanın maliyetinin benzer olduğunu varsayarsak, spoof edilmiş portları ayırt edebilseniz bile başarı olasılığı daha yüksek başka makineler aramak daha mantıklı. Yanıt verisini veya zamanlama farklarını karşılaştırmak için yerel 127.0.0.35 üzerinde portspoof çalıştırılabilir; ama arama alanı, normalde açık olan birkaç porta kıyasla bir anda yaklaşık 5000 kat büyür ve başka sunucuların portları daha yüksek başarı ihtimali sunuyor gibi görünebilir.
Çoğu araç, tüm portların açık olup false positive ürettiği durumu hesaba katmaz. Penetrasyon testlerinde bu yaygın bir durumdur ve zaman kaybettirir; ama saldırgana altyapımı daha fazla incelemek için sebep vermek istemem. Bunun neredeyse tam tersi olan port knocking’i tercih ederim.
Geniş çaplı saldırılara karşı bir miktar etkili olabilmesi için on milyonlarca host’a dağıtılması gerekir; ancak o zaman saldırganın yalnızca honeypot’ları bulup onlarla etkileşime girmesi pratik olmaktan çıkar. Belirli bir hedefli saldırı altındaysanız, honeypot portlarını exploit etmeye çalışırken biraz gecikebilirler; ama açık içeren bir servis çalıştırıyorsanız eninde sonunda içeri girerler. Ayrıca bir tedarikçiyseniz, potansiyel müşterinin güvenlik ekibi tarama yaptığında çok can sıkıcı güvenlik anketlerine yanıt vermek zorunda kalabilirsiniz.
Benim web sitemde de benzer bir şey yapıyorum. https://bini.wales tüm endpoint’lere 200 döndürüyor ve tüm denemeleri kaydediyor; bu da otomatik saldırılar için fena olmayan bir honeypot oluyor
Çoğunlukla savunmasız WordPress eklentilerini ya da geride bırakılmış backdoor’ları toplu tarayan şeyleri yakalıyor. Benzer şekilde https://varun.ch/login de küçük bir ters köşesi olan bir WordPress sitesini taklit ediyor
Güzel. “Honeypot” kelimesinin bir kez bile geçmemesine sevindim
Bir zamanlar “gerçek” bir honeypot devralıp baktığımda yaklaşık 30 portun açık olduğunu gördüm ve gerçekten ağzımdan “bu ne biçim çöp” diye çıktı
Portları açık bırakarak script kiddie’nin bir şeye eriştiğini sanıp heyecanlanmasını sağlıyor, ama aslında ortada hiçbir şey yok. Kilitli bir honeypot o noktada pek honeypot gibi gelmiyor
Honeypot’lar saldırganları cezbetmek ve tespit etmek için kullanılır; genelde davranışlarını ve kalıplarını kaydedip analiz eder veya engeller. Bu araçta iptables dışında daha fazla loglama olsa iyi olurdu; tek başına honeypot değil, ama fikir çok da uzak değil. Ancak GitHub sayfasının bunun “OS güvenliğini artırdığı” iddiası bana hiç inandırıcı gelmiyor. Otomatik servis tarayıcılarına karşı biraz obfuscation sağlar, ama MySQL sunucusu 3306’da dinliyorsa ve saldırgan 3306’ya bağlanırsa hâlâ MySQL ile konuşur. Kalan 65534 portun çöp yanıtlar üretip üretmemesi fark etmez
“Çalışan her instance yalnızca bir TCP portuna bind eder” denmiş; bunun nasıl çalıştığını merak ediyorum
Tüm portları kapsamak için 65535 instance mı çalıştırmak gerekiyor?
Ardından özgün portun ne olduğunu öğrenmek için
getsockoptçağrılıyor: https://github.com/drk1wi/portspoof/blob/c3f3c34531c59df229e...Gerçek hard limitleri ya da bellek kullanımını bilmiyorum ama muhtemelen port yönlendirme daha basittir
Bu potansiyel olarak bir DoS yükselteci olabilir mi?
Uygun şekilde sahte kaynaklı paketler göndererek görünen kaynak adrese çok sayıda paket geri döndürmek mümkün mü?
UDP olsaydı gerçekten saçma bir durum olurdu