Saldırı tespit sistemlerini altetmek
Bu yazı bir IDS sistemine yakalanmadan port taraması yapmayı mümkün kılacak bazı fikirler sunacaktır. Ayrıca bir güvenlik duvarını kandırma ve sahip olunan avantajlardan bahsedilecek. Orjinali: SnakeByte
Bu yazı TCP/IP yada diğer altseviye protokoller hakkında değil fakat amaca ulaşmada kullanılabilecek yüksek seviye protokoller ile ilgili. Bazı perl kaynak kodları sunacağım ve karşı önlemlerden bahsedeceğim.
Buna kafayı, ilk olarak bir hosta TCP tam bağlantı taraması yaparken gerçek IP`min ortaya çıkmaması için mümkün olabilecek yollar düşünürken taktım. Her sistemde kolayca çalışabilmeli, bazı windows ve unix sistemlerde root hakları
gerektiren raw IP paketleri yaratmaya gerek olmamalı. O yüzden istenen bilgiyi elde etmek için bir ftp sunucusu kullanan ftp sıçrama taraması (bounce scan) gibi olmalı.
Ftp protokolü bir ftp sunucuya bağlanıp onun bizim bilgisayarımıza bağlanmasını sağlamamıza izin verir, böylece sunucuyu size bağlanmaya zorlarsınız. Bununla her port`a bağlanmak mümkün olduğundan ftp`den aldığımız cevabı analiz ederek bir port`un açık olup olmadığını anlayabiliriz. Tarama önce PORT komutu ile IP ve port belirleyerek ve sonrada (bir list yada get isteği yaparak) transferi başlatarak yapılır. Eğer bir '425 Can`t build data connection: Connection refused' mesajı alıyorsak portun kapalı olduğunu anlıyoruz. 150 ve 226 cevapları bize açık bir port`a bağlanmaya kalktığımızı söyler. Bu tip bir tarama yapmak için nmap`i (http://www.insecure.org/nmap) -b seçeneği ile kullanabilirsiniz.
Fakat günümüzde çoğu ftp sunucusu bu tip bir taramaya izin vermiyor. Diğer taraftaki port`un gerçekten bir ftp istemcisi olup olmadığını kontrol ediyor ve eğer değilse port kapalı olduğunda gönderilen mesajın aynısını gönderiyor. Bu yüzden
farklı metodlar yaratmalı.
Bir host`un portlarını bu şekilde taramanın bir başka büyük dezavantajı var. Tararken saldırganın banner bilgilerini almasına izin vermez. Banner bilgisi çalışan daemon`lar hakkında bilgi toplamak ve onları otomatik exploit edecek araçlar
yaratırken yararlı olabilir. Buna ek olarak TCP tam başlantı port taraması tüm Saldırı Tespit Sistemleri tarafından kolaylıkla yakalanır.
Bu yüzden aklıma ilk gelen bir proxy kullanmakdı. Proxy kullanımı dahili ağdan başka bir ağa bağlanırken IP`leri gizlemek için genel bir yoldur. Pek çok socks proxy ücretsiz olarak sağlanabilir ve IRC savaşlarında clone`lar için ve diğer şeyler
için sıklıkla kullanılmaktadır.
Bende socks 4 veya 5 sunucusuna bağlandıktan sonra hedef makineye bağlanmaya çalışan bir perl script yazdım. Eğer hata dönüyorsa bunun kapalı bir port olduğunu anlıyoruz. Eğer bir bağlantı kuruluyorsa açık port olduğunu anlıyor ve banner`ı
alabiliyoruz.
#!/usr/bin/perl## Kullanımı:## sockscan.pl <SOCKS-PROXY> <SOCKSPORT> <HEDEF> <BAŞLANGIÇPORTU> <BİTİŞPORTU>### SnakeByte [<mail to="SnakeByte@kryptocrew.de" subject="" text="SnakeByte@kryptocrew.de" />] tarafından yazılmıştır.#
www.kryptocrew.de/snakebyte/#use Net::SOCKS;if (@ARGV <5) {print '\nThis tool performs a portscan on a host,\n';print 'over a socks proxy to hide your IP\n';print 'and to make it possible, to see ports, which\n';print 'are blocked to certain IP Ranges\n';print 'written by SnakeByte [Snakebyte\@kryptocrew.de]\n\n';print 'Usage : \n';print 'sockscan <SOCKS-PROXY> <SOCKSPORT> <HEDEF> <BAŞLANGIÇPORTU> <BİTİŞPORTU>\n\n';exit;}print 'sockscan by SnakeByte [ Snakebyte\@kryptocrew.de ]\n';$proxy = @ARGV[0];$proxyport = @ARGV[1];$target = @ARGV[2];$startport = @ARGV[3];$endport = @ARGV[4];print 'scanning $target ...\n';my $sock = new Net::SOCKS(socks_addr => $proxy, socks_port => $proxyport, # user_id => $ID, # user_password => $pass, protocol_version => 4);for ($i = $startport;$i<=$endport;$i++){$f = $sock->connect(peer_addr => $target, peer_port => $i);if ($sock->param(`status_num`) == SOCKS_OKAY) {print '---- Port $i open ! ----\n';# here we could easily retrieve a banner}$sock->close();}print '\nScan finished..\n';
Bir makineyi diğer bir IP`den tarayarak saldırgan socks proxy kullanımı ile güvenlik duvarını aşabilir. Eğer proxy imtiyazlı bir IP menzili içerisindeyse güvenlik duvarı geçmemize izin verecektir. Ayrıca proxy`nin kendisini loopback IP adresi (127.0.0.1) kullanarak taratmak da mümkündür ki bu da yerel güvenlik duvarı ayarlarının çoğunu aşmamızı sağlar. Bu tüm socks proxy`ler ile çalışmaz çünkü bazılarının loopback IP`ye ve dahili IP`lerine bağlantıları yasaklayacak ayarları vardır.
Bu bir host`u anonim olarak taramak için yararlı. Fakat bunu IDS`leri aşmada nasıl kullanabiliriz? Çoğu Saldırı Tespit Sistemi belirli bir IP`den farklı port`lara belirli bir süre içerisinde yapılan istekleri izler. Web sayfalarından düzinelerce, hatta yüzlerce
socks proxy bulunabilir, bu sebeple script`imizi her farklı port için farklı sock proxy kullanacak şekilde değiştirelim. IDS sistemi bağlantılar farklı IP`lerden geldiği için taramayı log`lamayacaktır. Bu bir saldırganın farklı sistemlere truva (trojan) kurmadan dağıtık tarama yapabilmesini sağlar.
Bu tip bir tarama tekniğinin normal, dağıtık-olmayan bir taramaya avantajı nedir?
Hedef makinada tek bir port`a bağlanmanızı Saldırı Tespit sistemi saldırı olarak algılamayacaktır ve karşılığında işlem yapmayacaktır. Fakat kısa süre içinde farklı portlara bağlanırsanız IDS bunun bir port taraması olduğunu bilecektir. İşte bizim burda yapmaya çalıştığımız her host`un hedef makinada tek yada bir iki port`a bağlanması ve IDS`in saldırıyı algılamaması. Her host listeden tekrar seçildiklerinde
tekrar bir port`a bağlanmadan önce belirli bir süre bekliyor.
#!/usr/bin/perl## Kullanım :## sockscan2.pl <SOCKSDOSYASI> <HEDEF> <BAŞLANGIÇPORTU> <BİTİŞPORTU>## SnakeByte [<mail to="SnakeByte@kryptocrew.de" subject="" text="SnakeByte@kryptocrew.de" />] tarafından yazılmıştır.#
www.kryptocrew.de/snakebyte/#use Net::SOCKS;if (@ARGV != 4){print '\nThis tool performs a portscan on a host,\n';print 'over a socks proxy to hide your IP\n';print 'and to make it possible, to see ports, which\n';print 'are blocked to certain IP Ranges\n';print 'written by SnakeByte [Snakebyte\@kryptocrew.de]\n\n';print 'Usage : \n';print 'sockscan2 <SOCKSDOSYASI> <HEDEF> <BAŞLANGIÇPORTU> <BİTİŞPORTU>\n\n';exit;}print 'sockscan2 by SnakeByte [ SnakeByte\@kryptocrew.de ]\n';$proxyfile = @ARGV[0];$target = @ARGV[1];$startport = @ARGV[2];$endport = @ARGV[3];print 'scanning $target ...\n';open(FILE, '<$proxyfile');@proxylist=<FILE>;close FILE;$a =-1;for($i=$startport;$i<=$endport;$i++){$a++;if( $a<=(@proxylist)){ $a = 0; }($proxy,$proxyport)=split(':',@proxylist[$a]);my $sock = new Net::SOCKS(socks_addr=>$proxy, socks_port=>$proxyport, protocol_version=>4);$f=$sock->connect(peer_addr=>$target,peer_port=>$i);if($s oc k->param(`status_num`)== SOCKS_OKAY){print '---- Port $i open ! ----\n';}$sock->close();}print '\nScan finished..\n';
Örnek bir proxy listesi aşağıdaki gibidir:
host1.com:1080
host2.com:1080
host3.com:1080
Gördüğünüz gibi bu teknik ile bir dağıtık tarama yapmak çok kolay ve tabi ki çok yavaş fakat farklı thread`ler ile bir kerede birden fazla socks proxy`ye bağlanma gerçekleştirilebilir.
Fakat o zaman da çok hızlı tekrar etmemeleri için fazla sayıda proxy listesine ihtiyacınız olur. Bu şekilde IDS sistemler kandırılabilir fakat bu tarama kişinin kendi PC`sinden yapılmamalı çünkü bir proxy loglama işlemi gerçekleştiriyor olabilir ve sistem yöneticisi bu bilgi ile taramanın kaynağını bulabilir.
Bu tip bilgi edinmek için sadece socks proxy`ler yoktur. Aynı şekilde Wingate proxy`leride kullanabiliriz. Yine internette herkese açık olan wingate`lerin listesini bulabiliriz ve çoğunun yöneticisi bir şifre set etmeyecek kadar tembeldir. Bu da
onları port taramalarında kullanabilmemizi sağlar.
#!/usr/bin/perl### Bu script Wingate 4 ile test edilmiştir ve# bir wingate telnet proxy üzerinden portscan yaparuse IO:Socket;$proxy='192.74.53.1'; #wingate (telnet proxy)$proxyport='23'; #port$target='192.74.53.2'; #hedef makine$StartPort=1; #tarayacağımız port menzili$EndPort=100;for($targetport=$StartPort;$ta rgetport<=$EndPort;$targetport++){print('Port $targetport..');$s=IO::Socket::INET->new(PeerAddr=>$proxy, PeerPort=>$proxyport, Proto=>'tcp') || die 'wingate down..\n';$send='$target:$targetport\n';print $s '$send';$a=' ' ;read $s, $a, 85;if ($a =~ 'Connected' ){print ' open !\n';#print '$a\n';} else {print ' closed\n';}close $s;}
Aynı şekilde farklı bir proxy`de tarama için kullanılabilir. Sadece yukardaki kaynak kodundaki bir iki değişiklik yapmamız yeterli. HTTP proxy`leride istediğinize bağlanmanıza izin verecektir. Tabiki onlar sayfa yada banner getirildikten hemen
sonra bağlantıyı kapatacaktır. Bu bizim için bir problem değil çünkü biz veri göndermek istemiyoruz, sadece getirmek istiyoruz.
Bunu hedef proxy portuna HTTP GET isteği ile yapıyoruz. Proxy bu port`a bağlanacak ve eğer port kapalıysa '503 - Service unavailable' hatası dönecektir.
Eğer port açık ise bağlanacak ve bize dinleyen sunucunun cevabını dönecektir.
Burdaki problem, proxy kendi bağlantısını kapatmayacaktır, ve banner`ı görmek istiyorsak proxy`den hedefe olan bağlantının zaman aşımına uğramasını beklemek zorundayız. Eğer banner`ları almak istemiyorsak, işlemleri, (5,10 saniye bekleyip)
503 hatası alıp almadığımıza bakarak, eğer almıyorsak portun açık olduğunu varsayıp bağlantıyı kapayarak hızlandırabiliriz.
#!/usr/bin/perl### Bu script Debian üzerinde Squid 2.2-Stable 5# ile tes edilmiştir ve bir http proxy# üzerinden port taraması gerçekleştirir.#use IO::Socket;$StartPort=1025; #taramak istediğimiz port menzili$End Port=1050;$target='192.74.53.1'; #hedef sistemimiz$proxy='192.74.53.2'; #http proxy$proxyport='8080';for($targetport=$StartPort; $targetport<=$EndPort;$targetport++){print('Port $targetport ...');$s = IO::Socket::INET-> new(PeerAddr=>$proxy, PeerPort=>$proxyport, Proto=>'tcp') || die 'proxy down..\n';$send='GET HTTP:\/\/$target:$targetport\/ HTTP\/1.0\n\n\n\n';print $s '$send';read $s,$a,30;if ($a !~ '503' ) { #proxy`den 503 alıp almadığımızın kontrolüprint ' open !\n';#print '$a\n'; #banner (banner bilgisini görmek için satırın başındaki # i kaldırın} else {print ' closed\n';}close $s;}
Port tarama için Http proxy`leri kullanmadaki tek problem normalde her porta bağlanmanıza izin vermemeleridir. Genelde 80 ve üzerine izin verirler. Bunun en iyi çözümü http proxy`de gerçekten web sunucuya bağlantı olup olmadığını kontrol
eklemektir.
Gördüğünüz gibi olası bir saldırganın bir açık port ve çalışan servis bilgisini edinmek için farklı yöntemleri vardır. Buna ek olarak izin verilen bir IP menzilindeki proxy`yi kullanarak güvenlik duvarını aşmasıda mümkündür.
Bundan korunmak için ne yapılabilir? Tüm proxy protokollerinin bağlanan kullanıcıların kimlik tanılamasını gerektiren seçenekleri vardır. Fakat bu güvenlik ayarları çok sık kullanılmaz.
Saldırı Tespit sistemleri tek IP den gelen taramalara dayanmayacak ve kapalı porta yapılan bağlantı sayılarını kontrol edecek şekilde tekrar ayarlanmalıdır. Benim düşünceme göre dağıtık taramalar çok yaygınlaşacak ve IDS`lerin buna göre yapılandırılması gerekecek.
Burda sunulan araçların hepsi tabiki çok daha geliştirilebilir. Birden fazla thread ile tarama gibi işlemler taramayı hızlandıracaktır. Hedef port`lar ve proxy`ler de rastgele seçilebilir