Bilginin Adresi Ana Sayfa
Forum Anasayfası Forum Anasayfası > Bilgisayar Güvenliği / Computer Security > Güvenlik / Security Makaleleri
  Aktif Konular Aktif Konular RSS - Port Knocking  Girmeden Önce Kapıyı Çalmak
  SSS SSS  Forumu Ara   Events   Kayıt Ol Kayıt Ol  GiriÅŸ GiriÅŸ

Port Knocking Girmeden Önce Kapıyı Çalmak

 Yanıt Yaz Yanıt Yaz
Yazar
Mesaj
megabros Açılır Kutu Gör
Security Professional
Security Professional
Simge

Kayıt Tarihi: 08-06-2009
Konum: Turkey
Status: Aktif DeÄŸil
Points: 752
Mesaj Seçenekleri Mesaj Seçenekleri   Thanks (0) Thanks(0)   Alıntı megabros Alıntı  Yanıt YazCevapla Mesajın Direkt Linki Konu: Port Knocking Girmeden Önce Kapıyı Çalmak
    Gönderim Zamanı: 23-08-2009 Saat 13:10

Bu yazıda, kapalı ağ kapılarına önceden belirlenmiş bir şekilde bağlanmaya çalışarak ateş duvarında istenen ağ kapılarını açmaya yönelik bir yöntem olan port knocking (kapı çalmak) yöntemi açıklanacak ve örnek bir Linux kurulumu gösterilecektir.

Kapı çalmak metaforu, günlük hayatta kullanılan, kapının çalınma şekline göre kimin çaldığını ayırdetmek ve farklı tepki göstermek (yanıt vermemek ya da kapıyı açmak) şeklinde gelişen iletişim biçimine gönderme yapmaktadır. Buna benzer bir şekilde, kapıyı çalan ve kapıyı dinleyen iki uygulamadan yararlanarak kurulan bir sistemde, ağ kapıları sadece bilinen istemcilerin erişimine açılabilir ve böylece özellikle sadece yönetim amacıyla uzaktan erişime açık bırakılması gereken servislerin (ssh, ftp, tftp, v.b.) denetlenmesi sağlanarak kapı taraması (port scanning) saldırılarından kısmen korunulabilir.

Yöntem

Kapının çalınma yöntemi basit bir şekilde sırayla birkaç kapıya bağlanılmasından, zamana bağlı, gelen IP adresine bağlı veya şifrelenmiş veri gönderilmesine kadar değişebilir. Bu yazıda, en basit kapı çalma şekli olan, sırayla birden fazla kapıya bağlanılması yöntemi örnek olarak verilecektir. Diğer yöntemler hakkında detaylı bilgi, artı ve eksileri, yazının sonunda verilen göndermelerden edinilebilir.
Örnek bir senaryoda, istemcinin belli bir sırayla kapalı kapılara bağlanması sonucunda (sırayla 1111/tcp, 3333/udp, 5555/tcp) sunucunun ateş duvarı kurallarını değiştirerek ssh/tcp kapısını açması düşünülebilir. Sunucu gelen bağlantıları dinlemek için bağlantı katmanında işlem yaptığı için 1111, 3333 ve 5555 kapılarının açık olmasına gerek yoktur. Bağlanılabilecek olası 65535 kapı ve bunların her birinin tcp ve udp olasılıkları olduğundan, saldırganın doğru sırayı bilmesi olasılığı kabaca 1/(65535*2)3‘tür. Bu da en kötü durumda 2,251,696,736,043,000 farklı kombinasyon denemesi gerektiği anlamına gelir.


Doğru kapı çalınma bağlantısını dinleyen sunucu, genellikle aradaki iletişimin halini kaydeder (stateful), böylece kapı tarama programlarının tesadüf eseri doğru sırayı tutturmaları engellenmiş olur.
Sunucu hizmetinin bağlantı kapısının tamamen kapalı olması, kapı tarama saldırılarını engellediği kadar, dolaylı olarak kaba kuvvet (brute force) saldırılarını da engeller.

Örneği verilen basit bir sıraya dayanan kapı çalma yönteminin, üstte belirtilen yararlarının yanı sıra, bazı zayıf yönleri de vardır. En başta saldırganın sırayı tahmin etmesini engellemek için sunucunun istemciyi belirlemek için DNS sorgulama yapması engellenmelidir. Aksi takdirde, özel ayarlanmış bir DNS sunucusu yardımıyla saldırganın bağlanılacak kapıları ve sıralarını tahmin etmesi olasıdır. Bu olmasa bile, kapalı görünen bir kapıya bağlanma durumunda sunucunun bağlananı belirlemek için DNS sorgusu yapması sonucunda yine kapının aslında açık fakat filtrelenmiş olduğu bilgisi sızabilir. Ayrıca gerek istemci tarafındaki, gerek sunucu tarafındaki, gerekse aradaki ateş duvarlarının çoğu kapıya erişimi sınırlandırması, kapı çalma etkinliğinin her ağda uygulanabilirliğini azaltmaktadır.

knockd – Bir Kapı Çalma Uygulaması

Kurulum kolaylığı ve kullanım eksikliği açısından uygun olarak tanımlanabilecek bir kapı çalma sunucusu/istemcisi olarak knockd örnek verilebilir. Yazılımın web sayfasına http://www.zeroflux.org/cgi-bin/cvstrac.cgi/knock/wiki adresinden erişmek mümkündür. Sayfalarda kullanım açıklamalarının yanısıra, bir kaç Unix için hazır paketlerine ve Windows/OSX için istemci programları için bağlantılar bulunmaktadır.
Eğer sunucu tarafında Debian ya da Redhat ailesinden bir Linux dağıtımı kuruluysa, hazır paketler bulunmaktadır. Debian serisi dağıtımlarda

$ sudo aptitude install knockd

komutu yeterlidir. Redhat serisi dağıtımlar içinse programın sayfasından .rpm (kaynak rpm dosyasıdır) dosyası indirilmeli ve

$ su -
# rpm -i knock-*.src.rpm
# cd /usr/src/redhat/SPECS/
# rpmbuild -bb knock.spec
# rpm -i /usr/src/redhat/RPMS/i386/knock-server-*.rpm
komutlarıyla kurulum yapılmalıdır.
 
İstemci için Debian serisi dağıtımlarda yapılacak olan, sunucu ve istemci programlarının aynı pakette bulunmasından dolayı, sunucuyla aynıdır. Redhat serisinde yapılması gereken ise sunucu tarafında yapılması gerekenden son satırda ayrılmaktadır. Yani kaynak rpm dosyasından ikili rpm’ler yaratıldıktan sonra
# rpm -i /usr/src/redhat/RPMS/i386/knock-server-[0-9]*.rpm
komutu verilmelidir. Windows ve OSX istemcileri de programın web sayfasından edinilebilir.

 İstemci tarafında programın derlenememesi, edinilememesi gibi sorunlar olduğunda, hping, netcat gibi genel amaçlı programlar da kullanılabilir. Bunlara örnekler aşağıda verilecektir.
 
Kurulumdan sonra yapılandırma gerektiren dosyalar /etc/knockd.conf dosyası ile dağıtıma özel seçenek dosyasıdır. Dağıtıma özel dosya Redhat serisinde /etc/sysconfig/knockd , Debian serisinde ise /etc/default/knockd dosyalarıdır. Dosyaların varsayılan içerikleri aşağıda verilmiştir, dosyaların özelleştirilmesi yazının devamında anlatılacaktır:

/etc/knockd.conf:

[options]
logfile = /var/log/knockd.log

[openSSH]
sequence    = 7000,8000,9000
seq_timeout = 5
command     = /sbin/iptables -A INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags    = syn

[closeSSH]
sequence    = 9000,8000,7000
seq_timeout = 5
command     = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags    = syn

/etc/default/knockd:

################################################
#
# knockd’s default file, for generic sys config
#
################################################

# control if we start knockd at init or not
# 1 = start
# anything else = don’t start
START_KNOCKD=0

# command line options
#KNOCKD_OPTS=”-i eth0″

/etc/sysconfig/knockd:

#OPTIONS=”"

Uygulama

Uygulamanın kolaylığı ve açıklığından dolayı, örnek senaryoda sunucuda, varsayılan şekliyle bağlantıları kabul eden fakat belli kapıları sınırlayan bir ateş duvarı, ssh sunucusu ve knock sunucusu kurulu olduğu, istemcide ise knock ve ssh istemcilerinin kurulu olduğu varsayılacaktır.

Sunucunun Ayarlanması

knockd sunucusunun dinleyeceği ağ arabiriminin belirtilmesi için aşağıdaki dosyalar düzenlenmelidir:

/etc/default/knockd (debian):

KNOCKD_OPTS=”-i eth0″

/etc/sysconfig/knockd (redhat):

OPTIONS=”-i eth0″

Sunucunun her sistem açılışında çalışması için, Redhat serisi dağıtımlarda
# chkconfig –level 345 knockd on
komutu verilmeli, debian serisi dağıtımlar içinse /etc/default/knockd dosyasına aşağıdaki satır eklenmeli, ya da varolan satır değiştirilmelidir:
START_KNOCKD=1
Bunun dışında, ateş duvarının en baştan ssh/tcp kapısına bağlantıyı kabul etmediğini varsayıyoruz:

# /sbin/iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
REJECT     tcp  –  0.0.0.0/0            0.0.0.0/0           tcp dpt:22 reject-with icmp-port-unreachable

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Eğer durum böyle değilse, engelleme kipini aşağıdaki komutu vererek ayarlayabiliriz:

# iptables -A INPUT -p tcp -m tcp –dport 22 -j REJECT –reject-with icmp-port-unreachable

Sunucunun ne tür bağlantılara yanıt vereceği, /etc/knockd.conf dosyasında belirtilmektedir. Buradaki tüm kullanımlar sunucunun web sayfasında listelenmektedir. Örneğin özelinde kullanılacak dosyanın içeriği aşağıdaki gibidir:

/etc/knockd.conf:

[options]
UseSyslog

[openSSH]
sequence    = 1111:tcp,3333:udp,5555:tcp
seq_timeout = 10
tcpflags    = syn
command     = /sbin/iptables -I INPUT -s %IP% -p tcp –dport 22 -j ACCEPT

[closeSSH]
sequence    = 5555:tcp,3333:udp,1111:tcp
seq_timeout = 10
tcpflags    = syn
command     = /sbin/iptables -D INPUT -s %IP% -p tcp –dport 22 -j ACCEPT

Bu ayarları kullanarak, istemcinin 1111/tcp, 3333/udp, 5555/tcp kapılarını en fazla 10 saniye aralıkla çalması sonucunda erişimine izin vermesi, 5555/tcp, 3333/udp, 1111/tcp kapılarını aynı şekilde çalması sonucundaysa erişimin kapatılması sağlanmakta, ayrıca kayıtların da syslog sunucusuna gönderilmesi istenmektedir.
Bu ayarlar da yapıldıktan sonra /etc/init.d/knockd start komutuyla sunucu çalıştırılabilir.

İstemcinin kullanılması

Deneme amacıyla ssh kullanarak sunucuya bağlanılması gerektiğinde
$ ssh deneme.host
ssh: connect to host deneme.host port 22: Connection refused
hatası alınacaktır. Bu durumda kapı çalma sırasını uygulamak gerekir:
$ knock -v deneme.host 1111:tcp 3333:udp 5555:tcp
hitting tcp 10.0.1.1:1111
hitting udp 10.0.1.1:3333
hitting tcp 10.0.1.1:5555
yeniden ssh kullanarak bağlantı denendiğinde, bu sefer bağlantı başarılı olacaktır. İhtiyaç kalmadıktan sonra kapıyı geri kapamak içinse
$ knock -v deneme.host 5555:tcp 3333:udp 1111:tcp
hitting tcp 10.0.1.1:5555
hitting udp 10.0.1.1:3333
hitting tcp 10.0.1.1:1111
komutu kullanılabilir. knock istemcisinin erişilebilir olmadığı durumlarda netcat ya da hping kullanılabilir. Örneğin hping3 kullanarak kapıyı açmak şu komutlarla mümkündür:
$ hping3 deneme.host -p 1111 -c 1
$ hping3 deneme.host -2 -p 3333 -c 1
$ hping3 deneme.host -p 5555 -c 1
Bu komutlar bir betik dosyasına yazılarak, knock istemcisiyle aynı etkide kullanılabilir.

knockd Sunucusunun Potansiyel Farklı Kullanımları

Dikkat edilirse, yapılandırma dosyasında command seçeneği ile verilen, kapı çalınması sonucunda çalıştırılacak komut, sadece kapı açıp kapayan bir komut değil, herhangi bir komut olabilir. Bu şekilde bir kapıyı, kapıları tamamen kapatmak, sunucu servislerini başlatıp durdurmak, hatta sistemi yeniden başlatmak mümkündür. Ayrıca bu yazılıma benzer yazılımlar, çoğu zaman kötü niyetli kullanıcılar tarafından ele geçirilen bilgisayarlarda isteğe göre arka kapı açmak için de kullanılmaktadırlar.

Sonuç

Kapı çalma yöntemi, açık olmaması gereken kapıları kapalı bırakarak güvenlik politikalarında ilgilenilmesi gereken istisnaları azaltmaya yardımcı olabilecek bir yöntemdir. Bu yöntem sayesinde bir kaç popüler saldırı yöntemine karşı da önlem alınmış olmaktadır. Bu yazıda basit bir örnekle incelenmiş olmakla birlikte, uygulamacının hayal gücüne bağlı olarak çok çeşitli kapı çalma yöntemleri uygulanarak aradaki iletişimin güvenliği artırılabilir. Göz önünde bulunan ve sürekli kötü niyetli kaynaklardan kaba kuvvet saldırılarına maruz kalan sunucular için, rahatlatıcı bir önlem olarak düşünülebilir.

Saygılar..


Düzenleyen megabros - 23-08-2009 Saat 14:00
Yukarı Dön
 Yanıt Yaz Yanıt Yaz

Forum Atla Forum İzinleri Açılır Kutu Gör



Bu Sayfa 0.158 Saniyede Yüklendi.